2

我试图将两个单字节数相除,然后尝试获得商和余数(将它们放在单字节变量中)。

到目前为止,这是我的代码:

;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中,余数存储在ah中,对吗?

运行它后,我从控制台收到“浮点异常(核心转储)”。

我的代码有什么问题?


编辑:商、余数和 numb2 变量是 8 位


使用 Ubuntu x86 -- NASM

4

3 回答 3

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
于 2015-01-27T17:07:44.160 回答
1

您不能使用“mov”将 8 位值移动到 16 位寄存器中。CPU 将从内存偏移量“numb2”开始拉入 16 位。无论它拉入什么都太大而无法在 div 之后放入。你应该使用:

mov al,byte ptr [numb2]  ;tasm/masm

或者

mov al,byte [numb2]      ;nasm

xor ah,ah
mov cl,10
div cl

根据评论:根据您的汇编程序使用“byte ptr”或“byte”。但指定对象的大小始终是一种好习惯。否则,汇编器必须根据使用的寄存器推断对象的大小。

于 2013-06-26T17:03:57.060 回答
0

我通过使用寄存器的扩展版本 ( EAX,EBX,ECX,EDX) 解决了这个问题。余数存储在EDX,商在EAX

于 2018-10-15T18:56:22.280 回答