【问题标题】:Dividing a small number to a big one doesn't give quotient 0 [duplicate]将小数除以大数不会给出商 0 [重复]
【发布时间】:2017-11-11 09:30:21
【问题描述】:

我有下一个问题: 当我尝试将较小的数字除以较大的数字时,我得到的商非常高,我不明白为什么。这是我试图将 1 除以 5 的程序,结果是 256。(变量 'a' 和 'b' 必须是 db 类型) 有人能帮我吗?提前谢谢你

.model small 
afisareanr macro nr
local m11
local m
xor ax, ax
mov ax, nr
push ax             
mov si, 10          
mov di, 5           

mov dx, 0           
cmp ax, 0           
jge m               
neg ax              

m:div si            
add dl, 30h         

mov s[di],dl        

xor dx,dx           
dec di              
cmp ax, 0           

jne m               

pop ax              

cmp ax, 0           
jge m11             
mov s[di], '-'      

m11: 
mov ah, 9           
lea dx, s
int 21h
endm

.stack 
.data 
a db 5
b db 1
s    db 6 dup(" "), '$'

.code 
mov ax, @data 
mov ds, ax

xor ax, ax
xor bx, bx
mov al, b
idiv a
mov bx, ax
afisareanr bx

mov ax, 4c00h
int 21h

end

【问题讨论】:

    标签: assembly tasm


    【解决方案1】:

    似乎与所有那些“为什么DIV 不起作用”的问题重复,但有些具体并且回答它比寻找好的欺骗对我来说更容易(如果其他人认为一个好,将删除答案)。

    mov al, b     ; AL = b (1) .. and i prefer squared bracket Intel style
                  ; like mov al,[b]  - to see easily memory is accessed
    idiv a
    

    现在编译没有错误只是因为您在 MASM 怪癖模式下使用 TASM,在 TASM“理想”模式下这将是语法错误 IIRC(在 ~1994-1999 年确实使用了 TASM,所以我可能记错了)。

    问题是,不清楚,什么是数据大小。在汇编中,有经验的程序员更喜欢源代码非常精确和明确的意图,即idiv byte ptr [a],这使得阅读源代码和查找错误变得更加容易。

    这样idiv 按字节值5 被执行。如果您检查IDIV description,您应该能够识别出您正在使用ax / "r/m8" 变体,因此结果存储在al(商)和ah(余数)中。

    1/5 = 0,余数 1 ...所以al = 0, ah = 1。但这意味着,ax 作为整个 16 位寄存器现在包含值 0100h = 256

    mov bx, ax
    

    猜猜 printed 存储到 bx 这里的内容。 (打印是通过下一行使用那个丑陋的宏完成的,我个人更喜欢将该宏作为子例程移动到代码中,而不是 call 那个......但看起来你现在刚刚开始使用 asm,所以暂时专注于基础知识,将宏代码移动到子程序很简单,但如果您对 asm 一无所知,可能会出错)。

    顺便说一句,如果您安装了 TASM,那么您还安装了 TD(Turbo 调试器)。用它来看看你自己,每条指令之后 CPU 中发生了什么。它使学习 ASM 变得更加容易。

    【讨论】:

    • 非常感谢,我明白发生了什么以及 256 是如何出现的,是的,你说得对,我是新手,我们刚开始在大学学习 asm。
    • 要查找用于划分的规范 dup-targets,请查看 x86 tag wiki 并搜索 idiv。这就是我添加常见问题解答部分的部分原因。 (嗯,这不是 exact 重复,因为这里的问题是没有意识到剩余部分进入 AH,而不是未能清除股息的上半部分。但迈克尔在链接上的回答关于 8 位操作数大小除法的 dup 确实提到了它的工作原理。不同的问题相同的答案。)无论如何,我不建议删除这个答案,没关系。
    猜你喜欢
    • 2016-02-26
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多