请问谁有8位/8位的除法汇编代码呢?

eeb 2007-05-18 11:11:47
请问谁有8位/8位的除法汇编代码呢?不需要求余数的。
...全文
615 16 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
不需要余数就是整除了,用比较大小就可以了,注意中间的累加问题!其实整除完成,余数自然就知道了

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧