数据间接寻址和添加16位数字AVR汇编

时间:2015-02-26 07:24:23

标签: assembly avr addressing

我有一个问题,从这开始:

.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)

我不确定这是否正确所以我试图更好地理解X Y Z和高/低字节。继承人我做了什么

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

如果这是不正确的,我如何将高字节和低字节输入res?

1 个答案:

答案 0 :(得分:1)

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

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

在此,您将value1value2res定义为符号。这些 符号表示刚刚分配用于保留的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(对于"立即加载")表示"用值I填充此寄存器 我在这里提供源代码"。没有RAM访问, 因为值在指令本身中携带。因此,你正在填补 寄存器X,Y和Z的值为0x02000x0202和 分别为0x0204。到目前为止一切都很好。

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的文档 说明。两者都可以用不同的方式来解决你的问题 问题。然而,其中一个更符合你的方式 老师说了这个问题。