我最近对学习汇编感兴趣,并建议自己做一个简单的练习,即取一个简单的字符串并将所有小写字符转换为大写。但是,由于我对此很陌生,所以我无法理解一些细节并使其发挥作用。
EXIT = 1
WRITE = 4
LINUX_SYSCALL = 0x80
.data
lowerA: .ascii "a"
lowerZ: .ascii "z"
msg: .ascii "Hello, world!\n"
msglen = (. - msg)
i: .int 0
.text
.global _start
_start:
movl lowerA, %eax
movl lowerZ, %ebx
movl $msglen, %edx
movl $msg, %ecx
mov i, %esi
A1:
cmp %edx, %esi
jz fim
cmp %eax,(%ecx)
jge lowerThanZ
jmp next_pos
lowerThanZ:
cmp %ebx,(%ecx)
jle capitalize
jmp next_pos
#esta subrotina e que vai fazer a acao necessaria para mudar a letra para maiusculo
capitalize:
#THIS WOULD BE WHERE I WOULD CONVERT LOWERCASE TO UPPERCASE
jmp next_pos
#sub-rotina para fazer o incremento do counter, do registo e voltar para o inicio de A1
next_pos:
add $1, %ecx
inc %esi
jmp A1
#acaba aqui
fim:
sub %edx, %ecx
movl $1, %ebx
movl $WRITE, %eax # pedir write ao sistema
int $LINUX_SYSCALL # chama o sistema
movl $0,%ebx
movl $EXIT,%eax # pedir o exit ao sistema
int $LINUX_SYSCALL # chama o sistema
您可以看到代码不完整,但我知道它不起作用 因为我一直在使用gdb(也是我相当新的东西)进行调试。
我已经看到循环是正确的(字符串最后打印,但处于原始状态)。事情是它不会进入大写子程序应该。 我知道我可以使用ASCII值来查看哪些匹配大写字母。但我仍然不明白如何正确地做到这一点。从我完成的研究数量来看,我理解如果我们在寄存器中有一个字符串/数组,寄存器指向所述字符串的第一个位置,如果我使用(%寄存器)我就会这样做获取该地址的内容。
所以我试图使用cmp来做到这一点,试图查看当前的char是否是lowerCase(在a-z之间)。而且我知道在cmp声明中出现问题但我无法理解为什么
可能我错过了一些重要的东西,所以我会非常感激你的帮助。
我在Linux上使用Assembly IA-32并且一直使用以下命令来汇编和链接:
as --32 -g -o hello.o hello.s
ld -m elf_i386 -o hello hello.o