Có cái gì đó giống như một toán tử modulo trong x86 Assembler?Ngôn ngữ lắp ráp - Cách thực hiện Modulo?
Trả lời
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.
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 –
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ù!
http://stackoverflow.com/questions/4361979/calculating-modulo-in-assembly –