将字符串转换为大写

春日

我正在尝试遍历汇编中的字符串,并将小写字母更改为大写字母,并在字符串为0时停止,但是似乎有些错误(我似乎缺少一个概念)。我不知道问题是什么或怎么回事。

这是我到目前为止的内容:

Upper:
        movq    (%rbx), %rcx
        movq    $0, %rdi
        call    check
        call    fin
        add     %rdi, %rax
        ret

    fin:
        cmpb    $0x0, %r9b
        jne     check
        ret

    check:
        movb    (%rcx, %rdi), %r9b
        cmp     $'Z', %r9b
        jg      toUpper
        jmp     next

    toUpper:
        sub     %r9b, 0x20
        jmp     next

    next:
        incq    %rdi
        jmp     fin

从外观上看,您的代码有些复杂,很难跟踪要实现的算法。

解决此类问题时,通常有助于首先用C或伪代码写下基本算法:

  • 对于每个字符 c
    • 如果c为空字节:完成
    • 如果c低于'a':忽略
    • 如果c以上'z':忽略
    • 否则:添加差异'A''a'c

这几乎直接转换为以下汇编程序:

upper:

    ; Read next character
    mov (%rdi), %al

    ; Test for zero byte
    test %al, %al
    je done

    ; Test for <'a' and >'z'
    cmp $'a', %al
    jl next
    cmp $'z', %al
    jg next

    ; We have a lower case character, so convert to upper case
    sub $0x20, %al ; Difference between 'A' and 'a'
    mov %al, (%rdi)

next:

    ; Increment pointer
    inc %rdi
    jmp upper

done:
    ret

该函数需要输入字符串指针rdi,因此可以直接从C调用:

#include <stdio.h>

extern void upper(char *str);

int main()
{
    char str[] = "abc 123 <=>? 987 xyz!";
    upper(str);
    printf("Upper case: %s\n", str);

    return 0;
}

输出

Upper case: ABC 123 <=>? 987 XYZ!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章