【问题标题】:Array access in assembly language汇编语言中的数组访问
【发布时间】:2012-02-23 01:37:18
【问题描述】:

我试图简单地总结汇编中的一个数组。

int main(){
 int a[5] = {1, 2, 3, 4, 5};
 int result;

 _asm{
   mov ecx, 5 ;set the counter for 5
   mov eax, 0 ;zero eax
 NXT: add eax, [esi*4+a] ;add array value
      inc esi ;increase esi to read next value
      LOOP NXT ;loop back to next

   mov [result], eax ;mov eax into result

  }

 printf("result: %u",result);

无论数组的值是多少,总和为 2。

我正在尝试在 Mac 上运行。

我正在编译使用:

gcc -fasm-blocks -m32 -c sum.cpp

和链接

gcc -arch i386 -g -o sum sum.o

我尝试了各种方法,但似乎无法对数组求和。

【问题讨论】:

    标签: macos gcc assembly inline-assembly


    【解决方案1】:

    您似乎没有将 esi 初始化为任何内容,因此它在循环开始时包含一些随机值。

    另外,由于a存在于一个非固定位置(毕竟它是一个局部变量),你应该先将a的地址加载到一个寄存器中:

    lea ebx, a
    ...
    add eax, [esi*4+ebx]
    

    我怀疑你的内联汇编器对 [esi*4+a] 做错了。

    【讨论】:

    • 初始化为零。我已经通过在 asm 语句中执行 mov [result], esi 对此进行了测试。
    • @millsj,你不应该依赖将 esi 设置为 0,你应该明确地强制执行它。
    • @paxdiablo 可以理解,我在开头添加了一行将其设置为 0,但输出没有变化,但仍显示为 2。
    • 添加mov ebx, a 行现在会导致总线错误。 gdb disassemble 显示它发生在添加行:0x00001ecd <main+109>: add (%ebx,%esi,4),%eax。有什么方法可以阻止 a 的值变化吗?
    • 实际上,您可能需要lea,我会更新我的答案(这完全取决于您的汇编程序如何解释内存引用)。或者,您可以将 a 设为全局变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    相关资源
    最近更新 更多