2017-09-20 47 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

相关问题