我有一个无符号号码
- 在我有0xFFFE
%rdi/edi/di
寄存器中 - 在登记册中
%rsi/esi/si
我有0x4。
目标是做addw %di, %si
首先,我想知道...%si 中放入哪些值,为什么?我仍然不是 100% 清楚这一点。
其次,我需要知道:这个包含什么类型的标志?我读过是什么让旗帜出现,但根本不完全清楚哪些旗帜出现,或者为什么,即使书告诉我直截了当。
对于无符号数字,您可以通过在它前面添加任意数量的 0 来将其扩展为零。所以RSI
这里是0x0000000000000004
.SI
是RSI
的较低 16 位,因此0x0004
.
RDI is 000000000000FFFE
EDI is 0000FFFE
DI is FFFE
RSI is 0000000000000004
ESI is 00000004
SI is 0004
所有寄存器都存储数字,不包含任何标志。事实上,CPU 甚至无法分辨一个数字是有符号的还是无符号的。
CPU只有一个标志寄存器,通常只能根据算术或比较运算的结果进行设置。例如,将0xFFFE
移动到DI
对标志没有影响。您必须使用testw %di, %di
将DI
与自身进行比较,然后标志将相应地更改。
MOV DI, 0xFFFE ; flags are not changed
TEST DI, DI ; flags are changed according to the result of TEST
JZ .A ; will not jump because ZF (Zero Flag) is not set because DI is not zero
JS .B ; will jump because SF (Sign Flag) is set because the highest bit of DI is 1