2011-11-22 73 views
6

Tôi đang học về phân chia trong ngôn ngữ assembly. Theo cuốn sách tôi đang học từ, kết quả của hoạt động idiv được đặt trong eax và phần còn lại trong edx.Cách triển khai toán tử mod trong assembly

Bài tập trong sách là để triển khai number = result % divisor khi lắp ráp.

Tôi đã nghĩ rằng điều này sẽ tương đương với hoạt động chia bình thường ngoại trừ edx sẽ là kết quả.

Điều này không hoạt động tuy nhiên và edx trở lại dường như là rác.

Tại sao? Làm thế nào để bạn thực hiện mã giả ở trên trong lắp ráp?

+4

Tôi sẽ mã hóa một hàm C nhỏ xíu, và nhìn vào hội đồng được tạo ra (ví dụ với 'gcc -O -fverbose-asm -S tiny.c') –

+2

Câu hỏi của bạn tương tự như http://stackoverflow.com/questions/8021772/assembly-language-how-to-do-modulo/8022107 Hiển thị mã thực sự của bạn nếu bạn gặp sự cố cụ thể (rất có thể bạn không xóa phần trên của rdx: rax, edx: eax hoặc dx: rìu). – user786653

+0

Khó đoán mà không nhìn thấy mã, nhưng một lỗi phổ biến là quên không edx trước idiv. –

Trả lời

15

Integer modulo thể được thực hiện theo hai cách:

Thứ nhất bằng cách sử dụng DIV hoặc IDIV, nơi phần còn lại sẽ được đưa vào EDX, nhưng bạn cần phải zero EDX đầu tiên, hoặc để trích dẫn intel:

Kích thước toán tử ----------- | Cổ tức | Divisor | Quotient | Còn lại

Từ/từ kép | EDX: EAX | r/m32 | EAX | EDX.

ví dụ:

eax = eax % 9 

khi unsigned trở thành:

XOR EDX,EDX ;clear the destinations for outputs. this stops the garbage remainder  
MOV ECX,9 
DIV ECX 
MOV EAX,EDX 

khi ký kết, đó là:

MOV ECX,9 
CDQ ;this will clear EDX due to the sign extension 
IDIV ECX 
MOV EAX,EDX 

Cách thứ hai là một tối ưu hóa sử dụng khi bạn modulo sử dụng một sức mạnh của hai, trong trường hợp này bạn AND bởi o ne ít hơn sức mạnh của hai, ví dụ: eax = eax % 8 trở thành AND EAX,7.

+0

Vì idiv là phiên bản đã ký, bạn có nên CDQ thành edx không? – harold

+0

Tôi đã cố xóa câu hỏi của mình nhưng bạn đã trả lời. Tôi chỉ muốn lưu ý rằng nó có thể thay đổi một chút công bằng sau khi tôi thêm một ví dụ mã. –

+0

@harold: ye, quên điều đó, bắt tốt :) – Necrolis

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