assembly 我不知道这里是设置负标志还是溢出标志

b1payxdu  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(147)

我把数据当作有符号的数来处理。我的教授教我当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开始的位置)

d8tt03nd

d8tt03nd1#

我不知道“AVR的汇编语言代码”。因此我假设如下:

  • 您使用的是8位架构。
  • 如果是2操作数指令,则左操作数是运算得目的.
  • 使用整数2的补码。

然后道:
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十进制。因此设置负标志。
也许这并不适用于你的架构,而只适用于我的假设。

相关问题