鱼C论坛

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

[汇编作业] 实验7,为什么我的debug出来只有年份是对的

[复制链接]
发表于 2025-8-13 23:40:49 | 显示全部楼层 |阅读模式

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

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

x
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,[bx]
        mov es:[bp],ax
        mov ax,2[bx]
        mov es:2[bp],ax

        mov ax,[si]
        mov dx,2[si]
        mov es:5[bp],ax
        mov es:7[bp],dx

        div word ptr [di]
        mov es:0dh[bp],ax

        mov ax,[di]
        mov es:0ah[bp],ax

        add bx,4
        add si,4
        add di,2
        add bp,16

    loop lp0

    mov ax,4c00h
    int 21h

code ends

end start
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-13 23:46:50 | 显示全部楼层
你的代码中存在几个问题,导致只有年份显示正确。以下是修复后的代码和解释:


  1. assume cs:code, ds:data, es:table

  2. data segment
  3.     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  4.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.     db '1993','1994','1995'
  6.     ; 以上是21个年份字符串 (0~53h)

  7.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  8.     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  9.     ; 以上是21个双字收入数据 (54h~0A7h)

  10.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  11.     dw 11542,14430,15257,17800
  12.     ; 以上是21个字雇员数 (0A8h~0D1h)
  13. data ends

  14. table segment
  15.     db 21 dup('year summ ne ?? ') ; 每行16字节
  16. table ends

  17. code segment
  18. start:
  19.     mov ax, data
  20.     mov ds, ax      ; DS指向数据段
  21.     mov ax, table
  22.     mov es, ax      ; ES指向表格段

  23.     mov bx, 0       ; 年份指针
  24.     mov si, 54h     ; 收入指针
  25.     mov di, 0A8h    ; 雇员数指针
  26.     mov bp, 0       ; 表格行指针

  27.     mov cx, 21      ; 循环21次
  28. lp0:
  29.     ; 1. 复制年份 (4字节)
  30.     mov ax, [bx]        ; 加载前2字节
  31.     mov es:[bp], ax     ; 存到表格
  32.     mov ax, [bx+2]      ; 加载后2字节
  33.     mov es:[bp+2], ax   ; 存到表格

  34.     ; 2. 复制收入 (4字节)
  35.     mov ax, [si]        ; 收入低16位
  36.     mov dx, [si+2]      ; 收入高16位
  37.     mov es:[bp+5], ax   ; 存收入低字
  38.     mov es:[bp+7], dx   ; 存收入高字

  39.     ; 3. 复制雇员数并计算人均收入
  40.     mov ax, [di]        ; 加载雇员数
  41.     mov es:[bp+10], ax  ; 存雇员数到表格
  42.     mov dx, [si+2]      ; 重新加载收入高16位
  43.     mov ax, [si]        ; 重新加载收入低16位
  44.     div word ptr [di]   ; 除法: (dx:ax)/[di]
  45.     mov es:[bp+13], ax  ; 存人均收入到表格

  46.     ; 4. 更新指针
  47.     add bx, 4   ; 下一年的年份
  48.     add si, 4   ; 下一年的收入
  49.     add di, 2   ; 下一年的雇员数
  50.     add bp, 16  ; 下一表格行

  51.     loop lp0

  52.     mov ax, 4c00h
  53.     int 21h
  54. code ends
  55. 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-24 19:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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