2012-11-24 47 views
3

代碼:「js 2f n t」中f的含義是什麼?

extern inline int strncmp(const char * cs, const char * ct, int count) 
{ 
register int __res; 
__asm__("cld\n" 
"1:\tdecl %3\n\t" 
"js 2f\n\t" 
"lodsb\n\t" 
"scasb\n\t" 
"jne 3f\n\t" 
"testb %%al, %%al\n\t" 
"jne 1b\n" 
"2:\txorl %%eax,%%eax\n\t" 
"jmp 4f\n" 
"3:\tmovl $1,%%eax\n\t" 
"j1 4f\n\t" 
"negl %%eax\n" 
"4:" 
:"=a" (__res):"D" (cs), "S" (ct), "c" (count):"si","di","cx"); 
return __res; 
} 

我不明白˚F在 「JS 2F \ n \ t」 和 「JNE 1B \ n」,如何 的b瞭解這個 ?我應該看哪本書?謝謝。

回答

9

在此背景下,f表示前進,而b表示後退。所以js 2f意味着跳轉到標籤2,如果符號集。您可以查看gcc inline assembly。我似乎無法在網上找到任何參考資料來包括這一點,但我知道你可以在Professional Assembly Language找到它。

爲什麼我們不能使用命名標籤?要引用這本書:

如果您有其他ASM部分在你的C代碼,則不能再次使用相同 標籤,或將導致錯誤消息由於重複 使用標籤。

那麼我們該怎麼辦?

解決的辦法是用使用本地標籤。無條件分支和 無條件分支允許您指定一個數字作爲標籤,沿 帶有一個方向標誌,以指示處理器應尋找數字標籤的哪個方式 。第一次發現標籤 將被採用。

關於修改器:

使用f修飾符來指示標籤是從向前跳 指令。要後退,您必須使用b修飾符。

+0

這是否意味着相同的標籤可以在同一個塊內出現多次? – NPE

+0

@NPE不,這意味着您可以在一個塊中定義一個標籤,而不必擔心同一翻譯單元中的其他塊。 – cnicutar

+0

我明白了。現在它是有道理的。感謝澄清。 – NPE

1

這被記錄在彙編器的manual中。

相關問題