簡體   English   中英

在機器代碼中引用寄存器

[英]Referencing registers in machine code

我正在查看一些匯編代碼和相應的內存轉儲,我無法理解正在發生的事情。 我正在使用它作為x86操作碼的參考這是x86中寄存器的參考 我遇到了這些命令,我​​意識到我仍然錯過了一大塊難題。

8B 45 F8       - mov eax,[ebp-08] 
8B 80 78040000 - mov eax,[eax+00000478]
8B 00          - mov eax,[eax]

基本上我不明白操作碼之后的兩個字節意味着什么,我找不到任何能為命令提供逐位格式的地方 (如果有人能指出我會非常感激)。

CPU如何知道每個命令有多長?

根據我的參考,這個8B mov命令允許使用32b或16b寄存器,這意味着有16個可能的寄存器(AX,CX,DX,BX,SP,BP,SI,DI及其擴展等價物)。 這意味着您需要一個完整的字節來指定在每個操作數中使用哪個寄存器。

到目前為止仍然很好,操作碼后面的兩個字節可以指定使用哪些寄存器。 然后我注意到這些命令在內存中逐字節堆疊,並且所有這三個命令使用不同的字節數來指定解除引用第二個操作數時要使用的偏移量。

我想你可以限制寄存器只能使用帶有16b的16b和帶32b的32b,但這只能釋放一個位,不足以告訴CPU有多少字節的偏移量。

哪些值對應哪些寄存器?

困擾我的第二件事是,盡管我的引用明確地給寄存器編號,但是在這些命令中操作碼之后沒有看到與字節的任何相關性。 即使是他們自己,這些命令似乎也不一致。 第二個和第三個命令都是從eax到eax,但在第一個字節中間有一點不同。

根據我的參考,我假設0是EAX,1是ECX,2是EDX,依此類推。 但是,這並不能讓我深入了解如何在RAX,EAX,AX,AL和AH之間進行指定。 一些命令似乎只接受8b寄存器,而其他命令接受16b或32b,而在x86_64上,一些命令似乎接受16b,32b或64b寄存器。 所以你會做一些類似0-7的事情是R,8-15 E,16-23非延伸,24-31 H和L? 即使它是這樣的,似乎應該更容易找到手冊或指定的東西。

操作碼之后的第一個字節是ModR / M字節。 您鏈接的第一個引用包含朝向頁面末尾的ModR / M字節的表。 對於諸如這些的存儲器訪問指令,ModR / M字節指示正在加載或存儲的寄存器以及用於存儲器訪問的尋址模式。

ModR / M字節后面的字節取決於ModR / M字節的值。

在指令“mov eax,[ebp-8]”中,ModR / M字節為45.從32位ModR / M字節的表中,這意味着Reg是eax,有效地址是[EBP] + disp8。 指令的下一個字節F8是8位有符號偏移量。

指令的操作數大小可以隱含在指令中,也可以由指令前綴指定。 例如,66前綴表示16位操作數,對於mov指令,例如示例中的那些。 如果您使用64位模式,則48前綴將指示64位操作數。

8位操作數通常由指令的低位指示。 如果將示例中的指令從8B更改為8A,則它將變為8位移動到al。

暫無
暫無

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

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