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