You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TASM汇编除法操作出现溢出错误,如何解决该问题?

解决TASM除法溢出问题

嘿,我一眼就看到问题啦!你的除法溢出是因为没有在执行div bl前清空AH寄存器。

问题根源

TASM中的div bl是8位无符号除法指令,它默认将AX寄存器作为16位被除数:AL存储被除数的低8位,AH存储高8位。你的代码里,在执行mov al,4之前,AX中存储的是数据段的段地址(来自MOV AX,DATA),之后仅修改了AL的值,AH里还保留着段地址的高8位“垃圾值”。

举个例子:假设DATA段地址是0x1234,执行mov al,4后AX会变成0x1204,用这个值除以bl=2,得到的商是0x902——这个数值远远超过了AL能存储的8位范围(0~255),于是触发了除法溢出错误。

修改后的代码

只需要在给AL赋值前(或后)添加清空AH的指令即可:

Data Segment
    val db?
Data ends

Code Segment
assume CS:Code,DS:Data
Start:
    MOV AX,DATA
    MOV DS,AX
    mov ah,0  ; 关键步骤:清空AH,确保AX仅包含AL的有效数值
    mov al,4
    mov bl,2
    div bl
    MOV AH,4CH
    INT 21H
Code ends
END Start

额外提示

  • 如果你使用16位除法(比如div bx),被除数是DX:AX(32位组合),此时需要提前清空DX寄存器,避免高位垃圾值导致溢出。
  • 如果是有符号除法(idiv指令),不能直接清空高位,而是需要用符号扩展指令:cbw将AL扩展为AX,cwd将AX扩展为DX:AX,这样才能保证除法运算的正确性。

内容的提问来源于stack exchange,提问作者MaronFive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:11