2017-01-24 9 views
-1

В настоящее время я пытаюсь понять DIV операцию в контексте следующего кода сборки:x86 Сборка: операция DIV с отрицательными значениями

push ebp 
mov ebp, esp 
mov eax [ebp+0x8] 
mov edx, 0x0 
div [ebp+0xC] 
mov esp, ebp 
pop ebp 
ret 

мы должны вычислить возвращаемое значение. Функция будет вызываться со следующими значениями:

  1. FUNC (3,24)
  2. FUNC (24,3)
  3. FUNC (24, -3)
  4. FUNC (-1,2)

Результаты для 1) и 2) являются 0 и 8, на мой взгляд.

Теперь я хочу рассчитать результаты для 3) и 4). Как я знаю, операция DIV работает с целыми числами без знака, мой первый вопрос заключается в том, как представить -3 и -1?

Я бы действовать следующим образом:

  1. построить комплимент двоек из Param2
  2. выполнить бинарный деление

Относно третьей ситуации:

-3 находится в два: 11111101

так

ДИВ: (24) 0001100/11111101

Что бы результат?

И четвертый:

-1: 11111111

так

DIV: (-1) 11111111/10
Divison с 2 = SHR 1 - > 1111111 -> 127

Не могли бы вы помочь мне проверить результаты?

+2

Я предполагаю, что люди, следующие за HTML-тег будет весьма удивлен этим вопросом ... –

+1

@rcgldr: 'DIV' это беззнаковое форма обучения, поэтому округление к нулю и отрицательная бесконечность несколько трудно отличить. Я скорее думаю, что этот вопрос требует «IDIV» – doynax

ответ

2

eax - это 32-разрядный регистр.
Это означает, что div будет работать на 32-битных операндах, а не на байтовых значениях, как вы, кажется, думаете.
-3 в дополнении 2: FFFFFFFD в шестнадцатеричном виде = ‭4294967293‬ в десятичной форме. -1 в дополнении 2: FFFFFFFF в hex = 4294967295 в десятичной системе.

Вы можете легко выполнить вычисления, используя любой калькулятор. Если вы хотите разделить с байтовые значения, вы должны использовать

push ebp 
mov ebp, esp 
xor eax,eax     ;mov eax,0 
mov al, [ebp+0x8] 
div al, byte ptr [ebp+0xC] 
xor edx,edx 
mov dl,ah     ;put the remainder in edx 
xor ah,ah 
mov esp, ebp 
pop ebp 
ret 

Раздел

xor edx,edx 
mov dl,ah     ;remainder in edx 
xor ah,ah 

может быть упрощена

movzx edx,ah    ;mov byte value with zero extend to full reg 
xor ah,ah 

Результат будет храниться в al, а остальные в ah.
Поскольку Intel использует мало endian, не имеет значения, что вы используете только один байт, mov al,[some_address_as_before] все равно будет работать.
В архитектуре большого конца вам нужно будет настроить адрес на 3 байта.

Если вы очищая зарегистрировать это, как правило, лучше использовать xor a,a, чем при использовании mov reg,0 бывший кодирует в меньшем количестве байтов и работает быстрее.

Дальнейшее чтение
http://www.felixcloutier.com/x86/DIV.html

+0

, спасибо, ваше право, я не понял, что eax - это 32-битный регистр :) теперь это имеет смысл – user7462359