簡體   English   中英

如何將操作碼轉換為十六進制碼

[英]how to convert opcodes to hexcodes

我真的很為難,請幫忙...

我已經從intel訂購了一堆書,軟件開發人員手冊,並且在書中給了我所有這些操作碼,例如“ VEX.128 ...”或“ 0F 5B”

這些書說的是“可以與XMM寄存器一起使用”之類的東西,但是沒有一本書談論如何將XMM轉換為十六進制?

我想要做的就像是在不使用匯編器的情況下,用純十六進制形式寫問好世界! 請幫忙! 我希望這對我來說是匯編語言和十六進制代碼領域的新手

單詞XMM不會轉換為十六進制。 指令使用XMM寄存器是操作碼和前綴的屬性。 寄存器操作數的索引主要由ModRM字節編碼,在前綴中稍微增加一點,對於GPR上的某些操作,寄存器名稱被編碼在操作碼字節中。

除了復雜性,這是一個簡單的VEX前綴示例, vpaddb xmm1, xmm4, xmm6 它在手冊中的條目(在paddb引理下)表示將其編碼為: VEX.NDS.128.66.0F.WIG FC /r

VEX.NDS.128.66.0F.WIG用於VEX前綴。 NDS表示vvvv字段對源寄存器進行編碼。 128表示不設置L位,這使寄存器使用X MM版本,否則它們將是Y MM版本(因此,如您所見,此區別是由VEX前綴中的單個位編碼的,而不是通過寫單詞精確地以十六進制表示的“ XMM” 66表示pp字段的設置,該設置對應於舊式編碼中的強制性前綴,即pp =01。WIG = W-ignored,在這里並不重要。

無論如何,它可以是2字節的VEX前綴(無花哨的操作碼映射,寄存器編號低),因此以C5開頭,然后合並字段~R|~vvvv|L|pp (其中|是串聯)。 〜vvvv是vvvv的補碼,vvvv = 0100(xmm 4 )。 R字段是ModRM字節的reg字段的擴展, xmm1的索引小於8,因此R字段為0,因此〜R為1。加起來,第二個前綴字節為1|1011|0|01 = D9

操作碼字節是FC ,這里沒有發生任何有趣的事情。

/r表示將其余操作數編碼為ModRM(+ SIB),因此這里使用mod = 11(兩個寄存器,沒有內存操作數),rm = 110(xmm 6 ),reg = 001(xmm 1 ),所以11001110 = CE

所以總共vpaddb xmm1,xmm4,xmm6變成c5 d9 fc ce

您可以在ISDM的附錄B“指令格式和編碼”中找到此信息(以及一些略過的細節)。

暫無
暫無

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

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