Assembly x86汇编(高级索引模式):如何在开始地址之前以可变数量访问内存?

Assembly x86汇编(高级索引模式):如何在开始地址之前以可变数量访问内存?,assembly,x86,gnu-assembler,att,addressing-mode,Assembly,X86,Gnu Assembler,Att,Addressing Mode,我试图从存储在EAX寄存器中的内存地址开始,逐字节读取一段内存。我将当前字节推送到EBX寄存器。但是,当我执行以下代码行(高级索引模式)时: 我得到以下错误: 程序收到信号SIGSEGV,分段故障。 似乎程序集不支持在高级索引中使用标签。如果不在(%eax)之前使用标签或寄存器,我将如何模拟相同的操作?以下是数据部分: .data str: .string "abcdefg" byteCount: .int 1

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

我得到以下错误:

程序收到信号SIGSEGV,分段故障。

似乎程序集不支持在高级索引中使用标签。如果不在(%eax)之前使用标签或寄存器,我将如何模拟相同的操作?以下是数据部分:

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

在该上下文中,
字节数
是标签地址,而不是内存中的dword
。您需要将所有运行时变量加载到寄存器中,以便在寻址模式下使用它们;x86不执行内存间接寻址

   mov    byteCount, %edx           # dword load
   movzbl (%eax, %edx), %ebx        # zero-extending byte load
当然,您也可以使用
添加字节数,%eax
和deref
(%eax)
。或者更好的方法是,您可以将
字节计数
放在一个寄存器中,不管您在哪里需要它。这就是寄存器的用途。(通常你不应该这样做)


movb
进入EBX是一个错误(操作数大小不匹配),所以肯定不是您实际运行的。但这将访问字节计数[(uintpttr_t)eax]处的一个字节。如果您只使用了
mov
,它将是一个dword加载

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


相关的:

  • (英特尔语法接近重复)
  • (AT&T寻址模式语法)

组件支持它。这就是你的代码通过汇编程序的原因。崩溃发生在运行时,而不是汇编时。@RaymondChen字节计数是否需要具有某种类型才能被汇编支持?在这种情况下,
byteCount
是标签地址,而不是内存中的dword。您需要将所有运行时变量加载到寄存器中,以便在寻址模式下使用它们;x86不执行内存间接寻址。
   mov    byteCount, %edx           # dword load
   movzbl (%eax, %edx), %ebx        # zero-extending byte load