8051汇编:双字节无符号数乘单字节数相关问题咨询
8051汇编程序问题解答
问题1:双字节数具体是多少?
你猜测的43是错误的,双字节数的组成逻辑是最高有效字节(MSB)×256 + 最低有效字节(LSB)——因为每个字节占8位,代表0-255的数值,高位字节需要左移8位(即乘256)后和低位字节相加。
给定MSB=4,LSB=3,计算得:4 × 256 + 3 = 1027
这个双字节数是十进制1027,对应十六进制为0403H。
问题2:与16相乘后的结果及乘法过程
乘法过程(结合汇编代码分析)
子程序MUL21实现的是双字节数(R1,R0)和单字节数(R2)的乘法,结果存放在三字节寄存器R6(最高位)、R5(中间位)、R4(最低位),步骤如下:
- 计算低位字节×乘数:
- 将R0(3)和R2(16)放入A、B寄存器执行
mul AB,得到3×16=48 - 乘积的低字节(48)存入R4,高字节(0)存入R5,此时R5=0,R4=48
- 将R0(3)和R2(16)放入A、B寄存器执行
- 计算高位字节×乘数并累加:
- 将R1(4)和R2(16)放入A、B寄存器执行
mul AB,得到4×16=64 - 乘积的低字节(64)和之前的R5(0)相加,结果64存入R5
- 乘积的高字节(0)加上进位(此处加法无进位,进位为0),结果0存入R6
- 将R1(4)和R2(16)放入A、B寄存器执行
- 最终三字节结果:R6=0,R5=64,R4=48
最终结果
将三字节转换成十进制:0 × 65536 + 64 × 256 + 48 = 16384 + 48 = 16432
也可以直接用双字节数1027×16=16432(乘16等价于二进制左移4位,和汇编计算逻辑一致),用24位数值表示为十六进制00 40 30H或十进制16432。
附完整汇编代码
;main.s03 name MAIN extern _R,MUL21 rseg CODE mov PSW,#_R mov SP,#BSTACK-1 mov R0,#3 ;number 1, lsb mov R1,#4 ; msb mov R2,#16 ;number 2 lcall MUL21 ;result R6,R5,R4 sjmp $ rseg ISTACK BSTACK: ds 8 end ;mul21.s03 name MUL21 extern _R public MUL21 rseg CODE MUL21: mov A,R0 mov B,R2 mul AB mov R4,A mov R5,B ;R5,R4=R0*R2 mov A,R1 mov B,R2 mul AB add A,R5 mov R5,A mov A,B addc A,#0 mov R6,A ;R6,R5+=R1*R2,R4 ret end
内容的提问来源于stack exchange,提问作者HaxerOne
相关产品推荐
相关产品推荐

