我试图遍历汇编中的字符串,并将小写字母更改为大写字母,并在字符串为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
add $0xe0,%al
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!