我正在尝试遍历汇编中的字符串,并将小写字母更改为大写字母,并在字符串为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] 删除。
我来说两句