鱼C论坛

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

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

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式

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

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

x
我写的代码,不知道有没有问题,或者更优化的方案:
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[bp]                ;存放年份数据(4字节)
                        mov es:0h[bx],ax
                        mov ax,ds:2h[bp]
                        mov es:2h[bx],ax
                        
                        mov ax,ds:54h[bp]                ;存放公司收入(4字节)
                        mov es:5h[bx],ax
                        mov ax,ds:56h[bp]
                        mov es:7h[bx],ax
        
                        mov ax,ds:[di].0a8h                ;存放雇员人数(2字节)
                        mov es:[bx].0ah,ax
                                                                        ;计算人均收入(取整,2字节)
                        mov ax,ds:[bp].54h[0]        ;存放被除数(32位)
                        mov dx,ds:[bp].54h[2]
                        div word ptr es:[bx].0ah;除法运算,除以人数
                        mov es:[bx].0dh,ax                ;将商结果储存

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

                        mov ax,4c00h
                        int 21h
codesg ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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,[ds:bx]        ;存放年份数据(4字节)
        mov [es:di],ax
        mov ax,[ds:bx+2]
        mov [es:di+2],ax
        
        mov ax,[ds:bp+54h]    ;存放公司收入(4字节)
        mov [es:di+5],ax
        mov ax,[ds:bp+56h]
        mov [es:di+7],ax

        mov ax,[ds:bp+0a8h]   ;存放雇员人数(2字节)
        mov [es:di+0ah],ax
                                ;计算人均收入(取整,2字节)
        mov dx,[ds:bp+54h+2]  ;存放被除数高位(32位)
        mov ax,[ds:bp+54h]    ;存放被除数低位
        div word ptr [es:di+0ah] ;除法运算,除以人数
        mov [es:di+0dh],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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-22 19:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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