; 如果对偏移策略和字节数的计算等问题有疑惑的话,一定是签名的基础打的不够扎实,可以选择回去回顾一下。
assume ds:data, cs:codesg, es:table
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 个字符串 21 * 4 = 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 型数据 21 * 4 = 84字节
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 型数据 42字节
data ends
table segment
db 21 dup (\'year summ ne ?? \')
table ends
stack segment
db 16 dup(0)
stack ends
codesg segment
start:
; table
mov ax,table
mov es,ax
; stack 申明一个 16字节的栈
mov ax,stack
mov ss, ax
mov sp, 16
; data
mov ax,data
mov ds,ax
; table 行
mov bx, 0
; 年份和收入的偏移下标
mov si, 0
; 雇员数的偏移下标
mov bp, 0
; 21次循环填充 table
mov cx, 21
s0:
; 1、 复制年份到 table[0] 的前四个字节处
mov ax, ds:[0 + si]
mov es:[0 + bx], ax
mov ax, ds:[2 + si]
mov es:[2 + bx], ax
; 填充空格
mov ax, 20h
mov es:[4 + bx], ax
; 2、 复制收入
mov ax, ds:[84 + 0 + si]
mov es:[5 + bx], ax
mov ax, ds:[84 + 2 + si]
mov es:[7 + bx], ax
; 填充空格
mov ax, 20h
mov es:[9 + bx], ax
; 3、 复制人数
mov ax, ds:[84 + 84 + 0 + bp]
mov es:[10 + bx], ax
; 填充空格
mov ax, 20h
mov es:[12 + bx], ax
; 人均收入
mov ax, ds:[84 + 0 + si]
mov dx, ds:[84 + 2 + si]
mov di, ds:[84 + 84 + 0 + bp]
div di
mov es:[13 + bx], ax
; 填充空格
mov ax, 20h
mov es:[15 + bx], ax
add si, 4
add bp, 2
add bx, 16
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。





