| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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 |   
 
 
 
 |