将字符串转换为大写

春日

我正在尝试遍历汇编中的字符串,并将小写字母更改为大写字母,并在字符串为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条评论
登录后参与评论

相关文章

来自分类Dev

将字符串转换为大写

来自分类Dev

将大写字符串转换为小写的命令?

来自分类Dev

将字符串转换为大写C ++

来自分类Dev

将大写字符串转换为小写的命令?

来自分类Dev

lisp转换为字符串大写

来自分类Dev

将字符串中的字符转换为大写不起作用

来自分类Dev

将字符串中的奇数和偶数索引字符转换为Javascript中的大写/小写?

来自分类Dev

错误将字符串中的字符转换为大写

来自分类Dev

如何将小写字符串转换为大写,反之亦然?

来自分类Dev

如何使用Regex将字符串的首字母转换为大写

来自分类Dev

Javascript-将字符串中的所有字母都转换为大写或小写

来自分类Dev

使用TSQL存储过程将大写句子的字符串转换为句子大小写

来自分类Dev

在没有内置方法的情况下将字符串转换为大写

来自分类Dev

SQL Server,将字母数字字符串转换为大写字母数字

来自分类Dev

如何将字符串转换为以大写字母开头

来自分类Dev

如何连接字符串并将其转换为大写

来自分类Dev

将字符转换为大写

来自分类Dev

将字符串转换为Uri字符串

来自分类Dev

将字符串转换为字节字符串

来自分类Dev

将字符串转换为整数

来自分类Dev

将Clob转换为字符串

来自分类Dev

将字符串转换为datenum

来自分类Dev

将字符串转换为映射

来自分类Dev

将字符串转换为LatLng

来自分类Dev

将字符串转换为小写

来自分类Dev

将字符串转换为字典

来自分类Dev

将字符串转换为地图?

来自分类Dev

将字符串转换为T

来自分类Dev

将字符串转换为日期