簡體   English   中英

編寫匯編語言代碼來反轉字符串

[英]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 

代碼備注
不需要保持三個計數器在飛行中( ediesiecx ),兩個就足夠了。 esi倒計時, ecx倒計時。
x86 有很多非常有用的尋址模式,它們大多是免費的性能明智的。
最后一次迭代將讀取al的終止零,我們不需要反轉它,並且您已經在開始時編寫了它,所以它被(悄悄地)刪除了。
由於終止為零,長度至少為 1。這很好,因為如果以某種方式將 0 送入loop ,它將“永遠”循環; 不好(“永遠”是 4+ 十億次)

請注意,您的代碼沒有考慮 Unicode,因此它不適用於 UTF8,但我們假設它只是一個學習練習。

如果你遵循ABI ,那么你可以只在寄存器中傳遞參數,這意味着你可以跳過一些初始化。 鑒於您的代碼不會因原始速度而獲得任何獎勵,因此我跳過了這一步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM