首页
社区
课程
招聘
div的疑问
发表于: 2010-9-18 12:51 4353

div的疑问

2010-9-18 12:51
4353
DIV的疑问
摘抄 王爽汇编
DIV除法指令 注意事项
1 除数:有8位和16位两种,在一个REG或内存单元
2 被除数:默认放在AX 或 DX和 AX中,如果除数为8位,被除数则为16为默认在AX中存放,如果除数为16位,被除数最为32位,在DX和ax中存放,dx存放高16为,ax存放低16位
3 结果:如果除数为8为,则al存除法操作的商,ah存除法操作的余数;如果除数为16位,则ax储存操作的商,dx存储操作的余数

当被除数 大于65535 或 除数大于255 则 被除数为32除法 否则为16除法

问题是 FFFF/2            ffff<65535  2<255 为16除法

mov ax,0ffffh
mov bl,2
div bl

DEBUG提示 divide overflow
------------------------------------------------------------
不知道 我表达明白了吗

也这就是  FFFF/2  用汇编怎样写呢???

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=xtdhwl;859913]3 结果:如果除数为8为,则al存除法操作的商,ah存除法操作的余数;如果除数为16位,则ax储存操作的商,dx存储操作的余数
[/QUOTE]

x哥

FFFF/2

除数2存在bl中,al存放除法操作的商,FFFF / 2 = 7FFF,明显al存不下,当然得溢出拉

这样来吧

mov ax,0FFFFh
xor dx,dx
mov bx,2
div bx
2010-9-18 13:50
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
3
上面为什么要将dx清0的原因也是一样,因为dx的值未知,我们用bx存放除数,被除数是dx:ax
如果dx不为0,假设dx为0055h,被除数就是0055ffffh,0055ffffh / 2 = 002affffh
此时ax存放不下这个结果,也会溢出
2010-9-18 14:13
0
雪    币: 13
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
问题是 FFFF/2            ffff<65535  2<255 为16除法
上面我理解正确吗 如果正确那么
那么 FFFF/2  用汇编
mov ax,0ffffh
mov bl,2
div bl

AL占不下商7FFF造成溢出  但我们怎样去判断呢
电脑为我们做运算 总不能我们先运算在让电脑运算吧

除了下面的定义  还有什么来判断呢?
当被除数 大于65535 或 除数大于255 则 被除数为32除法 否则为16除法
2010-9-18 18:07
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
5
并不需要首先判断,执行的时候不是提示你overflow了吗?
任何一个程序员都不能保证它的程序绝不出错的
商和余数分别存放在哪里,是根据存放除数的寄存器或者内存单元的尺寸来决定的,与被除数的大小无关哦
2010-9-18 19:05
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
解决除法溢出
X:被除数,范围:[0,FFFFFFFF]

N:除数,范围:[0,FFFF]

H:X高16位,范围:[0,FFFF]

L:X低16位,范围:[0,FFFF]

int():描述性运算符,取商,比如,int(38/10)=10

rem():描述性运算符,取余数,比如,rem(38/10)=8

公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
这个是16位的除法公式8位的65536改为256

这些都是后面章节内容
2010-9-19 02:06
0
雪    币: 13
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢 两位的解答 心中暖暖的
2010-9-19 17:41
0
游客
登录 | 注册 方可回帖
返回
//