我想划分两个单字节数, 然后尝试获取商和余数(将它们放在单字节变量中)。
到目前为止,这是我的代码:
;divide 8-bit number by the number 10
mov ax, [numb2]
mov cl, 10
div cl
;get quotient and remainder
mov byte[quotient], al
mov byte[remainder], ah
商存储在al中, 并且余数存储在啊, 正确?
运行后,我从控制台收到“浮点异常(核心转储)”。
我的代码出了什么问题?
编辑:商,余数和numb2变量是8位
使用Ubuntu x86 - NASM
答案 0 :(得分:2)
;divide 8-bit number by the number 10
mov ax, [numb2]
mov cl, 10
xor ah,ah ;; add this line this function allows to clear ah
div cl
;get quotient and remainder
mov byte[quotient], al
mov byte[remainder], ah
答案 1 :(得分:1)
您无法使用“mov”将8位值移动到16位寄存器中。 CPU将从存储器偏移'numb2'开始拉入16位。无论它是什么,它都太大而不适合在div之后。你应该使用:
mov al,byte ptr [numb2] ;tasm/masm
OR
mov al,byte [numb2] ;nasm
xor ah,ah
mov cl,10
div cl
每条注释:根据汇编程序使用“byte ptr”或“byte”。但是指定对象的大小总是很好的做法。否则,汇编程序必须根据使用的寄存器推断对象的大小。
答案 2 :(得分:0)
我通过使用寄存器的扩展版本(EAX,EBX,ECX,EDX
)解决了该问题。
余数存储在EDX
中,商存储在EAX