Assembly 通过ESI和指针进行间接寻址

Assembly 通过ESI和指针进行间接寻址,assembly,x86,Assembly,X86,我对汇编编程(带MASM的x86 asm)不熟悉,正在学习由ESI寄存器支持的间接寻址。您只需将地址放入ESI中,然后使用间接寻址运算符,就可以访问指向的数据 Q1.在编码中,可以使用[esi+4],但不能使用esi+4(导致错误)。为什么?因为在汇编程序中,显式地编写间接运算符([])是不必要的,主要是为了让程序员理解 问题2。如果我对指针变量应用间接寻址,那么它们似乎不起作用。为什么?指针是否仅用作容器 例如 这是MASM语法的一个怪癖。[..]自动插入内存地址标签周围。换句话说 mov e

我对汇编编程(带MASM的x86 asm)不熟悉,正在学习由ESI寄存器支持的间接寻址。您只需将地址放入ESI中,然后使用间接寻址运算符,就可以访问指向的数据

Q1.在编码中,可以使用[esi+4],但不能使用esi+4(导致错误)。为什么?因为在汇编程序中,显式地编写间接运算符([])是不必要的,主要是为了让程序员理解

问题2。如果我对指针变量应用间接寻址,那么它们似乎不起作用。为什么?指针是否仅用作容器

例如


这是MASM语法的一个怪癖。
[
..
]
自动插入内存地址标签周围。换句话说

mov eax, [ptr4]
表示“将地址
ptr4
处的4个字节加载到
eax
寄存器中。”但
ptr4
是内存地址的标签,因此即使您忘记使用方括号并写入

mov eax, ptr4
MASM将自动插入支架。这两行的意思相同:“将地址
ptr4
处的4个字节加载到
eax
寄存器中。”

MASM不执行寄存器参数的自动插入,但是:

mov eax, esi ; copy the esi register to the eax register
mov eax, [esi] ; load 4 bytes at the address esi into the eax register

这只是MASM的一个怪癖,您必须习惯。

这是MASM语法的一个怪癖。
[
..
]
自动插入内存地址标签周围。换句话说

mov eax, [ptr4]
表示“将地址
ptr4
处的4个字节加载到
eax
寄存器中。”但
ptr4
是内存地址的标签,因此即使您忘记使用方括号并写入

mov eax, ptr4
MASM将自动插入支架。这两行的意思相同:“将地址
ptr4
处的4个字节加载到
eax
寄存器中。”

MASM不执行寄存器参数的自动插入,但是:

mov eax, esi ; copy the esi register to the eax register
mov eax, [esi] ; load 4 bytes at the address esi into the eax register

这只是MASM的一个怪癖,您必须习惯。

MASM或其他汇编程序?x86不支持内存间接操作数,也不支持寄存器加常量作为单个操作数。因此
ptr4
实际上是一个内存位置,其中包含一个32位指针。您必须将该地址处的值(本例中为指针)移动到临时寄存器中,然后取消引用它。就像在汇编中编程的mov esi,[ptr4]
mov,eax,[esi]
。你不能期望每一个高级语言概念都有一个直接的等价物。Michael Petch举例说明了如何使用存储在名为
ptr4
的“变量”中的“指针”。请注意,指针和变量是HLL概念的示例,它们在汇编中没有直接等价物。代码真正要做的是从内存中加载一个32位值,其地址由内存中另一个32位值给出,其地址由符号
ptr4
给出。这必须在两条指令中完成,因为没有一条指令可以做到这一点。@HarshulSharma汇编语言没有“很多补丁和修复程序”。它根据assembler.MASM或其他汇编程序的语法规则创建处理器指令序列??x86不支持内存间接操作数,也不支持寄存器加常量作为单个操作数。因此
ptr4
实际上是一个内存位置,其中包含一个32位指针。您必须将该地址处的值(本例中为指针)移动到临时寄存器中,然后取消引用它。就像在汇编中编程的mov esi,[ptr4]
mov,eax,[esi]
。你不能期望每一个高级语言概念都有一个直接的等价物。Michael Petch举例说明了如何使用存储在名为
ptr4
的“变量”中的“指针”。请注意,指针和变量是HLL概念的示例,它们在汇编中没有直接等价物。代码真正要做的是从内存中加载一个32位值,其地址由内存中另一个32位值给出,其地址由符号
ptr4
给出。这必须在两条指令中完成,因为没有一条指令可以做到这一点。@HarshulSharma汇编语言没有“很多补丁和修复程序”。它根据汇编程序的语法规则创建处理器指令序列。或者使用NASM,在这里,您总是需要在内存操作数周围使用
[]
mov eax,ptr4与MASM中的
mov eax,OFFSET ptr4
相同。或者使用NASM,您总是需要在内存操作数周围使用
[]
mov eax,ptr4与MASM中的
mov eax,OFFSET ptr4
相同。