|
1、无符号除法 (DIV 指令)
DIV 指令用于无符号整数的除法操作。其格式如下:其中, divisor 是除数,它可以是 8 位、16位 或者 32 位寄存器或内存中的值。在执行 DIV 指令之前,被除数必须已经存储到 AX 寄存器 (对于 16 为值)、DX:AX 寄存器对 (对于 32 位值) 或者 EDX:EAX 寄存器对 (对于 64 位值)。
允许的除数的最大值取决于被除数的长度。对于 16 位被除数,除数只能是 8 位;对于 32 位被除数,除数只能是 16 位;对于 64 位被除数,除数只能是 32 位。
除法的结果是两个单独的数字: 商和余数 。 这两个值都存储在被除数值所使用相同的寄存器中,如下表所示:
被除数
| 被除数长度
| 商
| 余数
| AX
| 16位
| AL
| AH
| DX:AX
| 32位
| AX
| DX
| EDX:EAX
| 64位
| EAX
| EDX
|
需要注意的是,当除法操作完成时,会丢失被除数,所以要确保这不是这个值的唯一拷贝(除非在除法操作操作之后就不需要被除数的值了)。另外,结果会改变DX或EDX寄存器的值,所以也要小心其中存储的内容。
测试代码:
.section .data
dividend:
.quad 8335
divisor:
.int 25
quotient:
.int 0
remainder:
.int 0
output:
.asciz "The quotient is %d, and the remainder is %d\n"
.section .text
.global _start
_start:
nop
movl dividend, %eax
movl dividend+4, %edx
divl divisor
movl %eax, quotient
movl %edx, remainder
pushl remainder
pushl quotient
pushl $output
call printf
add $12, %esp
pushl $0
call exit 编译连接运行输出:$ ld -dynamic-linker /lib/ld-linux.so.2 -lc -o div div.o
$ ./div
The quotient is 333, and the remainder is 10 说明:
上面,由于除数是 int 类型,是 32 位整数,所以被除数要 64 位,故用 .quad 来声明,而将其从内存中拷贝到寄存器时,要注意 movl 一次只是移动 32 位,从而需要两个 movl 。 |
|