ассемблер x86 для умножения и деления ассемблера, 16-битный и выше - PullRequest
9 голосов
/ 21 марта 2012

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

8-битное умножение:

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

1 Ответ

14 голосов
/ 21 марта 2012

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

------------------------------------------------------
| 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     |
------------------------------------------------------
...