assembly 如何在AVR汇编语言中反转字符串

fd3cxomn  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(179)

所以我必须在cseg中输入字符串

msg1_p: .db "Potato", 0 
msg2_p: .db "Paramer", 0

我正在编写一个子例程,当调用该子例程时,反转每个字符串,并将反转后的字符串分别存储在msg3_pmsg4_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模拟器。谢谢

qc6wkl3g

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文件:

Disassembly of section .text:

00000000 <strrev>:
   0:   dc 01           movw    r26, r24
   2:   fc 01           movw    r30, r24
   4:   67 2f           mov r22, r23
   6:   71 91           ld  r23, Z+
   8:   77 23           and r23, r23
   a:   e1 f7           brne    .-8         ; 0x4
   c:   32 97           sbiw    r30, 0x02
   e:   04 c0           rjmp    .+8         ; 0x18
  10:   7c 91           ld  r23, X
  12:   6d 93           st  X+, r22
  14:   70 83           st  Z, r23
  16:   62 91           ld  r22, -Z
  18:   ae 17           cp  r26, r30
  1a:   bf 07           cpc r27, r31
  1c:   c8 f3           brcs    .-14        ; 0x10
  1e:   08 95           ret

根据调用约定,字符串的地址在R25:R24中传递。
第一个循环查找字符串最右边的字符,第二个循环执行实际的反转。
"你还能做什么"

  • 使用适当的标签以确保易读性,而不是跳转偏移量。
  • 调整到您正在使用的ABI。
  • 该代码是为支持movwsbiw的arch avr4编译的。这可能会因您使用的设备而异。但对于ATmega2560,该代码是正确的。
  • 如果不需要原地反转,而是需要反转到新分配的存储器,则需要进行一些修改,考虑到上述出发点,这应该是可行的。

相关问题