2014-12-03 66 views
3

假定以下功能:访问元素在阵列与组件

void asmFunction(const int *first, ...) { 
    __asm { 
     xor eax, eax 
     add eax, [first][0] 
     ; ... 
    } 
} 

它被称为是这样的:

int first[] = { 0, 0, 0, 0, 0, 0, 0, 5, 7, 6, 2, 4, 3, 5 }; 
asmFunction2(first, ...); 

据我明白,第二流水线必须添加的0元件阵列firsteax。但是,正在添加一个随机值。调试时,first[0]等于0,因为它必须是。代码有什么问题?

我在64位机器上的Visual Studio 2013中编写代码。

+0

我不是专家,但不应该是'add eax,[first + 0]'?用'[]'引用'第一个'指针/地址。对于元素1:'add eax,[first + 4]'等等。 – 2014-12-03 12:33:07

+0

@意义重要性据我所知,''[first] [0]'与'[first + 0]'相同,但我不确定。 – 2014-12-03 13:26:20

回答

1

这是一个奇怪的语法,可能不会做你想做的。如果你反汇编生成的代码,你很可能会看到类似add eax, [ebp+8]的东西。随机值应该是first的值,它是一个指针。你已经有效完成了eax += first。要获取元素,您需要一个间接级别,即eax += *first。例如,这可能会起作用:

mov edx, [first] 
add eax, [edx] 
+0

有趣。不幸的是,目前我无法测试它。 'add eax,[[first]]'语法是可接受的还是错误的? – 2014-12-03 13:27:49

+1

x86不支持双重间接,因此即使某些汇编程序接受该表单,也不会起作用。 – Jester 2014-12-03 14:13:14