ZKX's LAB

汇编两数相乘寄存器 汇编语言,两数相乘或相加帮忙解释

2020-07-24知识6

各位高手,我想求教汇编中MUL指令的用法,我的单片机寄存器是8位的,现在有两个16位的数相乘, mul指令是乘法指令。使用mul做乘法的时候:1)两个相乘的数:两个相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另外一个存放在8为寄存器或字节内存。汇编语言中的乘法指令为什么两数位数相同 两个相乘的数2113,要么都是52618位,要么都是16位。为什么呢?解4102释如下:按照规定1653,如果是8位相乘,一个默认存储在AH中,另一个存储在8位寄存器或者内存字节单元中,计算结果默认放在AX中;如果是16位相乘,一个默认存储在AX中,另一个存储在16位寄存器或者内存字单元中,计算结果默认高位放在DX,低位放在AX中。我们来假设一下,如果是8位和16位相乘,CPU怎么执行:如果是8位和16位相乘,那么假设你的8位存储在AH中,16位存储在一个16位的寄存器或者内存字单元中(我们假设存储在BX中),在CPU执行到语句:MUL BX 的时候,那么此时CPU看到是在与一个16位数相乘(因为BX是16位寄存器,存储的是16位的数),CPU就会默认将AX中的16位数与BX的数相乘,而不是与AH中的数相乘,这样不就混乱了吗?如果是8位和16位相乘,反之假设你的16位存储在AX中,8位存储在一个8位的寄存器或者内存字节单元中,最后CPU还是会如上一个假设那样瞎计算,楼主也会很郁闷啊~所以,两个相乘的数,要么都是8位,要么都是16位,本质上这是我们人和CPU的一个计算约定,CPU只会按照人定的规则办事。汇编语言把两个寄存器中的32位无符号二进制数相乘,其乘积仍在两个寄存器中,代码怎么写 ;32位×32位 乘法,结果 64位。这是有别于你题目的另一种算法,供参考!CODE SEGMENTASSUME CS:CODEX DD 111111DD 0;增加 这个是为了左移时有空间Y DD 11111Z DD 2 DUP(0)START:PUSH CSPOP DSPUSH CSPOP ESMOV CX,320:SHR WORD PTR Y+2,1RCR WORD PTR Y,1JNC@1MOV AX,WORD PTR XADD WORD PTR Z,AXMOV AX,WORD PTR X+2ADC WORD PTR Z+2,AXMOV AX,WORD PTR X+4ADC WORD PTR Z+4,AXMOV AX,WORD PTR X+6ADC WORD PTR Z+6,AX1:SHL WORD PTR X,1RCL WORD PTR X+2,1RCL WORD PTR X+4,1RCL WORD PTR X+6,1LOOP@0MOV AH,4CHINT 21HCODE ENDSEND START汇编语言,两数相乘或相加帮忙解释 这够详细了如果哪里不懂,你指出来吧!CRLF宏定义功能:回车换行CRLF MACROMOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHMOV AH,02HINT 21HENDMDATA SEGMENTDATA1 DB 5 DUP(0)DATA2 DB 5 DUP(0)RESULT DB 6 DUP?DATA ENDSSTACK SEGMENT PARA STACK 'STACK'STA DB 20 DUP?TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AX;初始化数据段寄存器MOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AX;这个紧随MOV SS,AX较妥当,所以MOV SP,TOP就好,SP又不是段寄存器MOV SI,OFFSET DATA2MOV BX,05CALL INKEY;输入DATA2,之所以先输入DATA2,是为了在ADDA之前少一个MOV SI,OFFSET DATA1CRLF;宏调用换行,下同MOV SI,OFFSET DATA1MOV BX,05CALL INKEYCRLFMOV DI,OFFSET DATA2CALL ADDA;加法MOV SI,OFFSET DATA1MOV BX,06CALL DISPL;显示输出CRLFMOV AX,4C00HINT 21HDISPL子程序定义功能:打印字符串参数:SI=字符串首地址BX=字符串长度NONEDISPL PROC NEARDS1:MOV AH,02MOV DL,[SI+BX-1]INT 21HDEC BXJNZ DS1RETDISPL ENDPINKEY子程序定义功能:输入字符串参数:SI=字符串首地址BX=。汇编语言两数相乘 先看看这个,还没看你的程序,可能就是BCD与ASCII运算的问题,你自己看了检查一下.有问题可以再讨论十进制调整指令80x86微型机提供了一组十进制调整指令,用来处理ASCII码和BCD码表示的数。BCD码:BCD(Binary Coded Decimal)是用二进制编码表示的十进制数(见表3.3),十进制数采用0~9十个数字,是人们最常用的。在计算机中,同一个数可以用两种BCD格式来表示:①压缩的BCD码 ②非压缩的BCD码压缩的BCD码:压缩的BCD码用4位二进制数表示一个十进制数位,整个十进制数用一串BCD码来表示。例如,十进制数59表示成压缩的BCD码为0101 1001,十进制数1946表示成压缩的BCD码为0001 1001 0100 0110。非压缩的BCD码:非压缩的BCD码用8位二进制数表示一个十进制数位,其中低4位是BCD码,高4位是0。例如,十进制数78表示成压缩的BCD码为0000 0111 0000 1000。从键盘输入数据时,计算机接收的是ASCII码,要将ASCII码表示的数转换成BCD码是很简单的,只要把ASCII码的高4位清零即可。压缩的BCD码调整指令DAA和DAS指令完成加法和减法的调整功能。DAA 加法的十进制调整(decimal adjust for addition)执行操作:(AL)←把AL中的和调整为压缩的BCD格式DAS 减法的十进制调整。两个32位有符号数相乘,汇编实现。 你用来保存32位有符号数必须是四个8位的寄存器,也就是说比如第一个数用了寄存器A,B,C和D,第二个数用E,F,G和H。你的结果肯定需要8个8位寄存器,比如说是Z1,Z2,Z3,.Z8.你肯定没有这么多寄存器,你可以把结果直接放到内存。首先判断两个符号的正负,32位的最高位与一下就好了,你可以把A和E做一个与操作,然后把结果,就是最高位直接赋给结果。第二,把A和E的最高位变成0,也就是接下来做两个31位无符号数的乘法。最简单的办法是就像竖式算乘法一样:A B C DE F G H(ABCD)*H(ABCD)*G(ABCD)*F(ABCD)*EZ1.Z8就像小学学乘法的时候一样,乘完了记得移位然后相加。中间步骤都可以先写到结果里面。比如(ABCD)*H可以先把D*H,得到的结果肯定保存在DH和DL,那么DL肯定是最低8位的结果,把DH拿出来暂存在另外一个寄存器里面,然后计算C*H,结果一定还是在DH和DL里面,把刚才暂存的结果和DH相加,就是(ABCD)*H的第低15-8位的结果,依次类推。这个算法比较慢,如果有时间建议看看Karatsuba乘法,是一个俄国人写的,速度提升25%。如果只为了写作业,32位乘法,这个就行了。各位高手,我想求教汇编中MUL指令的用法,我的单片机寄存器是8位的,现在有两个16位的数相乘, MUL 指令只有一种用法即:MUL AB 即累加器A与寄存器B相乘,结果保留到A和B中如果是两个16位相乘,那么需要编制一个小函数来实现了。双字节无符号数乘法程序(R3R4*R6R7)=(R5R2R3R4)入口:R3,R4,R6,R7占用资源:ACC,B堆栈需求:2字节出口:R5,R2,R3,R4NMUL22:MOV A,R4MOV B,R7MUL ABXCH A,R4MOV R5,BMOV B,R6MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R2,AMOV A,R3MOV B,R7MUL ABADD A,R5MOV R5,AMOV A,BADDC A,R2MOV R2,ACLR AADDC A,#00HXCH A,R3MOV B,R6MUL ABADD A,R2MOV R2,AMOV A,BADDC A,R3XCH A,R5MOV R3,ACLR OVRET汇编语言两个字相乘要怎么才能存储在一个双字里 利用指令MUL。将被乘数放入AX,乘数放在一个字寄存器中或者内存单元里,然后相乘。如下所示:MUL SRC;SRC放乘数,被乘数已经在AX中了。所得结果是一个双字的整数。低字节的部分在AX中,高字节的部分在DX中。使用时,只要将这两个部分拼在一起就可以了。

随机阅读

qrcode
访问手机版