2017-09-20 75 views
1

我移植了良好的和我面臨以下組件86行:然後什麼裝置32位與操作碼分貝x86架構尋址

mov al, UNLOCK_DATA1 ; load al with byte for the first unlock write 
db 67h   ; use 32 bit addressing 
mov ds:[esi], al  ; write the command to flash 
mov eax, FLASH_ADDRESS ; load ecx with the base address for flash 

該代碼段在保護模式下運行。所以問題是,爲什麼「db 67h」???這是什麼意思 ?

+0

也許它實際上是16位代碼。所以需要前綴來使用esi而不是si。而且你使用了一個32位的反彙編程序,所以它不知道如何處理前綴。閃爍代碼不可想象。 –

+0

您是否已經從16位源代碼中用[esi]搜索/替換'[si]'?這可以解釋爲什麼評論沒有意義了。 (我假設你從16位移植?) –

回答

5

然後什麼裝置32位與x86架構分貝操作碼尋址

它不是一個操作碼,而是一個地址覆蓋前綴改變由所期望的地址的大小前綴指令。

由於前綴,如果存在的話,對應於預先固定的指令的第幾個字節,指令這一個字節的前綴(67h)被施加到,是一個接着一個的前綴,即:

mov ds:[esi], al 

爲什麼「db 67h」???這是什麼意思 ?

它將上述指令期望的地址大小(16位地址轉換爲32位或其他方式)切換。

+1

OP可能會丟失更基本的東西:'db'是一個「僞指令」,它將字節直接組裝到輸出中。所以'db 67h'在那個時候將一個'0x67'字節放入機器代碼中。 –

6

該評論是錯誤的或者代碼是錯誤的。這個代碼要麼在16位模式下執行,在這種情況下,mov ds:[esi], al將與地址大小覆蓋前綴(ASOP)組合在一起,而手動覆蓋只會給它兩個ASOP(無害但無用),或者更糟糕的是,代碼旨在在32位模式下執行,然後ASOP將指令變爲mov [sword], al(因爲16位ModRM不同),然後它將指令流錯位。此外ds:是無用的,因爲它是[esi]

默認段到最後一個註釋(或代碼)的方式也有錯,閃光燈地址被裝入eax,不ecx

相關問題