该程序(来自 Jonathan Bartlett 的《从头开始编程》)循环访问内存中存储的所有数字,并将.long最大的数字放入 EBX 寄存器中,以便在程序完成时查看。
.section .data
data_items:
.long 3, 67, 34, 222, 45, 75, 54, 34, 44, 33, 22, 11, 66, 0
.section .text
.globl _start
_start:
movl $0, %edi
movl data_items (,%edi,4), %eax
movl %eax, %ebx
start_loop:
cmpl $0, %eax
je loop_exit
incl %edi
movl data_items (,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80
Run Code Online (Sandbox Code Playgroud)
我不确定(,%edi,4)这个程序的目的。我读到逗号是为了分隔,而 4 是为了提醒我们的计算机数据项中的每个数字都是 4 个字节长。既然我们已经用.long声明了每个数字都是4个字节,为什么我们还需要在这里再声明一次呢?另外,有人可以更详细地解释这两个逗号在这种情况下的用途吗?
我是全新的大会,并希望确认在以下陈述中我有哪些误解,需要纠正.
堆栈指针(ESP)指的是堆栈的顶部(最低内存地址).
基指针(EBP)用于在构建堆栈帧时临时存储各种存储器地址.它通常保存当前堆栈帧的最高内存地址.
指令指针(EIP)指的是存储器的文本(代码)段中的一行代码的存储器地址
一旦某些东西被推入堆栈,它就不能就地更改.即.如果我们PUSH EBP到堆栈,我们正在推送当前值EBP,而不是某种引用或指针.然后我们不能就地改变这个价值.
传递给函数的参数通常被移动到地址空间中,该地址空间是堆栈指针的偏移量.即.[ESP-12].
调用函数(使用CALL)时,会发生以下情况:
EIP因此我们知道在被调用函数完成后返回的位置谢谢.我正试着绕过这些东西.