[汇编语言]BUG与错题

1. 变量未初始化导致DEBUG.EXE和直接执行程序不一致

这是在王爽老师的<汇编语言 第三版>,第10章实验10的第3个小实验转换为课程设计1中的双字节版本的dtoc过程中遇到的.
在这里插入图片描述
如图,DEBUG.EXE调试时,显示的值是12666,结果是正确的.但是在没有DEBUG.EXE介入时,运行的结果确是58138.

观察如下代码:

    mov ax,stack
    mov ss,ax
    mov sp,16

    mov ax,12666
    mov bx,data
    mov ds,bx
    mov si,0
    call dtoc

    mov dh,8
    mov dl,3
    mov cl,2
    call show_str

    mov ax,4c00h
    int 21h

; (dx): high 16 bits of dword data
; (ax): low 16 bits of dword data
; (ds):data buffer
; (si): ds offset
; return: set data buffer, ds:si point to string begin address
dtoc:
	...

上面的程序中,没有对dx进行初始化操作,导致dx可能是个随机值.修改方法就是mov dx,0即可.

2. DIV指令异常,CS:IP跑飞

DEBUG.EXE单步调试中发现执行了DIV CL指令后,整个CS:IP从076A:XXXX跑到了FFXXH:BBBBH(具体记不清了).
这个原因是因为结果长度无法在AH寄存器中放下而导致了异常.同理,DIV 16bits长度的寄存器也会出现这种类似的问题.

还有一种可能的情况就是除0导致了异常.

对于结果溢出导致程序跑飞的情况,可以使用第10章的divdw子程序进行除法操作.

assume cs:code
stack segment
    dw 16 dup (0)
stack ends

code segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,0

    mov ax, 4242h ; 被除数低16
    mov dx, 0fh ; 被除数高16
    mov cx, 0ah ; 除数
    call divdw
    mov ax, 4c00h
    int 21h

divdw:
    push bx
    push si

    mov bx, ax ; store ax register in bx
    mov ax, dx
    mov dx, 0
    div cx ; int(h/n)
    mov si, ax ; save int(h/n) in si

    mov ax, bx
    div cx

    mov cx, dx
    mov dx, si

    pop si
    pop bx
    ret
code ends
end start

3

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值