2016-04-03 7 views
0

Ich muss "h4ppy c0d1ng" in "H4PPY C0D1NG" umwandeln. Ich bin ein Anfänger in dieser Sprache, aber hier ist mein Versuch (ubuntu i386 VirtualBox Mac) die int 21h ist falsch .Ich denke, außer, dass das Programm nicht noch drucken Sie die Zeichenfolge beenden, wenn sie ausgeführt:Montage: Kleinbuchstaben zu GROß

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

Sie nicht Ihr Betriebssystem, aber sehen Sie verwenden "Int 0x80" an einem Ort und "Int 0x21" in einem anderen, es sieht aus wie Sie Linux-Code mischen mit BIOS-Code. –

+0

Richtig, seine Ubuntu in Virtualbox auf Mac El Capitan – j1nma

+0

Entfernen Sie den Aufruf zu Int 21h und verwenden Sie den richtigen Weg, um die Anwendung unter Linux zu beenden. Dann korrigieren Sie Ihre Registerzuweisungen in toUpper und fügen Sie eine Schleife hinzu, um die Zeichenfolge zu durchlaufen. –

Antwort

3

einige kleinere Änderungen und es sollte laufen:

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 

edit:
aktualisiert „print“ zu arbeiten,
Bugfix für Groß machen: al hält das Zeichen, nicht cl
hinzugefügt ein Symbol, um die Länge der bestimmen Zeichenkette

getestet auf meiner Linux-Box, funktioniert es nicht

+0

Ich habe 0x0 auf 0 geändert, um nach dem nullenden Zeichen zu suchen. Leider funktioniert es nicht. Es druckt: # – j1nma

+1

Wenn du zurückkommst, ecx zeigt nicht mehr auf die Zeichenfolge (es sollte auf die 0 zeigen) Bist du sicher, dass du die richtige Zeichenfolge anzeigst? Ein Debugger könnte Ihnen helfen, den Inhalt zu untersuchen – Tommylee2k