2012-03-20 2 views
9

Я довольно смущен тем, как операции умножения и деления работают в сборке x86. Например, приведенный ниже код не кажется слишком сложным, так как сделки с 8-битным.x86 сборщик умножает и делит операнды команд, 16 бит и выше

8-Bit Умножение:

; User Input: 
; [num1], 20 
; [num2] , 15 

mov ax, [num1] ; moves the 8 bits into AL 
mov bx, [num2] ; moves the 8 bits into BL 

mul bl   ; product stored in AX 

print ax 

Но что происходит, когда вы хотите, чтобы перемножить два 16-битных чисел? Как бы умножить два 16-разрядных номера так же, как это было сделано с 8-битными номерами?

Я смущен относительно того, какие регистры будут сохранены. Будут ли они сохранены в AL и AH или просто будут хранить 16-разрядное число в AX. Чтобы показать, что я имею в виду:

; User Input: 
; [num1], 20 
; [num2], 15 

mov eax, [num1] ; Does this store the 16-bit number in AL and AH or just in AX 
mov ebx, [num2] ; Does this store the 16-bit number in BL and BH or just in BX 

mul ???   ; this register relies on where the 16-bit numbers are stored 

print eax 

Может ли кто-нибудь подробно рассказать о том, как работают умножения и деления? (В частности, с 16-битными и 32-битными числами? Нужно ли вращать биты, если значения сохраняются в нижней AL и AH?

Или может человек просто mov num1 и num2 в ax и bx соответственно, а затем умножить их чтобы получить продукт в eax

+2

Пытались ли вы чтении [Документ Тион] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –

ответ

14

быстрый взгляд на documentation показывает, что существует 4 возможных размеров операндов для MUL входы и выходы представлены в удобной таблице:.

------------------------------------------------------ 
| Operand Size | Source 1 | Source 2 | Destination | 
------------------------------------------------------ 
| Byte   | AL  | r/m8  | AX   | 
| Word   | AX  | r/m16  | DX:AX  | 
| Doubleword | EAX  | r/m32  | EDX:EAX  | 
| Quadword  | RAX  | r/m64  | RDX:RAX  | 
------------------------------------------------------ 
+0

Я посмотрел на это и знал, где значение хранится после 'mul'. Мне интересно, если, когда я храню значение в 'eax' (до' mul'), если он сохраняет его в младших битах (AL и AH), а не в более высоких битах (AX). Если он хранит их в младших битах, могу ли я повернуть их в AX, а затем просто умножить AX и BX и распечатать ответ (я считаю, что это будет в EAX)? – StartingGroovy

+0

Если вы сохраняете значение в 'eax', оно находится в * all * of' eax'. Я не уверен, что понимаю. Я думаю, вы можете ввести в заблуждение, какие части 'eax'' ah', 'al' и' ax' тоже. Вы можете увидеть диаграмму в томе 1 той же документации. В частности, 'ax' означает те же 16 бит, что и' ah: al', а не «верхние» 16-бит «eax». –

+0

А, ты прав, вот что меня смутило. Поэтому, по сути, я хотел бы сделать умножение 'AX' на' BX', а мой продукт должен быть в 'EAX'? – StartingGroovy

Смежные вопросы