iron110 发表于 2025-8-26 05:58:55

第六章实验5.5

assume cs:code

a segment
    db 1,2,3,4,5,6,7,8
a ends

b segment
    db 1,2,3,4,5,6,7,8
b ends

c segment
    db 0,0,0,0,0,0,0,0
c ends

code segment
start:mov ax,a
      mov ds,ax
      mov ax,b
      mov es,ax
      mov ax,c
      mov ss,ax
      mov bx,0
      mov cx,8
    s:mov dx,0
      add dx,ds:
      add dx,es:
      mov ss:,dx
      add bx,2
      loop s

      mov ax,4c00h
      int 21h
code ends
end start

FishC 发表于 2025-8-26 06:00:43

您的汇编代码中有几个错误,主要涉及偏移地址的缺失、寄存器大小不匹配以及索引增加错误。下面我将简要说明问题并提供修正后的代码。

### 错误分析:
- 在指令如 add dx,ds: 中,缺少偏移地址(例如,应为 ds:)。
- 使用16位寄存器 dx 来添加8位数据,会导致数据大小不匹配。应使用8位寄存器如 al。
- 循环中索引增加应为1(因为数据是字节),但代码中使用了 add bx,2,这会导致访问错误的数据。

### 修正后的代码:
以下是修正后的代码,使用正确的偏移地址、寄存器大小和索引增加方式。注意,我保留了使用 ss 段寄存器用于存储,但通常 ss 用于堆栈,这里在没有堆栈操作的情况下可以工作。


assume cs:code

a segment
    db 1,2,3,4,5,6,7,8
a ends

b segment
    db 1,2,3,4,5,6,7,8
b ends

c segment
    db 0,0,0,0,0,0,0,0
c ends

code segment
start:mov ax,a
      mov ds,ax      ; ds 指向 a 段
      mov ax,b
      mov es,ax      ; es 指向 b 段
      mov ax,c
      mov ss,ax      ; ss 指向 c 段(注意:ss 通常用于堆栈)
      mov bx,0         ; 初始化索引为 0
      mov cx,8         ; 循环 8 次

    s:mov al,ds:   ; 从 a 段读取字节到 al
      add al,es:   ; 加上 b 段的字节
      mov ss:,al   ; 存储结果到 c 段
      inc bx         ; 索引增加 1(因为数据是字节)
      loop s

      mov ax,4c00h
      int 21h
code ends
end start


### 说明:
- 修正了偏移地址的使用,例如 ds:。
- 改用8位寄存器 al 来处理字节数据。
- 将索引增加改为 inc bx(每次增加1)。
- 代码现在应该能正确地将 a 和 b 段的对应元素相加,结果存入 c 段。

如果您有其他问题,请随时问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 第六章实验5.5