汇编:小写到大写

Assembly: lowercase to UPPERCASE

我需要将 "h4ppy c0d1ng" 转换为 "H4PPY C0D1NG"。 我是这门语言的初学者,但这是我的尝试(ubuntu i386 VirtualBox Mac)。我认为 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

一些小改动,应该 运行:

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

编辑:
更新 "print" 可以工作,
修正大写错误:al 保存字符,而不是 cl
添加了一个符号来确定长度字符串

在我的 linux 盒子上测试过,不工作