实验在P172
代码如下
assume cs:codesg,ds:data
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个字符串,都是连续存放的每一个字符占一个字节,共占据84个字节
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型数据,每个数据占据4个字节,共占据84个字节
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11543,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据,每个数据占据2个字节,共占据42个字节
data ends;编程,将data段中数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照一定格式保存在table中。
table segment
db 21 dup ('year summ ne ??')
table ends
codesg segment
start:
mov ax,data
mov ds,ax;ds为data段的段地址
mov ax,table
mov es,ax;es为table段的段地址
mov bx,0
mov di,0
mov cx,21
s0:mov dx,cx
mov cx,4
s:
mov al,ds:[bx]
mov es:[di],al
mov ah,ds:84[bx]
mov es:5[di],ah;di+5的位置写入收入,数据在bx+84中
inc di
inc bx
loop s
mov cx,dx
sub di,4
add di,10h;这两行相当于换行
loop s0;以上代码写入了4字节数据的所有录入,接下来写两个2字节的
mov bx,168
mov di,0ah
mov cx,21
mov si,4;si用于写入空格
s1:
mov al,ds:[bx]
mov es:[di],al
mov ah,ds:1[bx]
mov es:1[di],ah
mov byte ptr es:3[di],3fh
mov byte ptr es:4[di],0;写入问号,问号的ascii码为3f。高位补0
mov byte ptr es:[si],20h
mov byte ptr es:5[si],20h
mov byte ptr es:8[si],20h
mov byte ptr es:11[si],20h;空格写入完成
add si,10h
add di,10h
add bx,2
loop s1
mov ax,4c00h
int 21h
codesg ends
end start
这个调试中有很多问题。现在还存在一些冗余,但可以运行,可读性也很好,画个图一目了然
一定要注意不能用mov 寄存器简介寻址,寄存器间接寻址 的方式传递数据
在数据传输时一定要人为规定它的数据长度,要么通过寄存器名指定长度,要么用操作符 X ptr 指明
这是执行后的table 段中的数据格式,20为空格的ASCII码,?的码是3f