【问题标题】:Refer to memory location with an offset in GNU Assembly在 GNU 汇编中使用偏移量引用内存位置
【发布时间】:2023-03-19 07:00:01
【问题描述】:

对于这个新手问题,我很抱歉,但奇怪的是我找不到这个问题的正确答案。简单地说,假设我想从某个变量移动到 %ecx 寄存器。这个变量是一个充满输入的缓冲区。如何在特定偏移量处引用缓冲区,即缓冲区 + 1 或缓冲区 + n?我需要它来进行基本的字符串迭代。

感谢所有帮助,即使它只是帮助我找到以前的帖子来回答它但我找不到。

【问题讨论】:

  • 这不是您要询问的寄存器,而是一个变量。你引用它的方式和你展示的完全一样:movl buffer + 1, %ecx。如果偏移量不是恒定的,则将其加载到寄存器中并使用movl buffer(%eax), %ecx 之类的东西。这是您应该阅读一些介绍性材料的基本知识。 PS:对于字符串,您可能想要使用 8 位目标或 movzbl/movsbl
  • @Jester 首先,我没有任何合适的介绍性材料,我拥有的一本关于汇编的书是 x86 架构的。所以它实际上只是 [variableName] + [offset]?
  • 您应该小心[] 符号,因为它在 intel 语法中有其自身的含义。我已经向您展示了示例,这就是它的外观。另请参阅as manual
  • 请不要删除架构标签。
  • 这也适用于 x86 吗?如果是这样,我没有问题,但问题是关于 GAS 组装。

标签: assembly x86 offset gnu gnu-assembler


【解决方案1】:

在 AT&T 语法(由 GAS 使用)中,以下用于间接偏移参考:

 movl     8(%ebp), %eax   ; Move from EBP+8 into EAX

在 Intel 语法中(实际上 GAS 也可以理解和接受)它是:

 MOV      EAX, [EBP+8]

另一种选择(您似乎对此感兴趣)是 Base Plus Index 寻址:

 MOV      EAX, [EBX + EDI]

这会将内存位置的内容移动到 EAX(使用 Intel 格式)中,即 EBX 和 EDI 的总和。在 AT&T 格式中,这将是:

 movl     (%ebx,%edi), %eax

老实说,我很少使用这种形式。您可能必须包含比例因子。您可以使用一个来满足您的需求:

 movl     (%ebx,%edi,1),%eax   ; Where 1 is a scaling factor (ebx+edi*scale)

【讨论】:

  • 你能告诉我你的第一个例子吗,但不是 8 而是使用一个包含偏移量的寄存器?
  • 我添加了一些应该可以使用的示例。可能需要调整。我很少以这种方式编写代码,并且尽可能避免使用 AT&T 语法。 :)
  • 我好像还是有问题。在这里,我将展示有问题的代码:movl $buffer, %edi - movl (%edi,%esi), %ecx %esi 的内容在我知道有效的循环中递增,并且每次循环开始时都会调用 movl $buffer, %edi。但是,它并没有将索引正确地递增为一个接一个,并且似乎随机跳动。我做得对吗?
  • 这听起来好像你有一个完全不同的问题需要调试。我认为你在这里的问题是一个很好的问题,你应该保持原样,因为它已经得到了回答。我会打开一个新问题,发布您的代码并询问您刚刚在这里对我说的话......“我不明白为什么这个索引会随机跳跃。我错过了什么??”
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
相关资源
最近更新 更多