x86 程序集(高级索引模式):如何访问起始地址之前可变数量的内存?

x86 Assembly (Advanced Indexing Mode): How do I access memory at a variable amount ahead of a start address?

我正在尝试从存储在EAX 寄存器中的内存地址开始逐字节读取一段内存。我将当前字节推送到 EBX 寄存器。但是,当我执行以下代码行(高级索引模式)时:

movb byteCount(%eax), %ebx

我收到以下错误:

Program received signal SIGSEGV, Segmentation fault.

A​​ssembly 似乎不支持在高级索引中使用标签。我将如何在不使用标签或在 (%eax) 之前注册的情况下模拟相同的操作?下面是数据部分:

.data
    str:
        .string "abcdefg"
        
    byteCount:
        .int 1

在那种情况下,byteCount 是标签地址,而不是碰巧在内存中的双字。您需要将所有 runtime-variable 东西加载到寄存器中才能在寻址模式下使用它们; x86 不进行 memory-indirect 寻址。

   mov    byteCount, %edx           # dword load
   movzbl (%eax, %edx), %ebx        # zero-extending byte load

或者您当然可以使用 add byteCount, %eax 和 deref (%eax)。或者更好的是,您可以首先将 byteCount 保存在寄存器中,无论如何您都需要它。这就是寄存器的用途。 (通常你不应该)。


movb 进入 EBX 是一个错误(operand-size 不匹配),所以这肯定不是你实际 运行。但这将访问 bytecount[ (uintptr_t)eax ] 处的一个字节。如果您只使用 mov,那将是双字加载。

但无论如何,两个地址的总和很少是有效地址,因此它会出现段错误。您的调试器应该告诉您错误地址,以便您可以看到它远离 str.


相关:

  • (Intel-syntax 接近重复)。
  • (AT&T 寻址模式语法)