[英]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.