reg 的值和 reg 的地址之间的差异
Difference between value of reg, and adress of reg
这有什么不同?:
movl 4(%esp), %eax # put old ptr into eax
9 popl 0(%eax)
第一条指令将第一个arg的内容放入%eax
,但第二条指令也是如此(堆栈的最顶层内容),还是间接寻址? %eax
中的值不会相互重叠吗?
0(%eax)
是存储在eax
中地址的内存位置。 %eax
是eax
的内容。两者并不等同。另请注意,x86 使用完全降序堆栈,因此 pop 0(%eax)
等同于
mov (%esp), 0(%eax)
add , %esp
即它从 (%esp)
加载,而不是 4(%esp)
作为您的其他指令。 pop
还会更改 esp
的值,而 mov 4(%esp), %eax
不会。 (还要注意 mov (%esp), 0(%eax)
实际上不是有效指令,这只是为了说明原理)。
寄存器的 value/contents 可用于形成读取或写入的内存地址(也称为 dereference), in what are called addressing modes.
0(%eax)
和4(%esp)
有时被称为位移寻址模式(或基数+位移),其中用于内存访问的地址是[=12中的值之和=] 与立即数(此处为 0
),以及 %esp
中的值与立即数 4
的总和。寻址模式可以减少所需指令的数量,因为不需要单独的指令和临时寄存器来执行加法(这里说 %esp
和 4
)。位移类型是最常见的寻址方式之一,用于访问基于内存的局部变量和对象的字段(实例变量)等。
寄存器提供的存储空间非常有限,但速度非常快,超出了内存。寄存器本身没有像内存位置这样的地址;它们不能像内存那样被索引或寻址——它们只能在指令中命名。寄存器可以保存内存地址,用于访问内存(通过寻址方式解引用),但寄存器不能保存寄存器地址(没有寄存器地址)。
这有什么不同?:
movl 4(%esp), %eax # put old ptr into eax
9 popl 0(%eax)
第一条指令将第一个arg的内容放入%eax
,但第二条指令也是如此(堆栈的最顶层内容),还是间接寻址? %eax
中的值不会相互重叠吗?
0(%eax)
是存储在eax
中地址的内存位置。 %eax
是eax
的内容。两者并不等同。另请注意,x86 使用完全降序堆栈,因此 pop 0(%eax)
等同于
mov (%esp), 0(%eax)
add , %esp
即它从 (%esp)
加载,而不是 4(%esp)
作为您的其他指令。 pop
还会更改 esp
的值,而 mov 4(%esp), %eax
不会。 (还要注意 mov (%esp), 0(%eax)
实际上不是有效指令,这只是为了说明原理)。
寄存器的 value/contents 可用于形成读取或写入的内存地址(也称为 dereference), in what are called addressing modes.
0(%eax)
和4(%esp)
有时被称为位移寻址模式(或基数+位移),其中用于内存访问的地址是[=12中的值之和=] 与立即数(此处为 0
),以及 %esp
中的值与立即数 4
的总和。寻址模式可以减少所需指令的数量,因为不需要单独的指令和临时寄存器来执行加法(这里说 %esp
和 4
)。位移类型是最常见的寻址方式之一,用于访问基于内存的局部变量和对象的字段(实例变量)等。
寄存器提供的存储空间非常有限,但速度非常快,超出了内存。寄存器本身没有像内存位置这样的地址;它们不能像内存那样被索引或寻址——它们只能在指令中命名。寄存器可以保存内存地址,用于访问内存(通过寻址方式解引用),但寄存器不能保存寄存器地址(没有寄存器地址)。