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
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
1条答案
按热度按时间uemypmqf1#
如果我们假设null终止字符串的地址标记为
STR_ADDR
,我们可以这样做:字符串
请注意,只有在堆栈上仍然需要数据的情况下,才能对堆栈进行进一步的更改,上面的代码才能工作。例如,如果您尝试将此代码 Package 为函数-您将不得不考虑
RET
,RCALL
,CALL
指令在调用时修改堆栈的事实。从堆栈中反向写出一个空终止字符串到内存中(假设你的内存地址是
SRAM_ADDR
,并且堆栈指针与前面的代码运行时相同-即在'\0' + 1的内存地址):型