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

时间:2017-09-20 09:30:40

标签: assembly memory x86 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

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

2 个答案:

答案 0 :(得分:6)

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

的默认细分

顺便说一下,最后一条评论(或代码)也是错误的,闪存地址会被加载到eax,而不是ecx

答案 1 :(得分:5)

  

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

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

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

mov ds:[esi], al
  

为什么“db 67h”???这是什么意思 ?

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