汇编:小写到大写
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 盒子上测试过,不工作
我需要将 "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 盒子上测试过,不工作