2016-04-03 141 views
0

我需要將「h4ppy c0d1ng」轉換爲「H4PPY C0D1NG」。 我在這個語言的初學者,但這裏是我的嘗試(Ubuntu的I386 VirtualBox的蘋果機)。我認爲執行時INT 21H是錯誤的,除了該程序將無法完成,也沒有打印字符串:大會:小寫大寫

section .text 
GLOBAL _start 

_start: 
     mov ecx, string 
     mov edx, length 
     call toUpper 
     call print 

     mov eax, 1 
     mov ebx, 0 
     int 80h 

;String in ecx and length in edx? 
;------------------------- 
toUpper: 
     mov eax,ecx 
     cmp al,0x0 ;check it's not the null terminating character? 
     je done 
     cmp al,'a' 
     jb next_please 
     cmp al,'z' 
     ja next_please 
     sub cl,0x20 
     ret 
next_please: 
     inc al 
     jmp toUpper 
done: int 21h ; just leave toUpper (not working) 
print: 
     mov ebx, 1 
     mov eax, 4 
     int 80h 
     ret 
section .data 
string db "h4ppy c0d1ng", 10 
length equ $-string 
+3

你沒有說明你的操作系統,但是看到你在一個地方使用'int 0x80'而在另一個地方使用'int 0x21',它看起來像是在混合Linux代碼BIOS代碼。 –

+0

正確,它的ubuntu在mac el capitan的virtualbox上 – j1nma

+0

刪除對int 21h的調用並使用正確的方式在Linux上終止應用程序。然後將您的寄存器分配修改爲toUpper並添加一個循環來檢查字符串。 –

回答

3

一些細微的變化,它應該運行:

section .text 
GLOBAL _start 

_start: mov ecx, string 
     call toUpper 
     call print 
     mov eax,1 
     mov ebx,0 
     int 80h 

toUpper: 
     mov al,[ecx]  ; ecx is the pointer, so [ecx] the current char 
     cmp al,0x0 
     je done 
     cmp al,'a' 
     jb next_please 
     cmp al,'z' 
     ja next_please 
     sub al,0x20  ; move AL upper case and 
     mov [ecx],al  ; write it back to string 

next_please: 
     inc ecx   ; not al, that's the character. ecx has to 
          ; be increased, to point to next char 
     jmp toUpper 
done: ret 

print: mov ecx, string ; what to print 
     mov edx, len  ; length of string to be printed 
     mov ebx, 1 
     mov eax, 4 
     int 80h 
     ret 

section .data 
string: db "h4ppy c0d1ng",10,0 
len: equ $-string 

編輯:
更新「打印」工作,
bug修正製作大寫:人持有的字符,而不是CL
增加了一個符號,以確定的長度字符串

在我的linux盒子上測試過,不是有效

+0

我將0x0更改爲0以檢查空終止字符。不幸的是它不工作。它打印: # – j1nma

+1

當你返回時,ecx不再指向字符串(它應該指向0)你確定你顯示的是正確的字符串嗎?調試器可以幫助您檢查內容 – Tommylee2k