m0_73740280 2023-03-05 10:36 采纳率: 86.8%
浏览 9

请问这个汇编程序怎么修改

请问这个程序在单步调试的时候,
add al,[bx-1]不执行,只执行add al,[bx-2]是怎么回事

DATA SEGMENT
    DB 1, 1, 8 DUP (0) 
DATA ENDS
assume cs:code,ds:data
code segment
    mov ax,data
    mov ds,ax
    mov ax,0
    mov bx,3  
    mov cx,8
    s:
    add al,ds:[bx-2]
    add al,ds:[bx-1]
    mov ah,0
    mov ds:[bx],ax
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends 
end

  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-03-05 10:53
    关注

    “Devil组”引证GPT后的撰写:

    • 在单步调试时,执行 add al, [bx-1] 指令的条件是 BX 寄存器的值为 1 或以上。
    • 因为在循环开始时, BX 被赋值为 3,因此第一次执行 add al, [bx-1] 指令时,它会尝试读取数据段中地址为 2 的字节,但是该地址可能不在数据段中。
    • 而第一次执行 add al, [bx-2] 指令时,它会尝试读取数据段中地址为 1 的字节,这是可以的,因为数据段中的第一个字节的地址是 0。
    • 为了修复这个问题,可以将 BX 的初始值改为 2,这样第一次执行 add al, [bx-1] 指令时,将会读取数据段中的第一个字节。

    以下是修改后的代码:

    DATA SEGMENT
        DB 1, 1, 8 DUP (0) 
    DATA ENDS
    assume cs:code,ds:data
    code segment
        mov ax,data
        mov ds,ax
        mov ax,0
        mov bx,2 ; 将 BX 的初始值改为 2
        mov cx,8
    s:
        add al,ds:[bx-2]
        add al,ds:[bx-1]
        mov ah,0
        mov ds:[bx],ax
        inc bx
        loop s
        mov ax,4c00h
        int 21h
    code ends 
    end
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月5日

悬赏问题

  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件