社区
汇编语言
帖子详情
请问谁有8位/8位的除法汇编代码呢?
eeb
2007-05-18 11:11:47
请问谁有8位/8位的除法汇编代码呢?不需要求余数的。
...全文
615
16
打赏
收藏
请问谁有8位/8位的除法汇编代码呢?
请问谁有8位/8位的除法汇编代码呢?不需要求余数的。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ahjoe
2007-05-28
打赏
举报
回复
难道现在的CPU都不支持 div ?
Jerry3385
2007-05-24
打赏
举报
回复
mark
paullbm
2007-05-22
打赏
举报
回复
謝謝liangbch(宝宝)兄的賜教!!!
liangbch
2007-05-21
打赏
举报
回复
若 n1是一个8bit的数,n2也是一个8bit的数且n2不等于0,则n1/n2的商至多是一个8bit的数,我们定义n1/n2=c,则 n1=n2 * c+ r (r<n2,r是余数)
c的2进制表示为 "b7 b6 b5 b4 b3 b2 b1 b0", b0到b7为0或者1 则 c= 2^7 *b7 + 2^6 *b6 + 2^5 * b5 +.. 2^1 *b1 + 2^0 *b0
所以:n1= n2 * 2^7 *b7 + n2 * 2^6 *b6 + n2 *2^5*b5 + ...n2* 2^1 *b1 + n2* 2^0 *b0
在我的程序中,
cl: 当前商(初值为2^7,以后逐次除以2),
ch: 商
bx:除数乘以当前商的积(部分积),等于 n2* cl,初值等于 n2 *2^7,以后逐次除以2。
在循环过程中,依次将 被除数(余数)与 部分积(n2 * cl) 比较,如被除数(余数)大于部分积,则将商加上部分商 并将 余数减去部分积,直到余数小于除数为止。
paullbm
2007-05-20
打赏
举报
回复
把liangbch(宝宝)的代码转换一下就是:
=====================================
data segment
n1 db 34
n2 db 7
n3 db ? ;存放n1/n2的商
data ends
code segment
assume cs:code,ds:data
main:
mov ax,data
mov ds,ax
mov ax,0
mov bx,0
mov cx,0
mov al,n1
mov bl,n2
mov cl,7
shl bx,cl
mov cl,80h
loop1:
cmp ax,bx
jb next
sub ax,bx
add ch,cl
next:
shr bx,1
shr cl,1
cmp al,n2
jae loop1
mov n3,ch
mov ah,4ch
int 21h
code ends
end main
===============================
liangbch(宝宝)果然厉害。在下想问一下,请问这个算法是根据什么规律或公式而实现的呢?
liangbch
2007-05-20
打赏
举报
回复
当时写完后就发现这个bug了,将这段代码修改一下就好了。
原来的代码
or ax,ax
jnz loop1
修改为:
cmp al,n2
jae loop1
mengshijie_1981
2007-05-20
打赏
举报
回复
8bit/8bit除法,下面的方法就可以了,AL中存放被除数,BL中存放除数,商放在AL中。(余数在AH中,你可以不理会它)
无符号除法:
MOVZX AX,AL
DIV BL
有符号除法:
MOVSX AX,AL
IDIV BL
paullbm
2007-05-20
打赏
举报
回复
liangbch(宝宝)
我下面的代码则最多只需要8次循环(8bit需要8次循环,如果是16bit需要16次循环),没有汇编环境,写一个vc++程序,请自行修改为汇编程序。
=========================================
int div8(unsigned char n1,unsigned char n2)
{
_asm
{
mov ax,0
mov bx,0
mov cx,0
mov al,n1
mov bl,n2
shl bx,7
mov cl,80h
loop1:
cmp ax,bx
jb next
sub ax,bx
add ch,cl
next:
shr bx,1
shr cl,1
or ax,ax
jnz loop1
thisExit:
mov al,ch
}
}
int main(int argc, char* argv[])
{
unsigned char n1,n2,n3;
n1=35;
n2=7;
n3=div8(n1,n2);
printf("%d/%d=%d\n",n1,n2,n3);
return 0;
}
============================
经检验,发现当n1/n2的余数只比n2小于1时,程序会出现异常!!!
比如:
n1=34,n2=5时
商为6,余数为4
这时就会出现问题!!
eeb
2007-05-18
打赏
举报
回复
不能使用DIV指令的
paullbm
2007-05-18
打赏
举报
回复
但是據在下所知,
DIV指令要麼是16/8位的
要麼是32/16位的
這都涉及到商和余數了。。
當然,有沒有余數取決於除數和被除數的關系!!!
16/8位的完全可以把分子的高8位設為0,這樣就相當於是8/8位的了!!
eeb
2007-05-18
打赏
举报
回复
paullbm:我是初学汇编的,想要最简单的除法代码。只要8位/8位的,而且不用求余数。你能帮我写一下吗?
paullbm
2007-05-18
打赏
举报
回复
16位/8位的難道達不到你的要求嗎??
大熊猫侯佩
2007-05-18
打赏
举报
回复
循环减或我blog上由关于大整数四则运算的算法推出的算法
liangbch
2007-05-18
打赏
举报
回复
楼上的虽然算法简单,但是太慢了,如果计算 255/1,需要255次循环,我下面的代码则最多只需要8次循环(8bit需要8次循环,如果是16bit需要16次循环)
没有汇编环境,写一个vc++程序,请自行修改为汇编程序。
int div8(unsigned char n1,unsigned char n2)
{
_asm
{
mov ax,0
mov bx,0
mov cx,0
mov al,n1
mov bl,n2
shl bx,7
mov cl,80h
loop1:
cmp ax,bx
jb next
sub ax,bx
add ch,cl
next:
shr bx,1
shr cl,1
or ax,ax
jnz loop1
thisExit:
mov al,ch
}
}
int main(int argc, char* argv[])
{
unsigned char n1,n2,n3;
n1=35;
n2=7;
n3=div8(n1,n2);
printf("%d/%d=%d\n",n1,n2,n3);
return 0;
}
paullbm
2007-05-18
打赏
举报
回复
不能使用div指令?那就用循環減法!
比如 十進數100/5
100每次減去一個5,然后計數器(初始為零,也可以是商)加1,得到的差再與5比較,如果相比一直比5大,則一直循環。直到得到的差小於5或等于0則跳出循環!!
最後得到的計數器的值其實就是100/5的商(即為20)!!!
rockefeller8
2007-05-18
打赏
举报
回复
不需要余数就是整除了,用比较大小就可以了,注意中间的累加问题!其实整除完成,余数自然就知道了
C++64位游戏逆向/
汇编
与反
汇编
课程概述教程咨询售后QQ1026165915课程概述█课程初衷力求以实战项目的方式一步步进入逆向的世界█ 课程内容全套从0开始,还原实战真实场景█ 课程答疑1.问:课程内容质量是否有保障?答:每集课程精心打磨2.问:课程包含指导吗?答:课程内容包含全程指导答疑,购买后会自动进入学习交流区群,可以随时给老师留言提问。包括课程所需各种工具,3.问:除了目录上面的内容,课程还有有更新补充吗?答:因游戏软件更新等,课程会及时进行更新补充。4.问:课程讲述内容连贯吗?答:课程讲述内容,连贯一致,是对X64游戏的完整分析,并非是东打一枪西晃一棍。5.问:如果我电脑配置低,大型64位网络游戏很占资源,我学习起来不怎么方便怎么办?答:联系老师,老师会教你优化CPU、优化内存,使你的电脑能够正常跟随课程学习。6.问:购买后,课程能学习多久?答:课程因为存在版权,所以不能翻录。但是购买后,至少5年都能够随到随学的,课程购买页面有描述说明。7.问:0基础可以学习吗?答:
汇编
逆向部分,不需要任何基础即可学习,C++部分,知道最基础的if else、for循环等即可。如果对编程完全不了解,也可联系老师,3-7天即可掌握最基础部分。
汇编
除法
运算
汇编
的
除法
指令是div, 实际上相对高级语言的
除法
,
汇编
指令的div是同时得到商和余数的, 结果分别保存在不同的寄存器. 除数: 有
8位
和16位两种, 在一个寄存器或者内存单元中 被除数: 如果除数是
8位
则被除数为16位, 默认放在AX中, 如果除数是16位, 则被除数为32位, 默认高位放在DX, 低位放在AX 结果: 如果除数是
8位
, 那么执行div后, 余数存放在AH, 商存放在AL中; 如
汇编
实现32位无溢出的
除法
子函数(详细注释)
最近在学习《王爽
汇编
》,其中一个作业是编写子程序实现
除法
溢出问题。 描述如下:
汇编
语言中div可以实现
除法
,当进行
8位
除法
(被除数16位,除数
8位
,结果
8位
)时,商存在al中,余数存在ah中;进行16位
除法
(被除数32位,除数16位,结果16位,商16位)时,商存在ax中,余数存在dx中。 假设一个16位
除法
10000h/1 显然,结果是10000h。可系统默认的16位
除法
结果是16位数,但结果10000h显然是溢出的(65536>65535)。改进策略是拓展结果的长度,也就是被除数32位,除数
无符号整数
除法
器:16位除
8位
无符号整数
除法
器:16位除
8位
备注:在写testbench时发现reg型变量是有符号的补码形式。使用{$random}%b产生无符号随机数,除数被除数依旧可能取值为负数;然后手动输入大于2^7=128的数作为除数,发现发生溢出,除数被当作负数,这才发现此时reg型变量应该是被当作了有符号数的补码形式。一般认为reg型变量为无符号型变量,有出入,特此记录。 源
代码
//unsigned 16bit/8bit module unsignediv(divee,divor,result,odd); input [
汇编
语言 乘法和
除法
指令
除法
指令 DVI无符号数
除法
指令 指令格式:DIV 源 指令功能:对两个无符号二进制数进行
除法
操作。源操作数可以是字或字节。 如果源操作数为字节,16位被除数必须放在AX中,
8位
除数为源操作数,它可以是寄存器或存储单元。相除之后,
8位
商在AL中,余数在AH中。即 AL ← AX/源(字节)的商 AH ← AX/源(字节)的余数 要是被除数只有
8位
,必须把它放在AL中,并将AH清0,然后相除。 如果源操作数为字,32位被除数在DX、AX中,其中,DX为高位字,16位除数作源操作数,它可
汇编语言
21,459
社区成员
41,601
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章