所以我必须在cseg中输入字符串
msg1_p: .db "Potato", 0
msg2_p: .db "Paramer", 0
我正在编写一个子例程,当调用该子例程时,反转每个字符串,并将反转后的字符串分别存储在msg3_p
和msg4_p
中。
这是我想出的算法
reverse_string:
push msg1_p unto stack letter by letter
pop of msg1_p letter by letter and store in msg3_p
push msg2_p unto stack letter by letter
pop of msg2_p letter by letter and store in msg4_p
return form subroutine
唯一的问题是,我不知道如何实现这个汇编语言。我真的很感激一些帮助。我正在使用AVR工作室4 atmeg2560 avr模拟器。谢谢
1条答案
按热度按时间qc6wkl3g1#
因此,让我们来了解一下用于AVR的GNU工具实现了什么:执行
> echo "" | avr-gcc -xc - -Wl,-u,strrev -o foo.elf -mmcu=avr4 && avr-objdump -d foo.elf
这会将一个空的输入文件
-
编译为C代码(-xc
),并将符号strrev
设置为 undefined,因此链接器会将其从libc中拖出来。strrev
会就地反转一个字符串。然后反汇编生成的ELF文件:根据调用约定,字符串的地址在R25:R24中传递。
第一个循环查找字符串最右边的字符,第二个循环执行实际的反转。
"你还能做什么"
movw
和sbiw
的archavr4
编译的。这可能会因您使用的设备而异。但对于ATmega2560,该代码是正确的。