簡體   English   中英

將字符串轉換為大寫

[英]Convert string to upper case

我試圖在匯編中迭代一個字符串,並將小寫字母更改為大寫字母,並在字符串為 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!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM