我把数据当作有符号的数来处理。我的教授教我当Sign Flag设置为1时,BRLT条件就满足了。我无法使用汇编语言中的AVR代码在这里的计算中弄清楚Sign Flag是如何显示1的。
我的代码:LDI R16,0b11111111
(将数字-128存储到寄存器16)LDI R17,0b00000001
(将+1存储到寄存器1中,有符号数中-1的负数为10000001)LOOP:
(定义Loop子程序)SUB R16,R17
(从R17中减去R16中的数据,并将结果存储在R16中,结果应为-129,但超出范围,因为我使用带符号的数字进行计算,结果应为10000000)CPI R16,0b00000000
(the R16的结果为10000000。与0000000相比,计算出的R16-0为00000000。这不会设置负标志,也不会设置溢出标志。由于Sign Flag是V和N的XOR,因此S应该为0。但事实并非如此。显然S Flag在此处为1。我无法理解其原因。)BRLT LOOP
(if符号标志为1,BRLT满足,我们将返回到LOOP开始的位置)
1条答案
按热度按时间d8tt03nd1#
我不知道“AVR的汇编语言代码”。因此我假设如下:
然后道:
LDI R16,0b11111111
将-1十进制数加载到R16中。LDI R17,0b00000001
将+1十进制数加载到R17中。SUB R16,R17
计算0b11111111 - 0b00000001 = 0b11111110
并将其存储在R16中。0b11111110
是十进制-2。CPI R16,0b00000000
计算0b11111110 - 0b00000000 = 0b11111110
,-2十进制。因此设置负标志。也许这并不适用于你的架构,而只适用于我的假设。