2013-12-10 17 views
6

Tôi đang học lắp ráp cho x86 bằng cách sử dụng giả lập DosBox. Tôi đang cố gắng thực hiện phép nhân. Tôi không hiểu cách nó hoạt động. Khi tôi viết mã sau:Có thể nhân ngay lập tức với mul trong x86 Assembly không?

mov al, 3 
mul 2 

Tôi gặp lỗi. Mặc dù, trong tài liệu tham khảo Tôi đang sử dụng, nó nói trong nhân, nó giả định AX luôn là người giữ vị trí, do đó, nếu tôi viết:

mul, 2 

Nó sẽ nhân al giá trị bằng 2. Nhưng nó không làm việc với tôi .

Khi tôi thử như sau:

mov al, 3 
mul al,2 
int 3 

tôi nhận được kết quả 9 trong rìu. Xem ảnh này để làm rõ: enter image description here

Một câu hỏi khác: Tôi có thể nhân trực tiếp sử dụng vị trí bộ nhớ không? Ví dụ:

mov si,100 
mul [si],5 

Trả lời

11

Không có hình thức MUL chấp nhận một toán hạng trực tiếp.

Hoặc làm:

mov al,3 
mov bl,2 
mul bl  ; the product is in ax 

hay:

mov ax,3 
imul ax,2 ; imul is for signed multiplication, but that doesn't matter here 
      ; the product is in ax 

hay:

mov al,3 
add al,al ; same thing as multiplying by 2 

hay:

mov al,3 
shl al,1 ; same thing as multiplying by 2 
+1

Nhận xét trong đoạn mã thứ hai của bạn sai. Sau 'imul axe, 2' sản phẩm nằm trong AX (không phải trong DX: AX). –

+1

Cũng lưu ý rằng 'imul'-tức là lệnh 3 toán hạng. Vì vậy, bạn có thể sử dụng nó không phá hủy, như 'imul cx, si, 1234'.Hầu hết các assembly cho phép bạn viết 'imul cx, 1234' thành viết tắt của' imul cx, cx, 1234', tương tự như viết 'vaddps ymm0, ymm1' thay vì' vaddps ymm0, ymm0, ymm1': ie khi dst = src1. –

2

Intel thủ

Các Intel 64 and IA-32 Architectures Software Developer’s Manual - Volume 2 Instruction Set Reference - 325383-056US September 2015 phần "MUL - Unsigned Multiply" cột Instruction chỉ chứa:

MUL r/m8 
MUL r/m8* 
MUL r/m16 
MUL r/m32 
MUL r/m64 

r/mXX phương tiện đăng ký hoặc bộ nhớ: vì vậy immediates (immXX) như mul 2 không được phép vào bất kỳ biểu mẫu: bộ vi xử lý chỉ đơn giản là không hỗ trợ hoạt động đó.

này cũng trả lời cho câu hỏi thứ hai: người ta có thể nhân lên bởi bộ nhớ:

x: dd 0x12341234 
mov eax, 2 
mul dword [x] 
; eax == 0x24682468 

Và cũng cho thấy lý do tại sao những thứ như mul al,2 sẽ không làm việc: không có hình thức mà phải mất hai đối số.

Như đã đề cập bởi Michael tuy nhiên, imul có các biểu mẫu tức thì như IMUL r32, r/m32, imm32 và nhiều hình thức khác mà mul thì không.

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