我有一个未签名的号码
%rdi/edi/di
中,我有0xFFFE %rsi/esi/si
中,我有0x4。目标是做addw %di, %si
首先,我想知道...%si中放入了哪些值,为什么?我还不太清楚这一点。
其次,我需要知道:这个标志包含哪些类型的标志?我已经阅读了使标志出现的原因,但并不清楚是什么标志出现了,或者为什么甚至当书告诉我时还是空白。
答案 0 :(得分:2)
对于无符号数字,您可以通过在其前面添加任意数量的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