2013-06-26 3 views
2

Я пытаюсь разделить два одиночных байтовых номера, , а затем попытаться получить значение и остаток после этого (помещая их в одиночные байтовые переменные).сборка x86 деление fpoint исключение

Вот мой код до сих пор:

;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, и остатка хранится в ах, правильно?

После запуска, я получаю «исключение с плавающей запятой (core dumped)» с консоли.

Что случилось с моим кодом?


редактировать: частное, остаток, и numb2 переменные 8 бит


с использованием Ubuntu x86 - NASM

+0

возможно дубликат [Получение плавающей исключения точки при попытке использовать DIV в сборке] (http://stackoverflow.com/questions/9793060/getting-floating-point-exception-while-trying-to-use -div-in-assembly) – Mysticial

+0

^Боюсь, что решение по ссылке не работает. пожалуйста, помогите –

+0

возможный дубликат [Div in assembly] (http://stackoverflow.com/questions/17267472/div-in-assembly) – Michael

ответ

0

Вы не можете переместить 8-битное значение в 16-разрядный регистр с «mov». Процессор выдержит 16 бит, начиная со смещения памяти 'numb2'. Независимо от того, что он втягивает, слишком много, чтобы вписаться в al после div. Вы должны использовать:

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

ИЛИ

mov al,byte [numb2]  ;nasm 

xor ah,ah 
mov cl,10 
div cl 

Per комментарии: используйте "байт PTR" или "байт" в зависимости от вашего ассемблере. Но всегда полезно указать размер объекта. В противном случае ассемблер должен определить размер объекта на основе используемых регистров.

+0

он имеет это на 1-й строке, ошибка: запятая, двоеточие или конец строки ожидается –

+0

'byte ptr' - синтаксис TASM/MASM. Если вы используете NASM, это будет просто 'byte'. – Michael

+0

Правда. Я просто пытался указать, что указание - хорошая практика. Эта ошибка никогда бы не произошла, если бы он задал размер объекта. –

1
;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