Операнды команд умножения и деления на ассемблере x86, 16-разрядные и выше

Я немного запутался в том, как операции умножения и деления работают в ассемблере 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?

10
задан wallyk 14 April 2012 в 01:09
поделиться