2016-05-15 225 views
1

我有了這個代碼,應該改變大寫字母爲小寫字母:x86彙編:更改一個大寫字母爲小寫字母

void tolower(char *text) 
{ 
    _asm 
    { 
     mov esi, text; 
     mov ecx, 0; 
     mov bl, 32; 
     opakuj: 
     cmp [esi + ecx], 0; 
     je konec; 
     cmp [esi + ecx], 97; 
     jbe dolower; 
     add ecx, 1; 
     jmp opakuj; 

     dolower: 
     mov [esi + ecx], bl; 
     add ecx, 1; 
     jmp opakuj; 
     konec: 
    } 
} 

mov [esi + ecx], bl不起作用。我得到一個

訪問衝突寫入錯誤

我在做什麼錯?

P.S .:我不能使用其他數組或指針或類似的東西。我必須重寫那個char。

+0

難道是你試圖修改只讀內存中的字符串,如文字字符串?像'tolower(「HELLO WORLD」);'?您不應該嘗試修改文字字符串,只能複製。 –

回答

2

一種解決方案將被分別分離小寫字符和清除或設置比特0x20AND(大寫)或OR(小寫),像這樣在此描述的回答:"How to access a char array and change lower case letters to upper case, and vice versa"

void tolower(char *text) 
{ 
    _asm 
    { 
    mov esi, text; 
    mov ecx, -1; 
    opakuj: 
    inc ecx; 
    cmp [esi + ecx], 0;  // end of string 
    je konec; 
    cmp [esi + ecx], 65;  // lower bound for uppercase chars 
    jb opakuj; 
    cmp [esi + ecx], 90;  // upper bound for uppercase chars 
    ja opakuj; 
    ; and [esi + ecx], 223; // 11011111 binary - sets uppercase 
    or [esi + ecx], 32;  // 00100000 binary - sets lowercase 
    jmp opakuj 
    konec: 
    } 
} 
+0

@ValentinEmilCudelcu:對不起。我更新瞭解決方案。現在它將所有大寫字母轉換爲小寫字母。 223是按位不是32. – zx485

+0

謝謝。我想出瞭如何做到這一點! 我做的第二個變化是:cmp [esi + ecx],65; ,cmp [esi + ecx],90; –

+0

@ValentinEmilCudelcu:我不得不做另一個關於Jcc跳轉的問題。往上看。 – zx485

0

mov [esi + ecx], bl更改爲add [esi + ecx], bl可更正錯誤。

但是你的程序仍然不健壯。 (例如,如果輸入是什麼數字符?)

+0

我的不好,我嘗試添加[esi + ecx],bl到它並不工作。 假設這將只是從A到Z的字符。 –

+1

這很奇怪。代碼在我的電腦上編譯並正確運行。你測試它像'tolower(「ABCDEF」)'?不要這樣做。相反,創建一個'char test [] =「ABCDEF」',然後執行'tolower(test)'。 – WhatsUp

+0

你的字符串零終止?也許函數會,你想要什麼,但是可以停止字符串結束的地方,並且你超過了它? – Tommylee2k

相關問題