2016-06-10 70 views
0

有沒有辦法在指針數組上使用lea加載字符串數組中字符串的有效地址?

例如,我們有一串字符串,是否可以用lea做一行而不是兩行用+標記?

.data 
ARR DWORD STR1, STR2 ... 
STR1 byte "asdad", 0 
... 
.code 
;;;lea edx, [ARR+4*eax] 
mov edx, offset ARR ;+ 
mov edx, [edx+4*eax] ;+ 
call writestring 

註釋掉lea不工作和其他一切我嘗試甚至不經過組裝。

+0

嘗試'LEA ARR [EDX + 4 * EAX。它應該是'REG + SCALE * REG + disp32'。 – zx485

+0

@ zx485它不起作用。即使在'LEA ARR [edx + 4 * eax]'之前執行'mov edx,offset ARR'也是如此。 – shinzou

回答

4

您實際上並不想使用LEA,因爲它計算的是您希望包含在該地址中的數據的地址。

如果您使用的是LEA,它會爲您提供陣列中位置的地址。你不能在寫入字符串時使用它。例如,與C相比,這將是char**,而您想要char*

如果你想寫字符串,你必須像你一樣做。您實際上正在讀取數組中包含的指針。

所以總之,LEA是不是你想要的,你想要的MOV s你已經使用。您可以把它縮短到一個MOV

mov edx, ARR[4*eax] 

或NASM

mov edx, [4*eax + ARR] 
+0

這工作,我們怎麼不需要'抵消'? – shinzou

+1

'offset'表示符號的地址。所以''偏移量ARR]'基本上等於較短的'[ARR]',而'偏移量[ARR]'沒有多大意義 - 這就是'lea'所做的事情,但它並不稱之爲偏移量,「lea」中的「ea」表示「有效地址」。當某些彙編程序將'mov eax,ARR'視爲具有ARR地址的加載eax時,通常會使用'offset',而另一些則是在ARR地址處加載具有值的eax。我完全避免了這種語法,並根據我想要加載的內容使用'mov eax,offset ARR'或'mov eax,[ARR]'。 – Ped7g

相關問題