将字符串转换为大写
Convert string to upper case
我试图在汇编中迭代一个字符串,并将小写字母更改为大写字母,并在字符串为 0 时停止,但似乎有些不对劲(我似乎缺少一个概念)。我无法弄清楚问题是什么或发生了什么。
这是我目前的情况:
Upper:
movq (%rbx), %rcx
movq [=10=], %rdi
call check
call fin
add %rdi, %rax
ret
fin:
cmpb [=10=]x0, %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 [=10=]x20, %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!
我试图在汇编中迭代一个字符串,并将小写字母更改为大写字母,并在字符串为 0 时停止,但似乎有些不对劲(我似乎缺少一个概念)。我无法弄清楚问题是什么或发生了什么。
这是我目前的情况:
Upper:
movq (%rbx), %rcx
movq [=10=], %rdi
call check
call fin
add %rdi, %rax
ret
fin:
cmpb [=10=]x0, %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 [=10=]x20, %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!