Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131660
  • 博文数量: 38
  • 博客积分: 2050
  • 博客等级: 大尉
  • 技术积分: 471
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 15:49
文章分类

全部博文(38)

文章存档

2009年(1)

2008年(37)

我的朋友

分类: LINUX

2008-07-14 16:41:25

乘和除都可以用移位和加减来实现

乘数、被乘数都要先转化为二进制,二进制的乘法远比十进制简单,比如乘数是1011,只需将将被乘数分别左移3位、1位,移动后补入0,并将这三个数(被乘数左移3位的、被乘数左移1位的及未移位的被乘数)在累加器中相加,所得总和就是积,根据需要积可再转化为十进制。
除法与乘法类似,只不过将左移改为右移,加改成减。实际上减也是通过取补码后再加,因此计算机芯片上的累加器是最繁忙的部分。

原理问题,计算机算法  
   
  乘法:  
  被乘数移位加。   =======左移和加法可以实现乘法
  模拟   16bits   乘法用   x86   汇编语句描述如下:  
   
  xor   eax,eax  
  mov   ebx,16bits   data  
  mov   edx,16bits   data  
  mov   ecx,20H  
  clc  
  @@1:  
  shl   eax,1  
  rol   edx,1  
  jnc   @@2  
  add   eax,ebx  
  @@2:  
  loop   @@1  
  next:  
   
   
  除法:  
  被除数移位减。。。  
  模拟除法用   x86   汇编语句描述如下:  
  xor   eax,eax  
  mov   ebx,divisor  
  mov   edx,dividend  
  mov   ecx,20H  
  @@1:  
  shld   eax,edx,1  
  cmp   eax,ebx  
  jl   @@2  
  sub   eax,ebx  
  inc   edx  
  @@2:  
  loop   @@1  
  next:  
   
  ;   乘法的被乘数和乘数不需要区分  
  ;   除法的被除数和除数必须区分,这和串连移位所使用的寄存器有关。余数存储在   EAX,商存储在   EDX

  方法就是:  
    一,先把被除数放到一个寄存器中,比如,al中,再把ah赋0即被除数为ax  
  二,ax左移一位,将ah减去除数,结果为负用加法恢复上面的内容
阅读(7248) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~