那么在x86架构上使用db操作码进行32位寻址意味着什么

use*_*666 1 memory x86 assembly addressing-mode

我移植了一个好的,我遇到了以下程序集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
Run Code Online (Sandbox Code Playgroud)

此代码段以受保护模式运行.所以问题是,为什么"db 67h"??? 这是什么意思 ?

har*_*old 6

评论错误或代码错误.这个代码要么是以16位模式执行的,在这种情况下mov ds:[esi], al,已经使用地址大小覆盖前缀(ASOP)进行组装,手动覆盖只会给它两个ASOP(无害,但无用),或者更糟糕的是代码意味着在32位模式下执行,然后ASOP将指令转换为mov [sword], al(因为16位ModRM不同),然后它使指令流不对齐.也ds:没用,因为它是默认段[esi]

顺便说一下,最后一个注释(或代码)也是错误的,闪存地址被加载到eax,而不是ecx.


眠りネ*_*ネロク 5

那么在x86架构上使用db操作码进行32位寻址意味着什么

它不是操作码,而是地址覆盖前缀,用于更改前缀指令所需的地址大小.

由于前缀(如果存在)对应于前缀指令的前几个字节,因此应用此单字节前缀(67h)的指令是前缀后面的指令,即:

mov ds:[esi], al
Run Code Online (Sandbox Code Playgroud)

为什么"db 67h"??? 这是什么意思 ?

它切换上述指令所期望的地址大小(16位地址为32位,反之亦然).