2016-04-03 24 views
0

「h4ppy c0d1ng」を「H4PPY C0D1NG」に変換する必要があります。 私はこの言語では初心者ですが、ここで私の試み(Ubuntuのi386のVirtualBoxのMacが)である.Iは、実行時にプログラムは、文字列を終了したり印刷しないこと以外に、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

あなたはあなたのOSについては言及していませんが、別の場所で '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 

編集:仕事に
更新し、「印刷」、大文字を作るための
バグ修正:アルはCl、文字を保持していない
はの長さを決定するためにシンボルを追加します文字列

私のLinux上でテストされていますが、動作しません

+0

null終端文字を確認するために0x0を0に変更しました。残念ながら、それは動作していません。それは印刷されます: # – j1nma

+1

あなたが戻ってきたとき、ecxはもう文字列を指していません(0を指すはずです)正しい文字列を表示していますか?デバッガを使用すると、コンテンツを調べるのに役立ちます – Tommylee2k