在 AVR Assembly 中更新数组中的元素

问题描述 投票:0回答:1

所以我试图更新数组中的一个元素,该元素用于打印其中的值,但更新数组后,打印的内容仍然相同,打印机使用数组

buffer
,我想获取
上的第一个元素message
并将其放在
buffer

的第一个元素上

uno.s

;------------------------
; Assembly Code
;------------------------
#define __SFR_OFFSET 0x00
#include "avr/io.h"
;------------------------
.global init_serial
.global print_msg
.global print_buff
;------------------------
init_serial:

    CLR   R24
    STS   UCSR0A, R24               ;clear UCSR0A register
    STS   UBRR0H, R24               ;clear UBRR0H register
    LDI   R24, 103                  ;& store in UBRR0L 103 value
    STS   UBRR0L, R24               ;to set baud rate 9600
    LDI   R24, 1<<RXEN0 | 1<<TXEN0  ;enable RXB & TXB
    STS   UCSR0B, R24
    LDI   R24, 1<<UCSZ00 | 1<<UCSZ01;asynch, no parity, 1 stop, 8 bits
    STS   UCSR0C, R24
    RET
;-------------------------------------------------------------------------

buffer: .ascii "Tetha"
        .byte 10,13,0

loop:
  rjmp loop

light:
   ldi   R24, 0b00000001
   out   0x05, R24
   ;rjmp loop
   ret

print_buff:
    lds r16, message
    sts buffer, r16
    call light
    RET

print_msg:

    LDI   R30, lo8(buffer)
    LDI   R31, hi8(buffer)         ;Z points to string message
agn:LPM   R18, Z+                   ;load char of string onto R18
    CPI   R18, 0                    ;check if R18=0 (end of string)
    BREQ  ext                       ;if yes, exit
    ;--------------------------------------------------------------------
l1: LDS   R17, UCSR0A
    SBRS  R17, UDRE0                ;test data buffer if data can be sent
    RJMP  l1
    STS   UDR0, R18                 ;send char in R18 to serial monitor
    ;--------------------------------------------------------------------
    RJMP  agn                       ;loop back & get next character
    ;--------------------------------------------------------------------
ext:RCALL delay_sec
    RET
;------------------------------------------------------------------------
message:
    .space 32, 0x41
    .ascii "b"
    .byte 10,13,0
;------------------------------------------------------------------------
delay_sec:                          ;3s delay
    LDI   R20, 255
l4: LDI   R21, 255
l5: LDI   R22, 255
l6: DEC   R22
    BRNE  l6
    DEC   R21
    BRNE  l5
    DEC   R20
    BRNE  l4
    RET

uno.ino

//------------------------------------------------
// Programming Serial Port - Printing Text Message
//------------------------------------------------
extern "C"
{
  void init_serial();
  void print_buff();
  void print_msg();
}
//----------------------------------------------------
void setup()
{
  init_serial();
  print_buff();
}
//----------------------------------------------------
void loop()
{
  
  print_msg();
}

我正在使用this网站的教程,但仍然更新元素不起作用...

assembly arduino avr
1个回答
0
投票

您的

buffer
位于 Flash 中,实际上位于
.text
部分,因为您没有提供部分。 您可以使用
LPM
从该位置读取,但无法使用
STS
写入。

有关章节,请参阅 AVR-LibC 手册中的章节:

您可以将其放入

.data
部分,就像

.data
.type buffer,@object
buffer: .ascii "Tetha"
        .byte 10,13,0
.size buffer, . - buffer

.text ;; following is code

还要注意的是

  • "Theta"
    不会以 0 结尾,也许可以考虑
    .asciz
  • buffer
    可能无法在启动时初始化。 确保在使用默认启动代码时引用了
    __do_copy_data
    。 当您有自定义启动代码时,您必须手动初始化
    buffer

我正在使用这个网站的教程

他们使用其他汇编语法,而不是 GNU 的 avr-as。 当您想要将 C/C++ 和汇编结合起来,或者使用 C 库函数时,GNU 汇编器是正确的选择。

所有汇编必须首先通过 avr-gcc 的说法当然不正确,尽管这是利用 C 宏和

#include <avr/io.h>
等内容的最简单方法。AVR-LibC 有一些(内联)汇编教程使用 GNU 汇编器语法和语义。

© www.soinside.com 2019 - 2024. All rights reserved.