2016-04-03 2 views
0

Мне нужно преобразовать «h4ppy c0d1ng» в «H4PPY C0D1NG». Я новичок на этом языке, но вот моя попытка (убунту i386 VirtualBox Mac) .Я думаю, что INT 21h неправильно, кроме того, что программа не завершится ни напечатать строку при выполнении:Сборка: в нижнем регистре до 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

Вы не указали свою ОС, но, заметив, что вы используете 'int 0x80' в одном месте и' int 0x21' в другом, похоже, что вы смешиваете код Linux с Код BIOS. –

+0

Правильно, его ubuntu в virtualbox на mac el capitan – 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 

редактировать:
обновленных «печать», чтобы работать,
багфикса для изготовления верхнего регистра: аль содержит символ, не ХЛ
добавлен символ для определения длины из строка

проверено на моем линке, не работает

+0

Я изменил 0x0 на 0, чтобы проверить нулевой завершающий символ. К сожалению, он не работает. Он печатает: # – j1nma

+1

, когда вы возвращаетесь, ecx больше не указывает на строку (она должна указывать на 0), вы уверены, что вы показываете правильную строку? отладчик может помочь вам изучить содержимое – Tommylee2k

Смежные вопросы