2012-03-20 42 views
9

Tôi khá bối rối về cách thức hoạt động nhân và chia làm việc trong lắp ráp x86. Ví dụ: mã bên dưới dường như không quá khó vì giao dịch với 8 bit.x86 lắp ráp nhân và chia toán hạng lệnh, 16 bit và cao hơn

8-Bit Nhân:

; 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 

Nhưng điều gì sẽ xảy ra khi bạn muốn nhân hai số 16-bit? Làm thế nào sẽ nhân hai số 16 bit theo cùng một cách như nó đã được thực hiện với các số 8 bit?

Tôi nhầm lẫn với những gì đăng ký các giá trị sẽ được lưu trữ. Chúng sẽ được lưu trữ trong AL và AH hoặc nó sẽ chỉ lưu trữ số 16 bit trong AX. Để hiển thị ý tôi:

; 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 

Ai đó có thể giải thích một chút về cách nhân và chia làm việc? (Đặc biệt là với những con số 16-bit và 32-bit? Liệu tôi có cần phải xoay bit nếu các giá trị được lưu trữ trong AL thấp hơn và AH?

Hoặc có thể một cách đơn giản mov num1num2 vào axbx tương ứng và sau đó nhân chúng để có được những sản phẩm trong eax

+2

bạn đã thử đọc [documenta tion] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –

Trả lời

14

Nhìn lướt qua các documentation cho thấy rằng có 4 kích thước toán hạng có thể cho MUL các đầu vào và đầu ra được tóm tắt trong một bảng tiện dụng:?.

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

Tôi đã xem xét điều đó và đã biết vị trí được lưu trữ sau 'mul'. Tôi tự hỏi, nếu tôi lưu trữ giá trị trong 'eax' (trước khi' mul') nếu nó lưu trữ nó trong bit thấp hơn (AL và AH) chứ không phải là bit cao hơn (AX). Nếu nó lưu trữ chúng trong các bit thấp hơn, tôi có thể xoay chúng thành AX và sau đó chỉ nhân AX và BX và in ra câu trả lời (tôi tin rằng nó sẽ có trong EAX)? – StartingGroovy

+0

Nếu bạn lưu trữ một giá trị trong 'eax', nó nằm trong * tất cả * của' eax'. Tôi không chắc là tôi hiểu. Tôi nghĩ bạn có thể bối rối những phần của 'eax' là' ah', 'al', và' ax' nữa. Bạn có thể xem biểu đồ trong tập 1 của cùng một tài liệu. Cụ thể, 'ax' đề cập đến 16 bit giống như' ah: al', không phải là "trên" 16 bit của 'eax'. –

+0

Ah bạn là chính xác, đó là những gì tôi đã nhầm lẫn về. Vì vậy, về cơ bản những gì tôi muốn làm là nhân 'AX' bởi' BX' và sản phẩm của tôi phải ở trong 'EAX'? – StartingGroovy

Các vấn đề liên quan