曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5904|回复: 1
打印 上一主题 下一主题

除法及其指令

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2010-1-31 17:37:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、无符号除法 (DIV 指令)
DIV 指令用于无符号整数的除法操作。其格式如下:
div divisor
其中, 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 。

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2010-2-9 00:17:07 | 只看该作者

带符号除法

IDIV 指令用于带符号整数的除法操作。它的用法和 DIV 指令完全一样,且只有一种格式:
idiv divisor
其中,divisor 可以是 8 位、16 位或者是 32 位寄存器或内存中的值。
IDIV 指令把结果返回和 DIV 指令相同的寄存器中,并且商和余数的格式也相同(除了结果是带符号整数外)。

带符号整数除法,余数的符号总是与被除数的符号相同。

带符号除法要注意被除数的长度,因为它必须是除数长度的两倍,所以有时必须把整数值扩展为适当的数据长度。使用符号扩展指令把被除数扩展为适当的长度是很重要的。扩展操作的失败将导致错误的被除数值,并且在结果中产生错误。


在除法中,如果发生除以 0 的情况,或者商 (或余数) 溢出目标寄存器。发生这样的错误时,系统会发生中断,还会在 linux 系统中产生一个错误,如提示: Floating point exception 。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-15 03:04 , Processed in 0.099542 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表