2017-03-27 148 views
1

編碼x86_64指令mov rcx,rdx(使用https://defuse.ca/online-x86-assembler.htm)輸出48 89 D1x86_64 - 編碼mov指令

檢查操作碼this reference顯示了該字節序列如何編碼該指令。

但該表中的兩行(操作碼8B)與指令非常相似,但操作數的順序翻轉了。
事實上,我可以使用48 8b ca(通過反編譯驗證)編碼相同的指令。

爲什麼兩個操作碼都存在?他們的差異超過我能夠解決的嗎?什麼時候會被另一個選中?

+1

它們的存在是爲了允許內存操作數是源或目標。如果兩者都是寄存器,你會得到兩個編碼。選擇哪個取決於彙編程序,有些程序甚至允許您指定(例如gas的'.s'後綴)。 – Jester

回答

2

modr/m字節最多隻能編碼一個內存操作數。所有支持源或目標中的內存操作數的指令都被編碼了兩次,一次是源可能是內存操作數,一次是目標內存操作數。當然,這意味着您可以對兩個操作數都寄存器兩次的助記符進行編碼。

+0

謝謝,這解釋了它。當組裝一個簡單的mov指令(沒有內存訪問)時,組裝者是傾向於贊成第一次編碼的理由嗎?這只是巧合嗎? – user1000039

+1

@ user1000039取決於彙編程序。 IIRC Solaris''支持後者。 – fuz

+0

取決於彙編程序。用宏可以隨意選擇在你的輸出中獲得一些多態性。但我認爲沒有理由這麼做。順便說一句。這也適用於add,或者adc,sbb和sub,xor,cmp,test,xchg。 (最後兩個有點不同) – sivizius