在x86程序集

时间:2018-04-30 01:38:36

标签: assembly x86

我最近对学习汇编感兴趣,并建议自己做一个简单的练习,即取一个简单的字符串并将所有小写字符转换为大写。但是,由于我对此很陌生,所以我无法理解一些细节并使其发挥作用。

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

0 个答案:

没有答案