Jestem raczej zdezorientowany tym, jak operacje mnożenia i dzielenia działają w zespole x86. Na przykład poniższy kod nie wydaje się zbyt trudny, ponieważ dotyczy wersji 8-bitowej.Zespół x86 mnożenie i dzielenie argumentów instrukcji, 16-bitowy i wyższy
8-Bit Mnożenie:
; 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
Ale co się dzieje, gdy chcesz pomnożyć dwie liczby 16-bitowe? W jaki sposób jeden mnoży dwa 16-bitowe liczby w taki sam sposób, jak to było zrobione z liczbami 8-bitowymi?
Jestem zdezorientowany co do rejestrów, w których wartości będą przechowywane. Czy byłyby przechowywane w AL i AH, czy po prostu przechowują 16-bitową liczbę w AX. Aby pokazać, co mam na myśli:
; 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
Czy ktoś mógłby nieco opowiedzieć o tym, jak działa pomnożenie i dzielenie? (Konkretnie 16-bitowych i 32-bitowych liczb? Czy muszę obracać bity, jeśli wartości są przechowywane w dolnej AL i AH?
Albo można po prostu mov num1
i num2
do ax
i bx
odpowiednio, a następnie pomnożyć je aby otrzymać produkt w eax
Próbowałaś czytanie [documenta ] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –