我正在学习汇编语言,在尝试创建一个字符串转换函数时,它接收一个字符串并返回一个UPPERCASEd字符串,我被下面的代码卡住了:
asm_func3:
mov rbp, [rax] ; stores argument received in rbp
push rcx ; prepare rcx for use
xor rcx,rcx ; zero counter
_toupper:
cmp byte [rbp+rcx], 61h ; is lowercase ascii?
jl _toupper_next ; no, go to next char
cmp byte [rbp+rcx], 7Ah ; is lowercase ascii?
jg _toupper_next ; no, go to next char
sub byte [rbp+rcx], 20h ; subtract 32 to convert lowercase to uppercase
_toupper_next:
inc rcx ; next char
cmp byte [rbp+rcx], 0h ; is end of string?
jne _toupper ; start again
_toupper_end:
mov rax, rbp ; copy the result to return register
pop rcx ; release rcx
ret
我接到一个信号车:
cmp byte [rbp+rcx], 61h ; is lowercase ascii?
我从一个C程序调用这个函数如下:
printf("%s", asm_func3("abcdef\n"));
我怀疑我没有正确处理RBP,但我用尽了我所有的信息来源。有人能帮帮我吗?
2条答案
按热度按时间xu3bshqb1#
工作代码:
6ljaweal2#
谢谢大家的评论。在查看了文档之后,我设法让下面的代码工作。还有其他意见吗?
现在我只需要弄清楚如何清除RSI,从以前的呼叫中删除任何“垃圾”。