关于汇编的乘除法

来自:    更新日期:早些时候
汇编程序乘除法计算~

qqq

把压缩BCD码转换成二进制数再进行乘除运算,把结果转换回压缩BCD码就是了


不进行数制转换,就用压缩BCD硬算,多字节无符号的...
你是要进行大数运算吧,先设计一个BCD格式,比如最多十位,二十位什么的,这样才能通用于所有的BCD运算,不然你BCD长度不一样程序就不通用了。

设计好BCD长度后,就模拟人工手算方式进行运算,你有一个1#数据定义和一个2#数据定义,以及一个3#数据定义存放结果。每个数据都是压缩BCD方式定义的多字节
乘:
取2#数最末位,与1#数最末位相乘,这得用MUL指令(完全杜绝二进制指令那你就累加),转换成BCD格式,结果放在3#数据里,然后与1#倒数第二位进行乘法运算,转换成BCD格式,结果与3#数据移位累加(你得设计出BCD格式的加法),一直到1#数据的所有位完成为止(也可以以1#数据位出现0为终止条件)
2#数最末位完成后,进行2#数的其它位乘法,具体与最末位过程是一样的。当所有位运算完后,3#结果存放的就是符合你要求的BCD格式的数据了。
除:
你得设计出BCD相减算法,用1#数据减2#数据,直到不够减为止,那时的减的次数是商,余下的就是余数了。

综上所述,要完成大数BCD码的乘除运算,没有相应的加减算法支持是不行的,因为按你的意思大数可能超出了32位(8086汇编还只是16位),也就是说,大于65535的BCD码相加你不能依靠机器自有加法指令,只好自己设计相关算法了。

具体加减方式也差不多,和手工相似:
加:
从最末位到第一位,提取各自的BCD码值进行数据相加,加的过程中你要处理进位情况
减:
从最末位到第一位,提取各自的BCD码值进行数据相减,减的过程中你要处理借位情况

当然,具体到编程中去可能没有说的这么简单,这只是个过程描述而已。

以前有本书好像是叫《80386协处理器数值编程》,时间太长了,除当时外也没再关注此书,所以不敢肯定,那上面就有BCD码+-*/的算法,好像也就十来位。你能找到最好,找不到我也没办法,那书早搞丢了。

还有个完成此类问题的思路,当然它也有局限性,那就是用浮点指令来进行运算,它的表示范围是计算机当前所能表示的最大范围,你设计一个浮点数与BCD码也好,二进制也好它们之间的双向转换算法,然后借用浮点指令进行运算,结果再转换回来,那本书也有此代码,不过很可惜,这点我帮不上你,而且可以告诉你,无论那种方法,汇编代码都不短

使用"MUL,BX"指令时候,乘数放在 bx 中,被乘数放在 ax 中,执行指令的结果放在 (dx,ax) 中.
使用除法"DIV BX"指令的时候,除数是 bx ,被除数是 dx:ax ,商是 ax,余数是 dx

问题:若是将BX改为别的存储器(如AX),结果是不是会发生改变?
解答:请注意ax已经被利用了,你不可能ax中同时放两个操作数!~

补充一下,(dx,ax)中dx保存高word,ax放低word,数据宽度为4 bytes
dx:ax也是一样,只是用来表示被除数,dx放高word,ax放低word,数据宽度为4 bytes


关于汇编的乘除法视频

相关评论:
  • 18994341254汇编语言里的IMUL乘法指令是怎么乘的?
    印伏崔看你的累加器是八位的还是十六位的,你的(A)=50H (B)=04H MUL AB是八位的两数相乘结果为140h,低八位在累加器A(=40h),多出的在寄存器B中(这里=1)。如果a=0feh,b=11h,则MUL AB后,a=0deh,b=10h。

  • 18994341254cpu不是只会作加法运算么,那么数学中的乘法除法怎么弄?
    印伏崔减法是采用补码进行的一种运算,是特殊的加法。至于除法,这个我实在没想清楚。不过,据说现在的cpu也有除法器了,听说也是移位器,具体的实在不清楚了,我也不是计算机专业的,汇编没学过啊 补充:刚查资料,通过汇编说明乘除法:乘法:被乘数移位加。模拟 16bits 乘法用 x86 汇编语句描述...

  • 18994341254...单片机的汇编中寄存器B是怎么用的,好像就在乘除法中用,请大师指点...
    印伏崔1. B可以作为一个普通寄存器使用,类似一个单元比如30H 2.在做一个字节的乘除法运算时,必需用B配合A完成 作乘法时,A和B相乘,结果低位在A中,高位在B中 作除法时,A是被除数,B是除数,结果A是商,B是余数 例如:A=42H,B=35H 作“ MUL AB ” 之后,A=0AAH,B=0DH 再如:A...

  • 18994341254谁能给我讲解下汇编的多字节乘除法啊?怎么看都看不懂!
    印伏崔TH1 TL1中,有 16 位二进制数,变换成十进制,即:0~65535。共五位,万、千、百、十、个。变换程序,就是下面这段:MOV R0,TL1 MOV R1,TH1 CLR A MOV R2,A MOV R3,A MOV R4,A MOV R5,#16 LOP:CLR C MOV A,R0 RLC A MOV R0,A MOV A,R1 RLC A MOV R1,A MOV A,R4 ADDC ...

  • 18994341254汇编中小问题
    印伏崔乘除法指令影响标志位的,但它对标志位的影响很复杂的,一般情况下都不讨论它,所以才说“无定义”如果你想研究,去Intel官网查查指令手册,手册对每条指令影响标志位的方式都有详细讲解的。

  • 18994341254汇编语言中的加减法~~~困扰我很久了。。有高人吗
    印伏崔加减法只有一套指令,因为这一套指令同时适用于有符号和无符号。下面这些指令:mul div movzx … 是处理无符号数的,而这些:imul idiv movsx … 是处理有符号的。举例来说:内存里有 一个字节x 为:0x EC ,一个字节 y 为:0x 02 。当把x,y当作有符号数来看时,x = -20 ,y = +2 。

  • 18994341254汇编问题,在线等待~~~
    印伏崔这是我自己编过项目中的多字节运算子程序 有加法,除法,减乘更为简单类推一下吧 注释写得很详细了,出口入口地址也有标记 ;n个数据相加子程序 ;11,13,15为进位。12,14,16为相加结果,分别为低8位、中、高8位 ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ADDP: MOV 11H,#00H MOV 1...

  • 189943412548051 单片机的乘除怎么运算
    印伏崔如果是C语言,直接用*代表乘,\/代表除就型了,如果是汇编语言,你看一下指令怎么运行的就行了,很简单.

  • 18994341254pic单片机汇编怎么实现 乘除运算
    印伏崔简单的2的倍数就是左移和右移了!复杂的就是转化为加法和减法了!

  • 18994341254汇编语言如何判断是有符号运算,还是无符号运算?
    印伏崔当然这只是其中的一种方法,具体的判断方法还要看具体的代码,这个一般不会出现太大的歧义,因为如果算法确定了的话,那么这个算法使用的变量的类型一般也就确定了.所以只要你能读懂代码,那这个运算的类型你也肯定能看出来 对于乘法和除法就简单了,直接从指令就能看出来,无符号的乘除是MUL和DIV,有符号的是...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网