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"??? 这是什么意思 ?
评论错误或代码错误.这个代码要么是以16位模式执行的,在这种情况下mov ds:[esi], al,已经使用地址大小覆盖前缀(ASOP)进行组装,手动覆盖只会给它两个ASOP(无害,但无用),或者更糟糕的是代码意味着在32位模式下执行,然后ASOP将指令转换为mov [sword], al(因为16位ModRM不同),然后它使指令流不对齐.也ds:没用,因为它是默认段[esi]
顺便说一下,最后一个注释(或代码)也是错误的,闪存地址被加载到eax,而不是ecx.
那么在x86架构上使用db操作码进行32位寻址意味着什么
它不是操作码,而是地址覆盖前缀,用于更改前缀指令所需的地址大小.
由于前缀(如果存在)对应于前缀指令的前几个字节,因此应用此单字节前缀(67h)的指令是前缀后面的指令,即:
mov ds:[esi], al
Run Code Online (Sandbox Code Playgroud)
为什么"db 67h"??? 这是什么意思 ?
它切换上述指令所期望的地址大小(16位地址为32位,反之亦然).
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |