|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code, ds:data, es:table, ss:stack
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'
;地址是0-53H
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
; 收入来源偏移地址 54H-0a7 到下边应该再+1 因为还有空格
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;雇佣人员偏移地址 0a8h-0d1h
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stack segment
db 8 dup (0)
stack ends
code segment
start: mov ax,data ;既然设置关联了 先把数据传进去
mov ds,ax ;用ax中介转换给ds
mov ax,table ;设置关联
mov es,ax ;这里可以用附加段es 目标数据
mov bx,0 ;用bx设置为0 bx代表数据的偏移
mov si,0 ;用si设置为0 代表es段的偏移地址
mov cx,21 ;设置21次写入 es段si的偏移地址
s: push cx ;cx入栈
mov cx,2 ;设置2次写入 es段si的偏移地址 因为是用字 所以两次
s0: mov ax,[bx] ;设置 数据段的偏移
mov es:[si],ax ;设置 目标段的偏移(es)
add si,2 ;0 2 4 10 12 14 20
add bx,2 ;2 4 6 8 10 12 14 16 20
loop s0
mov ax,[bx+54h] ;设置收入数量的data段起始地址
mov es:[si+1],ax ;因为前边循环出来si已经变成4了 那么起始地址就是4+1 第5位 这里为收入的低位
mov ax,[bx+56h] ;设置收入数量的data段起始地址
mov es:[si+2],ax ;因为前边循环出来si已经变成4了 那么起始地址就是4+2 第6位 这里为收入的高位
mov ax,[bx+0a8h] ;设置人员数量的data段起始地址
mov es:[si+6],ax ;设置目标段 的偏移并且写入 前边已经是 4了 要改写的数据在目标段的10位 所以si+6
mov ax,es:[si+1]
mov dx,es:[si+2]
div word ptr es:[si+6]
mov es:[si+10],ax
add si,12 ;前边两次运算后 si=4 这里+12 正好等于下一个段的开头
pop cx ;cx出栈
loop s
mov ax,4c00h
int 21h
code ends
end start
以上代码 如果没有 下边这段 运行 正常 但是加上这段 就卡死了 这会儿脑袋有点儿懵 放出来大家看看吧 我写的可能有点儿绕 用字和循环 2个变量+ 偏移地址
mov ax,es:[si+1]
mov dx,es:[si+2]
div word ptr es:[si+6]
mov es:[si+10],ax |
|