汇编语言程序设计课程设计.docx

上传人:b****8 文档编号:9856915 上传时间:2023-02-07 格式:DOCX 页数:12 大小:64.74KB
下载 相关 举报
汇编语言程序设计课程设计.docx_第1页
第1页 / 共12页
汇编语言程序设计课程设计.docx_第2页
第2页 / 共12页
汇编语言程序设计课程设计.docx_第3页
第3页 / 共12页
汇编语言程序设计课程设计.docx_第4页
第4页 / 共12页
汇编语言程序设计课程设计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计课程设计.docx

《汇编语言程序设计课程设计.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计课程设计.docx(12页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计课程设计.docx

汇编语言程序设计课程设计

一、实验目得

1、熟练掌握call、ret得原理及应用

2、熟练掌握子程序得框架、进行模块化程序设计

3、掌握参数与结果得传递、批量数据传递等问题得解决方法

二、实验内容及要求

(一)综合程序设计:

利用实验10中得三个子程序,将poweridea公司得数据按照下图所示得格式在屏幕上显示出来,要求计算人均收入并显示出来.

poweridea公司得数据如下:

assumecs:

codesg

datasegment

db ’1975’,’1976',’1977','1978','1979',’1980’,'1981','1982','1983'

db '1984','1985','1986',’1987','1988',’1989’,’1990','1991',’1992'

db’1993',’1994',’1995'

;年份

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

;公司总收入

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw11542,14430,15257,17800

;公司雇员人数

data ends

tablesegment

 db21 dup('year summne?

')

tableends

要求:

(1)给出该设计过程或算法

(2)在代码中必要得地方给出相应注释

(3)最终显示结果。

三、实验解答过程及结果

(1)该题目得第一段db型年份数据就是以字符串储存得,不适合后续得操作,所以先用ice子程序把年份数据转化为word型数据.接下来循环开始,先调用dtoc1子程序,把第一年(1975)得word型年份数据转化为字符串储存在es中,再调用show_str函数在屏幕缓冲区显示出来。

接着调用dtoc2子程序与show_str子程序把第一年得收入在同一行显示出来。

再接着调用dtoc1子程序与show_str子程序把第一年得雇员数在同一行显示出来,最后计算平均收入,同样调用两个子程序显示出来.不停地循环,循环21次,把所有得数据都显示出来,输入程序结果,程序完结。

(2)代码及数据如下:

assumecs:

codesg

datasegment

db’1975’,'1976’,’1977','1978','1979',’1980','1981',’1982',’1983'

db'1984’,'1985',’1986’,'1987’,'1988','1989','1990','1991’,'1992'

 db'1993’,'1994’,’1995’

;年份

 dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

;公司总收入

dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw11542,14430,15257,17800

;公司雇员人数

dataends

table segment

db21dup('yearsumm ne?

')

table ends

stacksegment

db1024 dup(0)

stackends

codesgsegment

start:

movax,data

  movds,ax

   movax,table

mov es,ax

 movax,stack

 movss,ax

  movsp,1024

   movsi,0

  movbx,0

 movdh,5

    movax,1975  ;初始化,dh为输出时得行数

 movcx,21

  so:

call ice  

  push ax

  movax,ds:

[si]

calldtoc1

popax

  push cx

mov dl,1

mov cl,00000111b

  callshow_str

   popcx ;这两段输出年份

push ax

push dx

  movax,ds:

[si+84]

 mov dx,ds:

[si+86]

  calldtoc2

 popdx

    popax

 pushcx

 movdl,8

   mov cl,00000111b 

    call show_str

popcx  ;这两段输出收入

  pushax

movax,ds:

[bx+168]

  calldtoc1

 popax

pushcx

  movdl,18

 movcl,00000111b

callshow_str

popcx   ;这两段输出雇员数

pushax

  pushdx

  movax,[si+84]

  movdx,[si+86]

  divword ptr ds:

[bx+168]

    ;计算人均收入,结果为16位,保存在ax中

 calldtoc1

popdx

  popax

pushcx

  mov dl,26

movcl,00000111b 

 call show_str

 popcx ;这两段输出平均收入

 add si,4

 addbx,2

  incdh

  incax

 loopso    ;循环21次,增加参数

mov ax,4c00h

int21h

;名称:

ice

;功能:

在ds:

si开始,以“数据”“0”得格式用新数据替换旧数据(即年份字符串)

;参数:

(ax)=word型得数据,es:

si指向字符串得首地址

;返回:

;说明:

把字符串得年份转化为word型数据,并以0结尾,方便dtoc1函数得调用

 ice:

pushbx

  movds:

[si],ax

 movbx,0

    movds:

[si+2],bx

  popbx

ret

;名称:

dtoc1

;功能:

将一个word型数转化为字符串,数应不大于65535

;参数:

(ax)=word型得数据,es:

si指向字符串得首地址

;返回:

es:

[si]放此字符串,以0结尾

;说明:

因为ds放了数据段,为免混淆,把字符串放在es里,下面得函数也相同

dtoc1:

pushcx

  pushbx

push dx

 mov dx,0

 pushdi

 push si

 movdi,0

 cir1:

movcx,10

  divcx

 adddx,30h

 movbx,dx

pushbx

  incdi

movdx,0

 movcx,ax

 jcxzow

  jmpshortcir1

 ow:

movcx,di

  s:

pop bx

mov es:

[si],bx

    inc si

loops

  pop si

  pop di

 popdx

 popbx

   pop cx

   ret 

;名称:

dtoc2

;功能:

将一个dword型数转化为字符串,数不应大于FFFFFFFFFFFFFFFF

;参数:

(ax)=dword型得数据得低16位,(dx)=dword型得数据得高16位,es:

si指向字符串得首地址 

;返回:

es:

[si]放此字符串,以0结尾

dtoc2:

pushcx

  pushbx

 push si

  pushdi

   movdi,0

cir2:

movcx,10

 calldivdw

 addcx,30h

 movbx,cx

  pushbx

  incdi

movbx,dx

   addbx,ax

  movcx,bx

jcxzox

  jmpshortcir2

  ox:

movcx,di

 s8:

pop bx

 mov es:

[si],bx

   incsi

loops8

 popdi

  popsi

 popbx

  popcx

 ret

;名称:

divdw

;功能:

除法,被除数32位,除数16位,商32位,余数16位,不会溢出 

;参数:

(dx)=被除数高16位,(ax)=被除数低16位,(cx)=除数 

;返回:

(dx)=商高16位,(ax)=商低16位,(cx)=余数

divdw:

pushbx

 pushax 

 movax,dx

  mov dx,0

div cx

  movbx,ax

 popax

  div cx

movcx,dx

 mov dx,bx

 popbx

 ret

;名称:

show_str

;功能:

在指定得位置,用指定得颜色,显示一个用0结束得字符串

;参数:

(dh)=行号(1~25),(dl)=列号(1~80),(cl)=颜色,es:

si指向字符串得首地址

;返回:

show_str:

push di

   pushsi

 movdi,0

 push ax

  pushdx

  decdh

 decdl    ;这里采用习惯上得叫法,放在显示缓冲区最开头就就是1行1列

  mov al,160 ;1行80个字符,一个字符2个字节

   mul dh

 adddl,dl   ;一个字符2个字节

   movdh,0

 adddx,ax

   add di,dx ;这几行就是为了计算字符串首得偏移地址

    mov ah,cl  ;字符得高位保存属性,低位保存数据

  push cx

change:

movcl,es:

[si]

 mov ch,0

  jcxzok

  mov al,es:

[si]

  push es

  pushax

  movax,0b800h;显示缓冲区得空间为B8000H~BFFFFH

   moves,ax

     popax

   moves:

[di],ax ;输出到缓冲区

   popes

  incsi

   adddi,2

    jmpshortchange

 ok:

popcx

  popdx

 popax

   pop si

    popdi

 ret

codesg ends

endstart

(3)结果如图:

四、实验总结

通过这次实验,我学会了call与ret指令得用法,学会了编写子程序以及调用各个子程序,组成一个大程序。

我发现,汇编得子程序,就跟c语言得函数差不多.在实验得过程中,我学会了编写更加复杂得程序,懂得了更多得汇编知识,在汇编语言得学习上又有了新得进步。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1