社区
汇编语言
帖子详情
请问谁有8位/8位的除法汇编代码呢?
eeb
2007-05-18 11:11:47
请问谁有8位/8位的除法汇编代码呢?不需要求余数的。
...全文
635
16
打赏
收藏
请问谁有8位/8位的除法汇编代码呢?
请问谁有8位/8位的除法汇编代码呢?不需要求余数的。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
不需要余数就是整除了,用比较大小就可以了,注意中间的累加问题!其实整除完成,余数自然就知道了
51单片机:有符号/无符号双字节
除法
汇编
程序(超详细)
DIV只能用于两个单字节之间的
除法
,有时处理的数据是双字节大小,就需要单独写出双字节
除法
子程序。 实现的原理还是简单的列式模拟,但是
汇编
的细节更多。对熟练掌握
汇编
需要对二进制运算和移位操作非常熟悉。 >>过程注释写的非常详细了 ;有符号双字节数
除法
子程序 SIDIV ;正负数均用原码表示 ;需要 UIDIV 子程序 ;被除数存R6、R7,除数存R4、R5 ;运算完成后,R6、R...
汇编
除法
运算
汇编
的
除法
指令是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位,除数
汇编
语言的
除法
计算
【
代码
】
汇编
语言的
除法
计算。
汇编
语言-实现
除法
与乘法
分析:100001D=186A1H,100D=64H,被除数大于16位,需要用2个寄存器,将1放在DX中,将86A1放在AX中,示例3:在内存单元中使用
除法
,用div计算data段中第一个数据除以第二个数据后的结果,商存放在第3个数据的内存单元中。示例1:计算100 * 10,分析:100和10小于
8位
(255),可以做
8位
乘法,注意在debug中默认是十六进制。分析:1001D = 03E9H,100D= 64H,用一个寄存器即可,被除数放在AX中。除数:
8位
或16位,在寄存器或内存单元中。
汇编语言
21,497
社区成员
41,618
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章