Assembly AVR程序集未执行我希望它执行的操作

Assembly AVR程序集未执行我希望它执行的操作,assembly,arduino,avr,led,Assembly,Arduino,Avr,Led,我有一个Arduino Uno Rev3,我从C中的主代码调用以下汇编函数 # # Global data (val1) # .extern delay .data .comm val1,1 .global val1 # # Program code (compute function) # .text .global compute compute: lds r22, val1 ;value of input ldi r23, 0x00 ;0 value

我有一个Arduino Uno Rev3,我从C中的主代码调用以下汇编函数

#
# Global data (val1)
#
.extern delay
.data

.comm val1,1
.global val1

#
# Program code (compute function)
#
.text
.global compute
compute:  
    lds r22, val1  ;value of input 
    ldi r23, 0x00  ;0 value
    ldi r24, 0x0D  ;value to flash led

flash:
    # flash LED
    call SDelay    ;Short Delay
    out  0x04, r24  ;LED On
    out  0x05, r24
    call SDelay    ;Delay
    out  0x04, r23  ;LED Off
    out  0x05, r23
    dec  r22
    brne flash;
finish:
    rjmp finish    ;keep looping once finished

SDelay:
    # Push registers onto stack
    push r22 
    push r23 
    push r24 
    push r25 
    #Delay
    ldi r22, 0xa0
    ldi r23, 0x00
    ldi r24, 0x00 
    ldi r25, 0x00
    call delay
    #Pop registers on stack
    pop r25
    pop r24
    pop r23
    pop r22 
    ret
这应该是闪烁LED(我不确定我在这里闪烁的是哪一个)的输入次数。该次数应存储在val1中(以C计算)。然而,我不知道我做错了什么

有人能快速解释一下如何使arduino板上的特定LED闪烁吗?我知道我必须将管脚设置为高或低,但我不知道哪个管脚可以对特定的LED进行设置

我知道这些都是noob问题,但我对AVR汇编还不熟悉,而且真的很烂。我不会这样做,但我们学校的计算机科学系认为我们有必要了解这一点

谢谢

1)导致闪烁 根据Arduino Uno R3板,有2个LED可通过代码控制,连接至PD4和PD5(用作串行RX和TX的双重用途);将这些管脚配置为输出并向其写入0将点亮它们

制定

  • 一个ASM例行程序,首先单独闪烁其中一个LED(闪烁=打开0.5秒,关闭0.5秒)
  • 一个ASM例程,在“x”次重复执行相同的操作。。。存储在R24中的“x”(参见下文为什么R24)
  • 并尽可能使用符号表示法
或者,你可能想

  • 连接一个额外的LED
  • 使用诸如pinMode()、digitalWrite()和delay()之类的Arduino例程,保持在C语言中
2) C语言与汇编程序 您正在从C调用ASM例程。。。这需要一些额外的想法,特别是当您将参数从C移交给ASM时。。。本质上,参数是从R25向下传递的-每个参数有2个字节,因此一个字符作为R25(MSB)和R24(LSB)进行传递。。。通读