Assembly 那么,在x86体系结构上使用db操作码进行32位寻址意味着什么
我移植了一个好的,我面临以下x86装配线:Assembly 那么,在x86体系结构上使用db操作码进行32位寻址意味着什么,assembly,memory,x86,addressing-mode,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 fla
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???这是什么意思
那么,在x86体系结构上使用db操作码进行32位寻址意味着什么
它不是一个操作码,而是一个地址覆盖前缀,用于更改前缀指令所需的地址大小
由于前缀(如果存在)对应于带前缀指令的前几个字节,因此此单字节前缀67h应用于的指令是前缀后面的指令,即:
mov ds:[esi], al
为什么是db 67h???这是什么意思
它将16位地址以上的指令预期的地址大小切换为32位,反之亦然
那么,在x86体系结构上使用db操作码进行32位寻址意味着什么
它不是一个操作码,而是一个地址覆盖前缀,用于更改前缀指令所需的地址大小
由于前缀(如果存在)对应于带前缀指令的前几个字节,因此此单字节前缀67h应用于的指令是前缀后面的指令,即:
mov ds:[esi], al
为什么是db 67h???这是什么意思
它将16位地址以上的指令预期的地址大小切换为32位,反之亦然。注释错误或代码错误。该代码要么在16位模式下执行,在这种情况下,mov ds:[esi],al将与地址大小覆盖前缀ASOP组合,手动覆盖将只给它两个ASOP,这两个ASOP无害,但没有用处,或者更糟糕的是,该代码将在32位模式下执行,然后ASOP将指令转换为mov[Swarm],因为16位ModRM是不同的,因此它会使指令流错位。ds:也是无用的,因为它是[esi]的默认段
顺便说一下,最后的注释或代码也是错误的,闪存地址加载到eax中,而不是ecx中 注释错误或代码错误。该代码要么在16位模式下执行,在这种情况下,mov ds:[esi],al将与地址大小覆盖前缀ASOP组合,手动覆盖将只给它两个ASOP,这两个ASOP无害,但没有用处,或者更糟糕的是,该代码将在32位模式下执行,然后ASOP将指令转换为mov[Swarm],因为16位ModRM是不同的,因此它会使指令流错位。ds:也是无用的,因为它是[esi]的默认段
顺便说一下,最后的注释或代码也是错误的,闪存地址加载到eax中,而不是ecx中 也许它实际上是16位代码。因此需要前缀使用esi而不是si。您使用了32位反汇编程序,因此它不知道如何处理前缀。闪烁代码并非不可想象。您是否已经从16位原始源代码中用[esi]搜索/替换[si]?这就解释了为什么这个评论不再有意义了。我假设您是从16位进行移植的?也许它实际上是16位代码。因此需要前缀使用esi而不是si。您使用了32位反汇编程序,因此它不知道如何处理前缀。闪烁代码并非不可想象。您是否已经从16位原始源代码中用[esi]搜索/替换[si]?这就解释了为什么这个评论不再有意义了。我假设您是从16位进行移植的?OP可能缺少一些更基本的东西:db是一条伪指令,直接将字节汇编到输出中。因此DB67H在该点将0x67字节放入机器代码中。OP可能缺少更基本的内容:db是一条伪指令,直接将字节汇编到输出中。因此DB67H在该点将0x67字节放入机器代码中。