[英]Write an assembly language code to reverse a string
這是一個反轉字符串的代碼我真的很難完成這段代碼。 我找不到它有什么問題,但是輸出是錯誤的。
mov esi, OFFSET source
mov edi, OFFSET target
add edi, SIZEOF target-2
mov ecx, SIZEOF source-1
L1:
mov al, [esi]
mov [edi], al
inc esi
dec edi
loop L1
向函數傳遞兩個長度有點奇怪。 如果兩者不匹配,可能會發生各種不好的事情。 最好明確傳遞字符串的長度,或者讓代碼計算出長度。
由於獲取 old-skool c-string 的長度對代碼來說很重要,但對 google 來說很簡單,我將把它作為參數傳遞。
“……輸出錯誤。”
問題是您的字符串需要以零結尾,但您沒有將終止零放在目標字符串上。
首先,如果您想讓字符串成為有效的 c 樣式字符串,請確保添加終止零,如下所示: source db "test test",0
mov esi, OFFSET source ;Start of source
mov edi, OFFSET target ;start of dest
;length EQU SIZEOF source ;we are reversing source
mov ecx, SIZEOF source ;Length of the string
;(includes the terminating 0)
Setup:
;//a c-string must have a terminating 0!
xor eax,eax ;al=0, put the terminating zero in first
L1:
mov [edi+ecx-1], al ;if length(ecx)=1, then write to [edi] directly.
mov al, [esi]
inc esi
loop L1
代碼備注
不需要保持三個計數器在飛行中( edi
, esi
, ecx
),兩個就足夠了。 esi
倒計時, ecx
倒計時。
x86 有很多非常有用的尋址模式,它們大多是免費的性能明智的。
最后一次迭代將讀取al
的終止零,我們不需要反轉它,並且您已經在開始時編寫了它,所以它被(悄悄地)刪除了。
由於終止為零,長度至少為 1。這很好,因為如果以某種方式將 0 送入loop
,它將“永遠”循環; 不好(“永遠”是 4+ 十億次) 。
請注意,您的代碼沒有考慮 Unicode,因此它不適用於 UTF8,但我們假設它只是一個學習練習。
如果你遵循ABI ,那么你可以只在寄存器中傳遞參數,這意味着你可以跳過一些初始化。 鑒於您的代碼不會因原始速度而獲得任何獎勵,因此我跳過了這一步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.