我移植了一个商品,我遇到了以下装配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 :(得分: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位,反之亦然)。