0

我有一个由此开始的问题:

.dseg

.org 0x200

value1: .byte 2

value2: .byte 2

res: .byte 2

我应该计算 res = value1 + value2 的总和

0x200 value1: 0xCD
0x201         oxAB
0x202 value2: 0x34
0x203         0x12
0x204 res:
0x205

我们假设

ldi XH,high(value1)
ldi XL,low(value1)
ldi YH,high(value2)
ldi YL,low(value2)
ldi ZH,high(res)
ldi ZL,low(res)

我不确定这是否正确,所以我试图更好地理解 XYZ 和高/低字节。这是我所做的

add XL, YL
adc XH, YH
st zh, xh
st zl, xl

如果这是不正确的,我如何将高字节和低字节转换为 res?

4

1 回答 1

1

由于这看起来很像家庭作业,因此我没有将完整的解决方案作为代码提供。但这应该给你足够的提示来自己修复代码。

.dseg
.org    0x200
value1: .byte 2
value2: .byte 2
res:    .byte 2

value1在这里,您将value2和定义res符号。这些符号代表您刚刚分配用于保存变量的 RAM地址。当您构建程序时,链接器将用它们所代表的地址替换这些符号的任何用法。换言之,“value1”、“value2”和“res”分别表示“0x0200”、“0x0202”和“0x0204”。

ldi XH, high(value1)
ldi XL, low(value1)
ldi YH, high(value2)
ldi YL, low(value2)
ldi ZH, high(res)
ldi ZL, low(res)

ldi(对于“立即加载”)表示“用我在源代码中提供的值填充此寄存器”。不涉及 RAM 访问,因为该值是在指令本身中携带的。因此,您将分别用值和 填充寄存器 X、Y 和0x0200Z。到目前为止,一切都很好。0x02020x0204

add XL, YL

在这里,您将添加 XL (0x00) 和 YL (0x02) 的内容,并将结果 (0x02) 存储回 XL。

adc XH, YH

在这里,您对 XH (0x02) 和 YH (0x02) 执行相同的操作,并添加进位位 (0)。结果 (0x04) 被存储回 XH。

前两条指令组合导致将 X (0x0200) 和 Y (0x0202) 相加,并将结果 (0x0402) 排序回 X。您已经添加了变量的地址,结果几乎没有意义。

您可能想要做的是添加变量的,即那些特定地址处的 RAM内容。为此,您首先需要将这些值从 RAM加载到一些 CPU 寄存器中,然后将这些值相加,然后将总和存储回 RAM。

要从 RAM 加载,请查看ldlds 说明的文档。两者都可以以不同的方式用于解决您的问题。但是,其中之一更符合您的讲师陈述问题的方式。

于 2015-03-02T11:17:21.183 回答