2011-11-05 45 views

Trả lời

54

Hướng dẫn DIV (và đối số IDIV cho các số đã ký) cung cấp cả thương và số dư (modulo). DIV r16 chia số 32 bit trong DX:AX bởi toán hạng 16 bit và lưu lại thương số trong AX và số còn lại trong DX.

Ví dụ:

mov dx, 0  
mov ax, 1234 
mov bx, 10 
div bx  ; Divides 1234 by 10. DX = 4 and AX = 123 

Trong 32-bit lắp ráp bạn có thể làm div ebx để chia một toán hạng 64-bit trong EDX:EAX bởi EBX. Xem Intels Architectures Software Developer’s Manuals để biết thêm thông tin.

+2

Nhưng GCC không sử dụng div vì nó chậm: http://stackoverflow.com/questions/4361979/how-does- the-gcc-implementation-of-module-work-và-why-does-it-not-use-the –

13

Nếu bạn tính modulo công suất của hai, sử dụng bitwise AND đơn giản hơn và thường nhanh hơn so với thực hiện phân chia. Nếu b là sức mạnh của hai, a % b == a & (b - 1).

Ví dụ: hãy lấy một giá trị trong sổ đăng ký EAX, modulo 64.
Cách đơn giản nhất là AND EAX, 63, bởi vì 63 là 111111 ở dạng nhị phân.

Chữ số đeo mặt nạ, chữ số cao hơn không được chúng tôi quan tâm. Hãy thử nó!

Tương tự, thay vì sử dụng MUL hoặc DIV với quyền hạn hai, bit dịch chuyển là cách để thực hiện. Hãy coi chừng số nguyên đã ký, mặc dù!

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