50行代码实现《汇编语言》王爽 实验七

志不强者智不达,言不信者行不果。这篇文章主要讲述50行代码实现《汇编语言》王爽 实验七相关的知识,希望能为你提供帮助。
实验七:寻址方式在结构化数据访问中的应用
要求


思路近21年的数据要保存在表格中(我们想像中的表格,其实就是table区域内存),我们尝试用21个loop完成
?根据源数据(data)可得到:
年份数据:每年为4个byte,所以总大小为21*4=84字节,内存偏移区间为0~83(十六进制0~53h)
收入数据:每年为1个double word,双字=4字节,所以总大小为21*4=84字节,内存偏移区间为84~167(十六进制54h~A7h)
雇员数据:每年为1个word,字=2字节,所以总大小为21*2=42字节,内存偏移区间为168~209(十六进制a8h~d1h)
?(注:以上各项的偏移位置的起点在每个loop中会用到)
?根据目标内存区域格式可得到每年的各项数据位置:
每个年份占用整16字节(一行)
年份占4字节,行偏移位置:0~3h
4h为空格
收入占4字节,行偏移位置:5h~8h
9h为空格
雇员占2字节,行偏移位置:ah~bh
ch为空格
待计算的收入占2字节,行偏移位置:dh~eh
fh为结尾空格
?(注:以上各项的偏移位置的起点在每个loop中会用到)?
?寄存器选择:
ds中的数据项因为2个4字节,1个2字节,所以需要2个寄存器(相当于高级语言临时变量)来保存偏移,这里使用bx, si
es中需要1个寄存器,指向每一行就可以 ,这里使用di
代码

assume cs:codesg, es:table, ds:data

data segment
; 21年份的21个字符串
db1975,1976,1977,1978,1979,1980,1981,1982,1983
db1984,1985,1986,1987,1988,1989,1990,1991,1992
db1993,1994,1995

; 21年公司总收入的21个dword型数据
dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

; 21年公司雇员人数的21个word型数据
dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw11542,14430,15257,17800
data ends

table segment
; 引号中的这些为占位符,无意义,也可以用16个空格替换掉
db 21 dup (year summ ne ?? )
table ends

codesg segment
start:
mov ax, data
mov ds, ax
mov ax, table
mov es, ax

; 初始化寄存器
mov bx, 0
mov si, 0
mov di, 0

mov cx, 21
; 处理年份,由于是字符只能按位操作
s:
mov al, ds:[bx]
mov es:[di], al
mov al, ds:[bx+1]
mov es:[di+1h], al
mov al, ds:[bx+2]
mov es:[di+2h], al
mov al, ds:[bx+3]
mov es:[di+3h], al

; 处理雇员
mov ax, ds:[si+0a8h]
mov es:[di+0ah], ax

; 处理收入(放在处理雇员后面,减少一次mov)
mov ax, ds:[bx+54h]
mov dx, ds:[bx+54h+2h]
mov es:[di+5h], ax
mov es:[di+5h+2h], dx

; 计算人均收入
div word ptr es:[di+0ah]
mov es:[di+0dh], ax ; 只保留商

add bx, 4h ; 十进制4也可以
add si, 2h ; 十进制2也可以
add di, 10h ; 十进制16也可以
loop s

mov ax, 4c00h
int 21h
codesg ends
end start

结果
【50行代码实现《汇编语言》王爽 实验七】










    推荐阅读