2012-03-20 13 views
9

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

+2

Próbowałaś czytanie [documenta ] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –

Odpowiedz

14

szybki rzut oka na documentation pokazuje, że istnieją 4 możliwych rozmiarach operand dla MUL wejścia i wyjścia są zestawione w poręcznej tabeli:?.

------------------------------------------------------ 
| 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  | 
------------------------------------------------------ 
+0

Spojrzałem na to i wiedziałem, gdzie wartość jest przechowywana po 'mul'. Zastanawiam się, czy, kiedy przechowuje wartość w 'eax' (przed' mul'), jeśli przechowuje go w dolnym bitów (AL i AH) zamiast wyższych bitów (AX). Jeśli przechowuje je w dolnych bitach, czy jestem w stanie obrócić je do AX, a następnie pomnożyć AX i BX i wydrukować odpowiedź (myślę, że byłoby to w EAX)? – StartingGroovy

+0

Jeśli przechowujesz wartość w 'eax', to jest to * all * of' eax'. Nie jestem pewien, czy rozumiem. Myślę, że możesz być mylące, które części 'eax' to także' ah', 'al' i' ax'. Możesz zobaczyć wykres w tomie 1 tej samej dokumentacji. W szczególności "ax" odnosi się do tych samych 16 bitów co 'ah: al', a nie" upper "16-bitów' eax'. –

+0

Ach, masz rację, o to mi chodziło. Więc zasadniczo chciałbym pomnożyć 'AX' przez' BX', a mój produkt powinien być w 'EAX'? – StartingGroovy

Powiązane problemy