| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
啊哈哈 我是没想到边看边睡的我能做出来 
我觉得这个帖子可以给一些遇到困难的朋友一些帮助 
先上源代码 原题见【汇编入门】《零基础入门学习汇编语言》的p42"寻址方式在结构化数据访问中的应用" 
- assume cs:code
 
  
- 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个字节型数据(0 - 53H)
 
 -         
 
 -         dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
 
 -         dd 345980, 590827, 803530, 1183000, 1843000, 2579000, 3753000, 4649000, 5937000
 
 -         ;以上表示21个双字型数据(54H - 0A7H)
 
 -         
 
 -         dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 4037, 5635, 8226
 
 -         dw 11542, 11430, 15257, 17800
 
 -         ;以上表示21个字型数据(0A8H - 0D1H)
 
 - data ends
 
  
- table segment
 
 -         db 21 dup ('year summ ne ?? ')
 
 -         ;           0123456789ABCDEF
 
 - table ends
 
  
- code segment
 
 -         start:        mov ax, data
 
 -                         mov ds, ax
 
 -                         mov ax, table
 
 -                         mov es, ax
 
 -                         ;将源地址和目标地址分别与ds es挂钩
 
 -                         
 
 -                         ;初始化寄存器 cx存放21 后用作循环
 
 -                         mov bx, 0
 
 -                         mov si, 0
 
 -                         mov di, 0
 
 -                         mov cx, 21
 
 -                         
 
 -                         ;----------------------------------------------
 
 -                         ;;先存放年份至目标地址(table)
 
 -                         ;年份的一个数据是4个字节(4 * 8 = 32位) ax可存放2个字节(2 * 8 = 16位)
 
 -                         ;因此 ax用于存放低16位的数据  dx用于存放高16位的数据
 
 -         s1:            mov ax, ds:[bx]                        ;ax存放低16位数据
 
 -                         mov dx, ds:[bx+2]                     ;dx存放高16位数据
 
 -                         
 
 -                         ;es为目标地址 di用作偏移 
 
 -                         mov es:[di], ax                        ;这段为低16位的数据
 
 -                         mov es:[2+di], dx                ;这段为高16为的数据
 
 -                         
 
 -                         add bx, 4                                ;bx自增2个字(4个字节 32位)
 
 -                         add di, 16                                ;di偏移到下一段中
 
 -                         loop s1
 
 -                         ;---------------------------------------------
 
 -                         
 
 -                         ;初始化寄存器
 
 -                         mov bx, 54H                                ;公司收入的数据存放起点位于54H
 
 -                         mov di, 5                                ;table中收入存放位置位于第五位 所以di应该先加上5 
 
 -                         mov si, 0
 
 -                         mov cx, 21                                ;cx继续做21次循环
 
 -                         ;---------------------------------------------
 
 -                         
 
 -                         ;;再将公司收入存放至目标地址(table)
 
 -                         ;公司收入的一个数据为dw(4个字节 32位) ax可存放2个字节(16位)
 
 -                         ;因此 同样采用上面的方式来移动数据至目标地址(table)
 
 -                         
 
 -         s2:            mov ax, ds:[bx]                        ;ax存放低16位数据
 
 -                         mov dx, ds:[bx+2]                ;dx存放高16位数据
 
 -                         
 
 -                         mov es:[di], ax
 
 -                         mov es:[di+2], dx
 
 -                         
 
 -                         add bx, 4
 
 -                         add di, 16
 
 -                         loop s2
 
 -                         ;---------------------------------------------
 
 -                         ;初始化寄存器
 
 -                         mov bx, 0A8H                         ;员工人数存放地址起点为0A8H
 
 -                         mov di, 0AH                                ;table中公司员工人数的数据存放地址位于一个段中的第10(A)位
 
 -                         mov si, 0
 
 -                         mov cx, 21
 
 -                         
 
 -                         ;---------------------------------------------
 
 -                         ;将员工人数存放至目标地址(table)
 
 -                         ;分析:员工人数的一个数据为字型数据(两个字节 16位) 因此只用一个ax寄存器就可以了
 
 -         s3:            mov ax, ds:[bx]
 
 -         
 
 -                         mov es:[di], ax
 
 -                         
 
 -                         add ax, 2
 
 -                         add di, 16
 
 -                         loop s3
 
 -                         
 
 -                         ;---------------------------------------------
 
 -                         ;初始化寄存器
 
 -                         mov bx, 54H                                                ;被除数(公司收入) 
 
 -                         mov si, 0A8H                                        ;除数(员工人数)
 
 -                         mov di, 0DH                                                ;目标地址
 
 -                         mov cx, 21
 
 -                         ;--------------------------------------------
 
 -                         ;将公司收入与员工人数做除法运算
 
 -                         ;分析:员工人数的一个数据为一个字型数据(两个字节 16位) 因此被除数需要分别存放再ax(低16位) 和 dx(高16位) 中
 
 -                         
 
 -         s4:            mov ax, ds:[bx]                        ;低16位
 
 -                         mov dx, ds:[bx+2]                   ;高16位
 
 -                         
 
 -                         div word ptr ds:[si]                  ;做除法运算        ax存放商 dx存放余数
 
 -                           
 
 -                         mov es:[di], ax                       ;将结果移动至目标地址
 
 -                         
 
 -                         add bx, 4                                ;公司收入的一个数据是四个字节
 
 -                         add si, 2                                ;公司人数的一个数据是两个字节
 
 -                         
 
 -                         add di, 16
 
 -                         
 
 -                         loop s4
 
 -                         ;---------------------------------------------
 
 -                         ;结束程序
 
 -                         mov ax, 4c00h
 
 -                         int 21h
 
 - code ends
 
 - end start
 
  复制代码 总结:整个代码下来花了我不到2个小时的时间 
 
其实没必要使用那么复杂的寻址方式 这样子完全就可以解决问题 各位可以自己复制去debug中试一下 
当然不止这一种方式 这种方式只是我再敲代码时想出来的最优解 这个代码应该可以继续优化下去 
 
 |   
 
 
 
 |