AVR 组件 - 比较后寄存器旋转的问题
AVR assembly - problem with rotation of register after comparison
我正在尝试用汇编编写一些代码,但无法解决在 cpi、cp 指令之后使用 ror、rol 指令的问题。我在上面停留了一段时间,却一无所获。当我使用 cpi 然后移动到程序的其他分支时,我有一些旧代码,做了一些指令,最后一个是旋转没有问题。我尝试在轮换之前添加一些指令,如果它改变了什么但没有帮助。我的目标是获得 254,253,251 等的 r16 dec 值。只需旋转寄存器的内容。相反,我得到了 254,252,248。如果我不使用 cp 或 cpi,问题就不会发生。我是 asm 编程的新手,如果这是一个非常愚蠢的问题,我很抱歉。代码较低是我需要的简化,因为我使用用户输入,所以一半的代码只是用来模拟程序的相同功能。
ldi r16,0b11111111
ldi r17,0b00000001
ldi r18,0b00000001
ldi r20,0b00000000
start:
cp r18,r17
breq loop
loop:
inc r20
rol r16
rjmp start
您的目标是获得以下值:
255 = 0xFF = 11111111
254 = 0xFE = 11111110
253 = 0xFD = 11111101
251 = 0xFB = 11111011
但是您使用 rol
指令将您的寄存器移位 1 并添加进位。进位一直为零,所以你总是加一个零。这导致以下值:
255 = 0xFF = 11111111
254 = 0xFE = 11111110
252 = 0xFC = 11111100
248 = 0xF8 = 11111000
"problem"是cp
指令也使用了进位位,所以它会清除进位位,因为r18
减去r17
运算没有不要设置进位(你的cp r18, r17
)。
您的代码在没有 cp
的情况下也能正常工作,因为进位不会随时被清除。
一个可能的解决方案是在调用 rol
:
之前使用 cpi
cpi r16, 255
rol r16
现在当 r16
的内容低于 255
时,您的进位将被设置(cpi
执行操作 r16
- 255
)。进位将由您的 rol
使用,您得到了正确的结果。一个积极的方面是,该解决方案每个周期只需要一个额外的时钟,因此它比分支指令或其他指令要聪明一点。
我正在尝试用汇编编写一些代码,但无法解决在 cpi、cp 指令之后使用 ror、rol 指令的问题。我在上面停留了一段时间,却一无所获。当我使用 cpi 然后移动到程序的其他分支时,我有一些旧代码,做了一些指令,最后一个是旋转没有问题。我尝试在轮换之前添加一些指令,如果它改变了什么但没有帮助。我的目标是获得 254,253,251 等的 r16 dec 值。只需旋转寄存器的内容。相反,我得到了 254,252,248。如果我不使用 cp 或 cpi,问题就不会发生。我是 asm 编程的新手,如果这是一个非常愚蠢的问题,我很抱歉。代码较低是我需要的简化,因为我使用用户输入,所以一半的代码只是用来模拟程序的相同功能。
ldi r16,0b11111111
ldi r17,0b00000001
ldi r18,0b00000001
ldi r20,0b00000000
start:
cp r18,r17
breq loop
loop:
inc r20
rol r16
rjmp start
您的目标是获得以下值:
255 = 0xFF = 11111111
254 = 0xFE = 11111110
253 = 0xFD = 11111101
251 = 0xFB = 11111011
但是您使用 rol
指令将您的寄存器移位 1 并添加进位。进位一直为零,所以你总是加一个零。这导致以下值:
255 = 0xFF = 11111111
254 = 0xFE = 11111110
252 = 0xFC = 11111100
248 = 0xF8 = 11111000
"problem"是cp
指令也使用了进位位,所以它会清除进位位,因为r18
减去r17
运算没有不要设置进位(你的cp r18, r17
)。
您的代码在没有 cp
的情况下也能正常工作,因为进位不会随时被清除。
一个可能的解决方案是在调用 rol
:
cpi
cpi r16, 255
rol r16
现在当 r16
的内容低于 255
时,您的进位将被设置(cpi
执行操作 r16
- 255
)。进位将由您的 rol
使用,您得到了正确的结果。一个积极的方面是,该解决方案每个周期只需要一个额外的时钟,因此它比分支指令或其他指令要聪明一点。