784055837 发表于 6 天前

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

我写的代码,不知道有没有问题,或者更优化的方案:
assume cs:codesg,ds: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 个字符串   (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
    ; 以上是表示 21 年公司总收入的 21 个 dword 型数据 (54H~0A7H)

    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 型数据        (0A8H~0D1H)      

data ends

table segment
    db 21 dup ('year summ ne ?? ')
table ends

codesg segment
        start:
                        mov ax,data                                ;数组数据
                        mov ds,ax
                        mov ax,table                        ;结构化数据
                        mov es,ax
                       
                        mov bx,0
                        mov bp,0
                        mov di,0
                       
                        mov cx,21
        s0:               
                        mov ax,ds:0h                ;存放年份数据(4字节)
                        mov es:0h,ax
                        mov ax,ds:2h
                        mov es:2h,ax
                       
                        mov ax,ds:54h                ;存放公司收入(4字节)
                        mov es:5h,ax
                        mov ax,ds:56h
                        mov es:7h,ax
       
                        mov ax,ds:.0a8h                ;存放雇员人数(2字节)
                        mov es:.0ah,ax
                                                                        ;计算人均收入(取整,2字节)
                        mov ax,ds:.54h        ;存放被除数(32位)
                        mov dx,ds:.54h
                        div word ptr es:.0ah;除法运算,除以人数
                        mov es:.0dh,ax                ;将商结果储存

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

                        mov ax,4c00h
                        int 21h
codesg ends

end start

FishC 发表于 6 天前

您的代码在结构化数据访问中使用了不同的寻址方式。以下是一些可能的改进建议:

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

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

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

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

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

assume cs:codesg,ds: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'
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800
data ends

table segment
    db 21 dup ('year summ ne ?? ')
table ends

codesg segment
    start:
      mov ax,data
      mov ds,ax
      mov ax,table
      mov es,ax
      
      xor bx,bx
      xor bp,bp
      xor di,di
      
      mov cx,21
    s0:      
      mov ax,      ;存放年份数据(4字节)
      mov ,ax
      mov ax,
      mov ,ax
      
      mov ax,    ;存放公司收入(4字节)
      mov ,ax
      mov ax,
      mov ,ax

      mov ax,   ;存放雇员人数(2字节)
      mov ,ax
                              ;计算人均收入(取整,2字节)
      mov dx,;存放被除数高位(32位)
      mov ax,    ;存放被除数低位
      div word ptr ;除法运算,除以人数
      mov ,ax    ;将商结果储存

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

      mov ax,4c00h
      int 21h
codesg ends

end start

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 实验7 寻址方式在结构化数据访问中的应用