我想86教我,我已經在整個運行需要返回立即,負數:我可以在x86中編碼64位負立即數嗎?
.text
.align 4,0x90
.globl _scheme_entry
_scheme_entry:
movl $-42, %eax
ret
當我打印這個功能(printf("%" PRIdPTR "\n", scheme_entry())
的返回值,我得到一個廢話號:
$ ./neg
4294967254
我猜這是因爲它是一個32位負,00000000FFFFFFFF,而不是64位負,FFFFFFFFFFFFFFFF
我如何可以存儲恆定的64位值。直接在彙編函數中上?我必須將它編碼爲兩個單獨的指令嗎?
你打印錯了嗎? 'scheme_entry'似乎返回一個32位整數(如果不是,那麼你爲什麼把它放在'eax'中?) – harold
gcc通常將函數入口點對齊到16個字節。也沒有理由強制填充爲單字節NOP(因爲它永遠不會運行)。使用'.p2align 4'對齊到'1 << 4'。 (對於這樣一個小函數,一個8字節的邊界將覆蓋整個函數,所以你可能會使用'.p2align 3'。)現代CPU對代碼對齊不如舊CPU那麼敏感,但是當它仍然是一個好主意的時候NOP填充將不會執行。 –
@PeterCordes相當多的是在我頭上 - 我跟着[編譯器編寫教程](http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf),這是故意讓我們使用'gcc'的輸出來處理微小的C輸入,以決定從編譯器發出什麼。上面的樣板基本上是逐字拷貝的,但我還沒有學到它的功能! :x – ELLIOTTCABLE