2014-12-03 146 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