|
发表于 2025-8-13 23:46:50
|
显示全部楼层
你的代码中存在几个问题,导致只有年份显示正确。以下是修复后的代码和解释:
- 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, [bx] ; 加载前2字节
- mov es:[bp], ax ; 存到表格
- mov ax, [bx+2] ; 加载后2字节
- mov es:[bp+2], ax ; 存到表格
- ; 2. 复制收入 (4字节)
- mov ax, [si] ; 收入低16位
- mov dx, [si+2] ; 收入高16位
- mov es:[bp+5], ax ; 存收入低字
- mov es:[bp+7], dx ; 存收入高字
- ; 3. 复制雇员数并计算人均收入
- mov ax, [di] ; 加载雇员数
- mov es:[bp+10], ax ; 存雇员数到表格
- mov dx, [si+2] ; 重新加载收入高16位
- mov ax, [si] ; 重新加载收入低16位
- div word ptr [di] ; 除法: (dx:ax)/[di]
- mov es:[bp+13], 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指令的除数来自[di](雇员数)
关键点:在计算人均收入前,必须保证DX:AX寄存器包含完整的收入值(双字),且不能被其他操作破坏。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|