2013-12-17 31 views
3

answer about assembly registers' sizes大會登記在64位架構

首先,什麼尺寸eaxaxah及其對應,在64位架構?如何訪問單個寄存器的字節以及如何訪問所有64位寄存器的八個字節?

我非常喜歡x86-64(x64)安騰處理器。

二,使用four new call-convention registers的正確方法是什麼? (四個寄存器用於保存函數調用中的前四個參數)?

+0

嗯'EAX == 32bits''斧== 16bits''啊|人== 8bits',它總是這樣的,在x64的16位天增加了新的寄存器,回我們只有'ax&al&ah',那麼當32位尋址到來時,它的添加方式並不會影響您如何尋址16位或8位寄存器,x64中的新寄存器(64位寄存器重疊,與ax重疊的eax等)以'r'開頭,'rax''rbx'等等。 [見這裏](http://www.nasm.us/doc/nasmdo11.html)瞭解更多信息。 – James

回答

15

使用舊名稱所有寄存器保持大小相同。要訪問64位寄存器,請使用新名稱RXX,如rax,rbx ...

寄存器名稱不會更改,因此您只需使用字節寄存器(al,bl,cl,dl,ah,bh, ch,dh)爲ax,bx,cx,dx的LSB和MSB。有8個新的寄存器r8-r15,您可以通過添加後綴b來訪問它們的LSB。例如r8b,r9b ...

您還可以使用名稱爲sil,dil,spl,bpl的esi,edi,esp,ebp的LSB和新的REX前綴,但不能在相同的情況下使用它時間啊,bh,ch或dh。同樣,新寄存器的最低字或雙字可通過後綴wd訪問。

x86_64 registers

What are the names of the new X86_64 processors registers?


對於調用約定,在特定系統上有只有一個約定

Windows使用:

  • RCX,RDX,R8,R9的前四個整數或指針參數
  • XMM0,XMM1,XMM2,XMM3爲浮點參數

由於MSVC 2013年還有一個新的Windows擴展公約,名爲__vectorcall

在Linux和System V AMD64 ABI之後的其他系統上,可以在寄存器上傳遞更多參數,這可以使函數調用更快。

  • 前六個整數或指針參數寄存器RDI,RSI,RDX,RCX,R8和R9
  • 浮點參數在XMM0通過XMM7

x86_64 calling conventions

傳遞被傳遞

你應該閱讀這些第一

這些都是x86_64的最基礎知識。在問這樣的問題之前,快速研究應該會有所幫助。關於堆棧溢出的問題也已經有數百個問題。


OTOH Itanium完全不同的架構並沒有任何關係x86_64的任何責任。這是一個純粹的64位體系結構,因此所有正常的寄存器都是64位,沒有32位或更小的版本。在它有很多寄存器:

  • 128通用整數通過R127寄存器r0,每個攜帶64值的位和一個陷阱位。稍後我們將更多地瞭解陷阱。
  • 128個浮點寄存器f0到f127。
  • 64個謂詞寄存器p0到p63。
  • 8個分支寄存器b0到b7。
  • 指令指針,Windows調試引擎出於某種原因調用iip。 (額外的「我」是爲「瘋狂」?)
  • 128個專用寄存器,並不是所有的都有含義。由於某種原因,這些被稱爲「應用程序寄存器」(ar)。我將在討論期間討論選定的註冊簿。
  • 其他雜項寄存器我們不會在本系列中介紹。

https://blogs.msdn.microsoft.com/oldnewthing/20150727-00/?p=90821