相关疑难解决方法(0)

汇编:这个程序中movl data_items(,%edi,4), %eax的作用是什么

该程序(来自 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个字节,为什么我们还需要在这里再声明一次呢?另外,有人可以更详细地解释这两个逗号在这种情况下的用途吗?

x86 assembly att addressing-mode array-indexing

3
推荐指数
1
解决办法
1864
查看次数

汇编调用堆栈 - 术语问题

我是全新的大会,并希望确认在以下陈述中我有哪些误解,需要纠正.

堆栈指针(ESP)指的是堆栈的顶部(最低内存地址).

基指针(EBP)用于在构建堆栈帧时临时存储各种存储器地址.它通常保存当前堆栈帧的最高内存地址.

指令指针(EIP)指的是存储器的文本(代码)段中的一行代码的存储器地址

一旦某些东西被推入堆栈,它就不能就地更改.即.如果我们PUSH EBP到堆栈,我们正在推送当前值EBP,而不是某种引用或指针.然后我们不能就地改变这个价值.

传递给函数的参数通常被移动到地址空间中,该地址空间是堆栈指针的偏移量.即.[ESP-12].

调用函数(使用CALL)时,会发生以下情况:

  1. 返回地址被添加到堆栈(紧跟当前的地址的内存,EIP因此我们知道在被调用函数完成后返回的位置
  2. 保存的帧指针被添加到堆栈中,堆栈通常是调用函数的堆栈帧的堆栈指针
  3. 然后我们将进入被调用函数的序言

谢谢.我正试着绕过这些东西.

x86 assembly stack eip

2
推荐指数
1
解决办法
172
查看次数

标签 统计

assembly ×2

x86 ×2

addressing-mode ×1

array-indexing ×1

att ×1

eip ×1

stack ×1