汇编 8051 将无符号 2 字节数字乘以 1 字节数字

问题描述 投票:0回答:1

我正在处理学校的汇编任务。我们有 3 个项目,这是其中之一。我正在尝试回答问题,但是如果之前了解有关汇编程序的任何知识,那就容易多了(无论听起来多么废话,我们的老师确实没有教我们任何东西)。

假设 2 字节数字包含 3 (lsb) 和 4(msb):

  1. 这个数字会是什么样子?
  2. 将所得数字与数字 16 相乘,结果会是什么样子? (程序的最终答案到底是什么)

理解乘法的实际工作原理会更容易,因为我必须将最终值投影为 24 位数字。

1 ;main.s03
2
3 name MAIN
4 extern _R,MUL21
5 rseg CODE
6 mov PSW,#_R
7 mov SP,#BSTACK-1
8
9 mov R0,#3 ;number 1, lsb
10 mov R1,#4 ; msb
11 mov R2,#16 ;number 2
12 lcall MUL21 ;result R6,R5,R4
13
14 sjmp $
15
16 rseg ISTACK
17 BSTACK: ds 8
18
19 end
1 ;mul21.s03
2
3 name MUL21
4 extern _R
5 public MUL21
6 rseg CODE
7 MUL21: mov A,R0
8 mov B,R2
9 mul AB
10 mov R4,A
11 mov R5,B ;R5,R4=R0*R2
12
13 mov A,R1
14 mov B,R2
15 mul AB
16 add A,R5
17 mov R5,A
18 mov A,B
19 addc A,#0
20 mov R6,A ;R6,R5+=R1*R2,R4
21
22 ret
23
24 end
  1. 我的猜测是43
  2. 不应该是43 * 16吗?
assembly 8051
1个回答
0
投票

按照每条指令查看它对程序状态的影响(A & B 寄存器和全局变量 Rn)。

大多数指令都很简单,只是将 8 位值从一个地方复制到另一个地方。保留一个显示机器代码程序中每个位置/步骤的最新值的暂存器,并为每条指令更新该暂存器。

8051

mul AB
指令执行 8 位 × 8 位运算,产生 16 位结果,其中低 8 位在 A 中,高 8 位在 B 中。

暂时不用担心算法(以及术语 MSB、LSB),只需关注 8 位值以及它们如何移动/由每条指令生成。

我们可以分别查看算法、输入值和输出值。当较大的值(16 位和 24 位)被分成 8 位字节时,十六进制是一种很好的选择(因为两个 4 位十六进制数字是一个完整的字节 - 要处理十进制,需要更多数学运算)。输入为LSB 0x03和MSB 0x04,因此16位值为0x0403,即1027(十进制)。该算法将两半(LSB、MSB)乘以 8 位乘法器(此处为 16),然后将它们与应传播的进位相加。正如您所计算的,最终输出是 3 个字节,以十六进制 0x00、0x40、0x30 表示,或以 24 位数字 0x004030 表示,即 16342(十进制)。正如您所看到的,0x0403 乘以 16(十六进制的“10”)是 0x4030。

© www.soinside.com 2019 - 2024. All rights reserved.