臧世滔 发表于 2025-8-13 23:40:49

实验7,为什么我的debug出来只有年份是对的

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年的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

FishC 发表于 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,       ; 加载前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]
查看完整版本: 实验7,为什么我的debug出来只有年份是对的