2016-04-03 30 views
0

"h4ppy c0d1ng" yi "H4PPY C0D1NG" ye dönüştürmem gerekiyor. Ben bu dilde bir acemi değilim, ama burada programı bitirmek, ne de dize yazdırmak olmayacağını daha çalıştırıldığında int 21h, diğer yanlış olduğunu düşünüyorum .Ben benim girişimi (ubuntu i386 VirtualBox Mac) 'dir:Montaj: küçük harf ile UPPERCASE

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

İşletim sisteminizi belirtmiyorsunuz, ancak bir noktadan int int int ('int 0x80') ve başka bir bilgisayarda int int (0x21) kullandığınızı görüyorsanız, Linux kodunu BIOS kodu. –

+0

Sağ taraftaki sanal kutudaki ubuntu, – j1nma

+0

Aramayı int 21h'ye kaldırın ve uygulamayı Linux'ta sonlandırmak için uygun yolu kullanın. Ardından, kayıt görevlerinizi toUpper'da düzeltin ve dize boyunca ilerlemek için bir döngü ekleyin. –

cevap

3

bazı küçük değişiklikler ve çalıştırmalısınız:

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 

düzenleme:
updated "baskı"
bugfix büyük harf yapmak için, çalışmak için: değil, diğerleri char, tutan
cl uzunluğunu belirlemek için bir sembol ekledi dize

linux kutumda test edildi, işe yaramıyor

+0

Sıfır sonlandırma karakterini kontrol etmek için 0x0 değerini 0 olarak değiştirdim. Ne yazık ki çalışmıyor. Bu yazdırır: # 12 – j1nma

+1

döndüğünüzde, ekx artık dize işaret etmiyor (0 işaret etmelidir) doğru dizeyi görüntülediğinizden emin misiniz? Bir hata ayıklayıcı içeriği incelemenize yardımcı olabilir – Tommylee2k