7、实验七
首先查看data段中各个数据的存放位置
076A:0H—076A:53H:存放年份
076A:54H—076A:0A7H:存放收入
076A:0A8H:开始存放雇员数
编写代码如下(https://blog.csdn.net/weixin_45837404/article/details/124482551):
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
;以上为书中给出的代码
stacksg segment
dw 0,0,0,0,0,0,0,0
;开辟栈空间,存放外层循环CX的值
stacksg ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax ;es附加寄存器,存放目标地址
mov bx,0;用于原遍历列
mov di,0;用于table一行写,目标
mov si,0;源
mov cx,21 ;次数21次,是10进制
s: mov al,[bx];默认从ds:[bx]访问,即第一个年份开始的位置,因为是1B,所以用al
mov es:[di],al
mov al,[bx+1]
mov es:[di+1],al
mov al,[bx+2]
mov es:[di+2],al
mov al,[bx+3]
mov es:[di+3],al;依次把年份'1' '9' '7' '5'写入,这边可以用一个loop其实
mov ax,54h[bx] ;因为dd是双字,需要用两个寄存器dx高位 ax低位,这里等价于mov ax,[54h+bx]
mov dx,56h[bx] ;54h是观察data区代表收入的偏移地址起始,低位2字,56h是高位2字
mov es:5h[di],ax
mov es:7h[di],dx ;写入收入
mov ax,0a8h[si];必须加0,因为在汇编里数据不能以字母开头
mov es:0ah[di],ax;写入雇员数
mov ax,54h[bx];就等价于 mov ax,ds:[54h+bx] ax存放被除数低16位,bx存放高16位
div word ptr ds:0a8h[si];因为被除数是双字dd,除数是dw 因此结果是word
mov es:0dh[di],ax;ax存放商,只要这一部分,就相当于取整了
add si,2;用于单字,2B
add bx,4;用于双字,4B
add di,16;用于换行
loop s
mov ax,4c00h
int 21h
codesg ends
end start
编译连接debug
调试至table段地址,查看原始table段内容
程序执行完毕后,再次查看table段内容