Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 那么,在x86体系结构上使用db操作码进行32位寻址意味着什么_Assembly_Memory_X86_Addressing Mode - Fatal编程技术网

Assembly 那么,在x86体系结构上使用db操作码进行32位寻址意味着什么

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

我移植了一个好的,我面临以下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???这是什么意思

那么,在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字节放入机器代码中。