範例二:「mov m8,r8」
- 打開Visual Studio使用C++並且輸入以下程式碼,設定中斷點進行驗證。
果然與原先設想的沒錯,只要是第一運算元是記憶體存取(其很自然第當然寫入8位元的資料,故稱m8),第二運算元是8位元一般暫存器,很正常地都是88開頭的運算碼,搭配記憶體 [eax] 00到 [edi] 07,但中間發生了什麼事,編碼怎麼跳開了?
原來,我們又忘了去查32位元定址的Mod R/M圖表,得知,[esp]與al交集在04,因為[–][–]與AL是記憶體定址,需查SIB表,得出24。
同樣地,第二條指令[ebp]只能查到符合[EBP]+disp8,並與al交集在45,disp8為00,沒用到比例變址,故不需查SIB。
- 那單純的88 04、88 05跑哪去了?還記得剛剛的16位元Mod R/M圖表嗎,我們有瞄到…
- 來驗證一下,打開Visual studio使用C++寫組合語言,並且輸入以下程式碼,設定中斷點進行驗證。因為我們要用到16位元的定址,這在內嵌組合語言裡面是不允許我們寫的。
找到88 04及 88 05了,只是前面多了67前置碼是因為在32位元環境跑16位元定址。不過那不打緊,因為我們只是要驗證暫存器對記憶體位址進行複製的動作會產生88開頭的運算碼,至於反向的部分倒是可以在內嵌組合語言的C++中自行驗證之間存在等價關係。