实验7,为什么我的debug出来只有年份是对的
assume cs:code, ds:data, es:tabledata 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
code segment
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,54h
mov di,0a8h
mov bp,0
mov cx,21
lp0:
mov ax,
mov es:,ax
mov ax,2
mov es:2,ax
mov ax,
mov dx,2
mov es:5,ax
mov es:7,dx
div word ptr
mov es:0dh,ax
mov ax,
mov es:0ah,ax
add bx,4
add si,4
add di,2
add bp,16
loop lp0
mov ax,4c00h
int 21h
code ends
end start
你的代码中存在几个问题,导致只有年份显示正确。以下是修复后的代码和解释:
assume cs:code, ds:data, es: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个年份字符串 (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个双字收入数据 (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个字雇员数 (0A8h~0D1h)
data ends
table segment
db 21 dup('year summ ne ?? ') ; 每行16字节
table ends
code segment
start:
mov ax, data
mov ds, ax ; DS指向数据段
mov ax, table
mov es, ax ; ES指向表格段
mov bx, 0 ; 年份指针
mov si, 54h ; 收入指针
mov di, 0A8h ; 雇员数指针
mov bp, 0 ; 表格行指针
mov cx, 21 ; 循环21次
lp0:
; 1. 复制年份 (4字节)
mov ax, ; 加载前2字节
mov es:, ax ; 存到表格
mov ax, ; 加载后2字节
mov es:, ax ; 存到表格
; 2. 复制收入 (4字节)
mov ax, ; 收入低16位
mov dx, ; 收入高16位
mov es:, ax ; 存收入低字
mov es:, dx ; 存收入高字
; 3. 复制雇员数并计算人均收入
mov ax, ; 加载雇员数
mov es:, ax; 存雇员数到表格
mov dx, ; 重新加载收入高16位
mov ax, ; 重新加载收入低16位
div word ptr ; 除法: (dx:ax)/
mov es:, ax; 存人均收入到表格
; 4. 更新指针
add bx, 4 ; 下一年的年份
add si, 4 ; 下一年的收入
add di, 2 ; 下一年的雇员数
add bp, 16; 下一表格行
loop lp0
mov ax, 4c00h
int 21h
code ends
end start
主要问题修复说明:
1. 年份复制问题:
- 原代码未正确复制4字节年份,修复后使用两次MOV指令分别复制高低字
2. 收入数据问题:
- 原代码未正确加载收入数据(缺少源操作数)
- 修复后先加载到DX:AX寄存器再存入表格
- 注意:收入在表格中的偏移是5(年份占0-3,空格占4)
3. 雇员数和人均收入问题:
- 原代码在除法前覆盖了AX寄存器(雇员数加载破坏了收入值)
- 修复后:
- 先复制雇员数到表格(偏移10)
- 重新加载收入值到DX:AX
- 用DIV指令计算人均收入
- 将结果存入表格(偏移13)
4. 地址偏移修正:
- 表格中各字段偏移:
- 年份:0
- 收入:5
- 雇员数:10
- 人均收入:13
调试建议:
1. 使用DEBUG查看table段内存,确认数据布局
2. 检查除法指令执行前的DX:AX值(应为收入)
3. 确保DIV指令的除数来自(雇员数)
关键点:在计算人均收入前,必须保证DX:AX寄存器包含完整的收入值(双字),且不能被其他操作破坏。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]