在x86程序集中,當對有符號整數執行add
或sub
操作時溢出標誌置位,並且對無符號整數的操作溢出時置位進位標誌。x86程序集:INC和DEC指令和溢出標誌
但是,當涉及到inc
和dec
指令時,情況似乎有所不同。根據這個website,inc
指令根本不影響進位標誌。
但是我找不到有關如何影響溢出標誌的任何信息,例如inc
和dec
。
是否inc
或dec
當發生整數溢出時設置溢出標誌?這種行爲對於有符號整數和無符號整數都是一樣的嗎?
============================= 編輯 ============== ===============
好的,所以基本上這裏的一致意見是,INC和DEC應該像設置標誌一樣表現ADD和SUB,除了進位標誌。這也是它在英特爾手冊中所說的。
問題是我實際上無法在實踐中重現這種行爲,當涉及到無符號整數。
考慮下面的彙編代碼(使用GCC內聯彙編,以方便打印出結果。)
int8_t ovf = 0;
__asm__
(
"movb $-128, %%bh;"
"decb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
在這裏,我們遞減-128帶符號的8位值。由於-128是最小的可能值,溢出是不可避免的。正如預期的那樣,這種打印出:Overflow flag: 1
但是,當我們做與無符號值相同,該行爲並不如我所料:
int8_t ovf = 0;
__asm__
(
"movb $255, %%bh;"
"incb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
我在這裏增加一個無符號的8位值255。由於255是最大的可能值,溢出是不可避免的。但是,這會打印出:Overflow flag: 0
。
咦?爲什麼沒有在這種情況下設置溢出標誌?
除了'add'還設置溢出標誌,如果發生整數溢出,但據我所見,'inc'不會這樣做。查看我編輯的問題以瞭解彙編代碼。 – Channel72 2010-10-13 16:34:43
@ Channel72你明白標記不正確。 CF表示執行MSB(最高有效字節),如'1111 1111 + 1 = 1 | 0000 0000' CF在這裏。 CF表示無效(溢出)無符號操作。 (因爲它是256,不適合'字節')。但它是非常有效的有符號操作(-1 + 1 = 0)。 OF是當進位到MSB時,如'0111 1111 + 1 = 1000 0000'這意味着有效的無符號和無效的有符號運算(127 + 8 = -128 oops,這是在簽名的情況下溢出,因爲範圍是-128; 127 ) – Andrey 2010-10-13 17:22:10