簡體   English   中英

在64位平台上運行的32位匯編代碼

[英]32-bit assembly code running on 64-bit platform

我正在通過喬納森·巴列特(Jonathan Barlett)的《從頭開始編程》一書學習x86匯編語言。 最近,我將系統更新為64位平台,出現了匯編代碼的語法問題,pushl指令更具體了。 我花了一些時間在x86_64 isa上查找信息,但是我認為最好學習x86的基礎知識。 為了做到這一點,我想知道是否有一種方法可以將較舊的語法組裝到64位對象中,或者類似的東西。 還是發生了重大變化,使之不可能? 我正在使用Ubuntu 10.10和GNU便攜式匯編器。

無論如何。 如果您在x86_64上或其前身之間有差異,則表明您是一本好書或任何信息來源,那就太好了。

編輯:謝謝! 我得到了我所需要的。 這兩個答案都非常有用。 不用擔心,我期待着釋放X86。

Linux使用此處指定的x86_64 ABI。 最好的辦法是通讀與您所在地區最相關的ABI信息。 這里有一些想法:

  • 與x86不同,x86_64上只有一個調用約定。 如果您算出Microsoft Windows完全不同的事實,則為兩個。
  • 在x86中,函數的參數通常在堆棧上傳遞。 在x86_64中,前幾個在整數類型的寄存器rdirsirdxrcxr8r9中。
  • 內存地址類型都是QWORD因此如果您使用具有AT&T語法的完整寄存器( r10等),則需要movqaddq等。

現在, x86_64部分設計是它與x86向后兼容,即如果正確設置了操作系統,則能夠執行x86代碼。 因此,例如這樣做沒有任何問題:

nasm -felf32 myprog.asm
gcc -o myprog -m32 myprog.o

但是,請注意; 您越依賴其他可用代碼,就越需要所有內容的32位副本。 請注意,這基本上是完全使用32位模式的代碼,包括調用約定和所有內容。 簡而言之,它也應該在32位計算機上執行。 正如Jerry所說(+1),您不能在64位模式下使用32位約定編譯32位程序集。 您必須遵守64位ABI。

當然,除此之外,您可以在例程中自由使用諸如eax寄存器,只要知道它會影響整個rax或半數的eax。

匯編語言級別的32位和64位操作之間存在足夠的差異,您幾乎可以肯定不會希望僅將32位代碼視為64位代碼,並希望獲得最好的結果,或者像那樣的東西。

當您像編寫匯編語言一樣“接近金屬”時,通常是有原因的-通常,您不會/不會/不喜歡匯編器試圖猜測您的實際意圖,並且修改代碼以適合。 在某些情況下,您可能會失去優勢(例如,速度),而在另一些情況下,則可能會破壞您的整體工作(例如,當/如果它的符號將某些內容擴展到64位,那么本來應該進行零擴展)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM