在x86指令集中,索引爲1的位可以是指定目標和源操作數的方向位,也可以是符號擴展位。我想知道確定這些案例中哪一個是最簡單的邏輯方法。有沒有辦法檢查除檢查指令操作碼並比較它們以找出它是哪個(用於指令的符號擴展或方向位變體)?還有一些指令忽視了這一點,但是因爲它被設置爲0,所以它並不重要。x86指令集中的方向/符號擴展位
編輯:原來寫錯誤(這是我的代碼的目的),reg-> r/m總是這樣,因爲r/m-> reg指令永遠不會觸發寫入錯誤。但是如果有人遇到類似的問題,任何信息都會很好。
在x86指令集中,索引爲1的位可以是指定目標和源操作數的方向位,也可以是符號擴展位。我想知道確定這些案例中哪一個是最簡單的邏輯方法。有沒有辦法檢查除檢查指令操作碼並比較它們以找出它是哪個(用於指令的符號擴展或方向位變體)?還有一些指令忽視了這一點,但是因爲它被設置爲0,所以它並不重要。x86指令集中的方向/符號擴展位
編輯:原來寫錯誤(這是我的代碼的目的),reg-> r/m總是這樣,因爲r/m-> reg指令永遠不會觸發寫入錯誤。但是如果有人遇到類似的問題,任何信息都會很好。
[給出解答的答案]。
你顯然需要一個指令字節流的布爾公式。我不知道如何輕鬆定義該公式; x86有一個非常混亂的指令集。我期望的關鍵技巧是查找由前綴字節確定的表中的操作碼字節。如果你正在編寫某種反彙編程序,我希望你已經有了這樣的表格。
如果我真的找不到更好的答案,那麼我想我會繼續這樣做,現在我會拭目以待其他人是否有任何想法。 –
方向和符號位是x86處理器的標誌寄存器的一部分。由於這些標誌的最低八位與8080/8085/Z80的標誌具有相同的佈局,我猜測索引1處的位是有符號位。自從70年代後期隨着8086/88處理器推出以來,方向位的位置沒有改變,只要我的記憶服務於我。
符號位位作爲算術運算的結果被修改,並且是操作結果的最高位的副本。 INC和DEC不會影響符號位。
方向位使用cld/std指令進行操作,並控制塊指令(cmps,ins,lods,movs,outs,scas和stos)後遞增/遞減。
它們也可以通過疊層操作(雖然這也許是不與符號位有意義)
pushf
and dword ptr [esp],SOME_MASK
popf
使用「和」是一個例子:也可以使用或,異或等。
如果您操縱標誌,您可能必須將其恢復到其以前的值,因爲某些運行時庫假定它未被修改。
我想OP是在講一點,告訴處理器信息是去寄存器,還是去內存,而不是指向標誌位。 –
如果我誤解了這個問題,總是有[英特爾架構軟件開發人員手冊,第2卷](http://download.intel.com/design/intarch/manuals/24319101.pdf),其中附錄A包含操作碼映射。 –
是的,這是指定指令操作數的方向位,無論是reg-> r/m還是r/m-> reg –
是的,那正是我試圖避免做的事情,但如果我不能得到更好的解決方案,那就是我將不得不去做的。 –