Я довольно смущен тем, как операции умножения и деления работают в сборке 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
Пытались ли вы чтении [Документ Тион] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –