我有一个问题,从这开始:
.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?
答案 0 :(得分: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
(对于"立即加载")表示"用值I填充此寄存器
我在这里提供源代码"。没有RAM访问,
因为值在指令本身中携带。因此,你正在填补
寄存器X,Y和Z的值为0x0200
,0x0202
和
分别为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加载,请查看ld
和lds
的文档
说明。两者都可以用不同的方式来解决你的问题
问题。然而,其中一个更符合你的方式
老师说了这个问题。