2013-05-18 48 views
1

我正在使用MASM程序集,並且正在嘗試編寫一個循環來處理字符串str1,逐字節地將每個小寫字母更改爲相應的大寫字母,使用位操作。如果這封信已經是大寫了,請不要管它。一切似乎當我執行我的代碼,我有困難,搞清楚爲什麼,也許我不應該被處理我的陣正因爲如此,但儘管如此,這裏的代碼發生在我的字符串STR1:在MASM程序集中逐字節地循環和處理字符串

 .386 
     .MODEL FLAT 

     str1 dword "aBcD", cr, Lf, 0 
     .... 

     .code 
_start: 
     output str1 
     **sub esi, esi     ; sum = 0 
     lea ebx, str1 
top: mov al, [ebx + esi]   ; attempting to move each character value from    
             str1 into the register al for comparison and 
             possible conversion to uppercase 
     add esi, 5 
     cmp al, 0 
     je zero 
     sub al, 20h**     ; convert lowercase to corresponding uppercase 
     loop top 
zero: output zeromsg     ; for TESTING of al purposes only 
done: output str1value 
     output str1 

什麼更改,並且在不進行轉換的情況下,將以相反的順序打印字符串。爲什麼?打印出來爲:「DcBa」。任何查詢將不勝感激!提前致謝。

回答

2

您必須加載字符,處理它並將其存回。你不存儲它。

喜歡的東西:

mov [esi+ebx], al 

丟失。

爲什麼你從char中分出0x20?爲什麼你給esi加5?

更新

你開始編碼之前,你應該想想所需的步驟是什麼。

  1. 加載角色。
  2. 如果字符爲0,則字符串完成。
  3. 如果字符爲大寫,將其轉換
  4. 保存字符
  5. Adavance到下一個字符,返回1

就是這樣。現在,當您查看代碼示例時,您可以輕鬆看到缺少的內容以及出錯的位置。

+0

是的,謝謝你,我錯過了。我只需要將esi遞增1,並且我從字符0x20中將小寫更改爲大寫,但我將其更改爲一個操作或al,20h @Devolus –

+0

我知道您試圖執行的操作,但在您的代碼中,您無條件地做20分錯誤。而增加esi更好,因爲我不會使用索引操作來完成這樣的任務。真的沒有道理,你應該避免讓ASM程序比它需要的更復雜。用簡單的話來說明這個要求通常是一個很好的理念,因爲這已經可以給你一個很好的提示,如何實現它。 – Devolus

0

可能你有點幫助

.writeLoop2 
    mov eax,[ebx]   ;mov eax start of data block [ebx] 
    cmp al,&61    ;61hex is "a" 
    jb dontsub20   ;if its less don't bother because it's a CAPITAL letter 
    sub al,&20    ;else take off 20 hex 
    .dontsub20 
    call "osasci"   ;print to screen command. Output the character in eax 
    inc ebx    ;move ebx forward to next character 
    inc ecx    ;ecx is the rolling count 
    cmp ecx,edx   ;when ecx=edx we are at the end of the data block 
    jb writeLoop2   ;otherwise loop, there are more characters to print