实验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 您的代码在结构化数据访问中使用了不同的寻址方式。以下是一些可能的改进建议:
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]