鱼C论坛

 找回密码
 立即注册
查看: 352|回复: 1

实验7 寻址方式在结构化数据访问中的应用

[复制链接]
发表于 2025-1-17 17:37:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我写的代码,不知道有没有问题,或者更优化的方案:
  1. assume cs:codesg,ds:table

  2. data segment
  3.     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  4.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.     db '1993','1994','1995'
  6.     ; 以上是表示 21 年的 21 个字符串   (0~53H)

  7.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  8.     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  9.     ; 以上是表示 21 年公司总收入的 21 个 dword 型数据 (54H~0A7H)

  10.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  11.     dw 11542,14430,15257,17800
  12.     ; 以上是表示 21 年公司雇员人数的 21 个 word 型数据        (0A8H~0D1H)      

  13. data ends

  14. table segment
  15.     db 21 dup ('year summ ne ?? ')
  16. table ends

  17. codesg segment
  18.         start:
  19.                         mov ax,data                                ;数组数据
  20.                         mov ds,ax
  21.                         mov ax,table                        ;结构化数据
  22.                         mov es,ax
  23.                        
  24.                         mov bx,0
  25.                         mov bp,0
  26.                         mov di,0
  27.                        
  28.                         mov cx,21
  29.         s0:               
  30.                         mov ax,ds:0h[bp]                ;存放年份数据(4字节)
  31.                         mov es:0h[bx],ax
  32.                         mov ax,ds:2h[bp]
  33.                         mov es:2h[bx],ax
  34.                        
  35.                         mov ax,ds:54h[bp]                ;存放公司收入(4字节)
  36.                         mov es:5h[bx],ax
  37.                         mov ax,ds:56h[bp]
  38.                         mov es:7h[bx],ax
  39.        
  40.                         mov ax,ds:[di].0a8h                ;存放雇员人数(2字节)
  41.                         mov es:[bx].0ah,ax
  42.                                                                         ;计算人均收入(取整,2字节)
  43.                         mov ax,ds:[bp].54h[0]        ;存放被除数(32位)
  44.                         mov dx,ds:[bp].54h[2]
  45.                         div word ptr es:[bx].0ah;除法运算,除以人数
  46.                         mov es:[bx].0dh,ax                ;将商结果储存

  47.                         add di,2h                                ;确定人数
  48.                         add bp,4h                                ;确定年份和收入
  49.                         add bx,10h                                ;确定每行的列数
  50.                         loop s0

  51.                         mov ax,4c00h
  52.                         int 21h
  53. codesg ends

  54. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-1-17 17:37:31 | 显示全部楼层
您的代码在结构化数据访问中使用了不同的寻址方式。以下是一些可能的改进建议:

1. **数据段的定义**:确保数据段中的字符串和数字数据对齐,以便更高效地访问。

2. **寄存器使用**:在循环中,您可以更好地利用寄存器来减少内存访问次数。

3. **除法操作**:在进行除法操作时,确保被除数和除数的位数匹配,并且在进行32位除法时,使用 `dx:ax` 组合。

4. **代码优化**:减少不必要的内存访问和寄存器移动操作。

以下是一些具体的代码改进建议:

  1. assume cs:codesg,ds:table

  2. data segment
  3.     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  4.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.     db '1993','1994','1995'
  6.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7.     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  8.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  9.     dw 11542,14430,15257,17800
  10. data ends

  11. table segment
  12.     db 21 dup ('year summ ne ?? ')
  13. table ends

  14. codesg segment
  15.     start:
  16.         mov ax,data
  17.         mov ds,ax
  18.         mov ax,table
  19.         mov es,ax
  20.         
  21.         xor bx,bx
  22.         xor bp,bp
  23.         xor di,di
  24.         
  25.         mov cx,21
  26.     s0:        
  27.         mov ax,[ds:bx]        ;存放年份数据(4字节)
  28.         mov [es:di],ax
  29.         mov ax,[ds:bx+2]
  30.         mov [es:di+2],ax
  31.         
  32.         mov ax,[ds:bp+54h]    ;存放公司收入(4字节)
  33.         mov [es:di+5],ax
  34.         mov ax,[ds:bp+56h]
  35.         mov [es:di+7],ax

  36.         mov ax,[ds:bp+0a8h]   ;存放雇员人数(2字节)
  37.         mov [es:di+0ah],ax
  38.                                 ;计算人均收入(取整,2字节)
  39.         mov dx,[ds:bp+54h+2]  ;存放被除数高位(32位)
  40.         mov ax,[ds:bp+54h]    ;存放被除数低位
  41.         div word ptr [es:di+0ah] ;除法运算,除以人数
  42.         mov [es:di+0dh],ax    ;将商结果储存

  43.         add di,10             ;确定每行的列数
  44.         add bp,4              ;确定年份和收入
  45.         add bx,4              ;确定年份数据
  46.         loop s0

  47.         mov ax,4c00h
  48.         int 21h
  49. codesg ends

  50. end start
复制代码


请注意,以上代码假设您在使用16位汇编语言环境(如MASM或TASM)进行编程。确保在实际环境中测试代码以验证其正确性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 14:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表