我想學習Delphi中的內聯彙編編程,爲此我發現this article非常有幫助。Delphi彙編函數返回一個長字符串
現在我想編寫一個返回一個長字符串的彙編函數,特別是AnsiString
(爲簡單起見)。我已經寫
function myfunc: AnsiString;
asm
// eax = @result
mov edx, 3
mov ecx, 1252
call [email protected]
mov [eax + 0], ord('A')
mov [eax + 1], ord('B')
mov [eax + 2], ord('C')
end;
說明:
返回一個字符串的函數有一個看不見的var result: AnsiString
(在這種情況下)參數,所以,在函數的開始,eax
應持有所產生的字符串的地址。然後我分別將edx
和ecx
設置爲3和1252,然後撥打System._LStrSetLength
。實際上,我做
_LStrSetLength(@result, 3, 1252)
其中3是字符串的新長度(字符數=字節),1252是標準windows-1252代碼頁。
然後,知道eax
是the address of the first character of the string,我只需將字符串設置爲「ABC」。但它不起作用 - 它給我無意義的數據或EAccessViolation。問題是什麼?
更新
現在我們的myfunc
兩個看似工作的實施,一個採用NewAnsiString
和一個採用LStrSetLength
。我不禁想知道它們是否都是正確的,因爲它們並不妨礙Delphi對字符串的內部處理(引用計數,自動釋放等)。
對於Delphi/Asm的問題,Embarcadero的BASM論壇也很有用。使用字符串,你可能也對這個線程感興趣:http://forums.embarcadero.com/thread.jspa?threadID=20231 – PhiS 2010-07-23 08:49:59