assembly 如何从程序mem中加载一个以null结尾的字符串并推入堆栈?

9nvpjoqh  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(92)

我正在学习汇编语言,特别是AVR,谁能告诉我如何从程序mem中加载一个以null结尾的字符串并推入堆栈?如何将反转后的字符串写入数据存储器?多谢了
我知道怎么装子弹,但我还是迷路了

uemypmqf

uemypmqf1#

如果我们假设null终止字符串的地址标记为STR_ADDR,我们可以这样做:

LDI ZL, LOW(STR_ADDR << 1)
LDI ZH, HIGH(STR_ADDR << 1)    // LOAD A PROGRAM MEMORY ADDRESS INTO Z POINTER

LPM R16, Z+                    // LOAD DATA BYTE FROM PROGRAM MEMORY
PUSH R16                       // PUSH IT ONTO THE STACK
CPI R16, '\0'                  // CHECK IF DATA BYTE IS THE NULL TERMINATOR
BRNE PC-3                      // IF NOT -> START NEXT ITERATION
                               // ELSE CONTINUE PROGRAM EXECUTION

字符串
请注意,只有在堆栈上仍然需要数据的情况下,才能对堆栈进行进一步的更改,上面的代码才能工作。例如,如果您尝试将此代码 Package 为函数-您将不得不考虑RETRCALLCALL指令在调用时修改堆栈的事实。
从堆栈中反向写出一个空终止字符串到内存中(假设你的内存地址是SRAM_ADDR,并且堆栈指针与前面的代码运行时相同-即在'\0' + 1的内存地址):

LDI ZL, LOW(SRAM_ADDR)
LDI ZH, HIGH(SRAM_ADDR)

POP R16                        // LOAD THE DATA BYTE FROM THE STACK
ST Z+, R16                     // STORE THE DATA BYTE TO SRAM
CPI R16, '\0'                  // CHECK IF DATA BYTE IS THE NULL TERMINATOR
BRNE PC-3                      // IF NOT -> START NEXT ITERATION

  • 重要提示 * 如果您使用的是atmel AVR汇编程序以外的其他程序,则上述解决方案可能无法工作。如果您使用GCC/GNU AVR编译器或其他一些编译器,则约定会略有不同,因为这些编译器具有不同约定的略微不同的解析器。

相关问题