Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在汇编中编程Arduino?_Assembly_Arduino_Arduino Uno_Atmega_Arduino Ide - Fatal编程技术网

Assembly 在汇编中编程Arduino?

Assembly 在汇编中编程Arduino?,assembly,arduino,arduino-uno,atmega,arduino-ide,Assembly,Arduino,Arduino Uno,Atmega,Arduino Ide,我知道我可以用C语言编写Arduino,但在我目前的项目(一个很小的Arduino内核)中,我真的更愿意在某些部分使用汇编来学习汇编,并且可能会稍微提高效率 有什么我可以用的东西吗,比如u ASM_uu()?我只是在网上找到了一些人,他们试图说服那些问过类似问题的人学习C语言,但实际上并没有回答这个问题 谢谢 一本我多年前写过并发表过的书 .device ATmega168 .equ DDRB = 0x04 .equ PORTB = 0x05 .org 0x0000

我知道我可以用C语言编写Arduino,但在我目前的项目(一个很小的Arduino内核)中,我真的更愿意在某些部分使用汇编来学习汇编,并且可能会稍微提高效率

有什么我可以用的东西吗,比如u ASM_uu()?我只是在网上找到了一些人,他们试图说服那些问过类似问题的人学习C语言,但实际上并没有回答这个问题


谢谢

一本我多年前写过并发表过的书

.device ATmega168
.equ  DDRB       = 0x04
.equ  PORTB      = 0x05

.org 0x0000
    rjmp RESET

RESET:
    ldi R16,0x20
    out DDRB,R16

    ldi R18,0x00
    ldi R17,0x00
    ldi R20,0x20
Loop:

    ldi R19,0xE8
aloop:
    inc R17
    cpi R17,0x00
    brne aloop

    inc R18
    cpi R18,0x00
    brne aloop

    inc R19
    cpi R19,0x00
    brne aloop

    eor R16,R20
    out PORTB, R16
    rjmp Loop
我使用avra并可能编写了自己的arduino加载程序

blinker01.s.hex : blinker01.s
    avra -fI blinker01.s

clean :
    rm -f blinker01.s.*
你当然可以用avr_dude

与gnu有些不同:

.globl _start
_start:
    rjmp RESET

RESET:
    ldi R18,0x00
    ldi R17,0x00
    ldi R20,0x20
Loop:

    ldi R19,0xE8
aloop:
    inc R17
    cpi R17,0x00
    brne aloop

    inc R18
    cpi R18,0x00
    brne aloop

    inc R19
    cpi R19,0x00
    brne aloop

    rjmp Loop
您并不需要头文件来定义端口,您可以自己声明这些端口

MEMORY
{
    rom : ORIGIN = 0x00000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > rom
}

avr-as so.s -o so.o
avr-ld -T so.ld so.o -o so.elf
avr-objdump -D so.elf > so.list
avr-objcopy so.elf -O ihex so.hex
使用apt获得avr gcc(和binutils)可能与arduino沙箱使用的工具相同,应该可以直接访问,但我不使用沙箱,所以不知道

编辑

另一种方法是有限的,但使用工具链更可能成功,因为您从一个工作的C应用程序和环境开始,然后添加一个对象,也有助于汇编基础知识,请参阅编译器所做的工作,然后阅读:

unsigned short fun ( unsigned short x, unsigned short y )
{
    return(x+y+5);
}

avr-gcc -c -O2 so.c -o so.o
avr-objdump -D so.o

00000000 <fun>:
   0:   6b 5f           subi    r22, 0xFB   ; 251
   2:   7f 4f           sbci    r23, 0xFF   ; 255
   4:   86 0f           add r24, r22
   6:   97 1f           adc r25, r23
   8:   08 95           ret
unsigned short fun(unsigned short x,unsigned short y)
{
返回(x+y+5);
}
avr gcc-c-O2 so.c-o so.o
avr objdump-D so.o
00000000 :
0:6b 5f subi r22,0xFB;251
2:7f 4f sbci r23,0xFF;255
4:86 0f添加r24、r22
6:97 1f模数转换器r25、r23
8:08 95 ret
所以

创建so.s

.globl fun
fun:
    subi r22, 0xFB  ; 251
    sbci r23, 0xFF  ; 255
    add  r24, r22
    adc  r25, r23
    ret



avr-as so.s -o so.o
avr-objdump -D so.o

00000000 <fun>:
   0:   6b 5f           subi    r22, 0xFB   ; 251
   2:   7f 4f           sbci    r23, 0xFF   ; 255
   4:   86 0f           add r24, r22
   6:   97 1f           adc r25, r23
   8:   08 95           ret
.globl fun
乐趣:
subi r22,0xFB;251
sbci r23,0xFF;255
加上r24,r22
adc r25、r23
ret
avr as so.s-o so.o
avr objdump-D so.o
00000000 :
0:6b 5f subi r22,0xFB;251
2:7f 4f sbci r23,0xFF;255
4:86 0f添加r24、r22
6:97 1f模数转换器r25、r23
8:08 95 ret
然后,你必须学习调用约定,而不是在C生成的对象中进行链接,在汇编生成的对象中进行链接,通过实验你可以弄清楚

unsigned char fun ( unsigned char x, unsigned char y )
{
    return(x+(y<<1));
}
00000000 <fun>:
   0:   66 0f           add r22, r22
   2:   86 0f           add r24, r22
   4:   08 95           ret
unsigned char fun(unsigned char x,unsigned char y)
{

return(x+)(yinline汇编是高级的,你应该先学习汇编语言,如果你有充分的理由,以后再学习内联汇编。你完全可以编程AVR(在arduino上或不在arduino上)在汇编语言中。那么我该如何在汇编语言中编程AVR?类似于将在C函数中使用的_asm_u标记?不,这是内联汇编…大量的例子,你在哪里找到的?谷歌的术语是“arduino使用汇编”,和一些变体。对我这样的问题的大多数回答只是人们在谈论如何更好地使用C语言编程。你会想看到各种各样的例子,AVR并不是你想学习的第一个组件(不是最后一个,它的哈佛体系结构性质让它非常痛苦,msp430或是手臂拇指(cortex-m)这将是一个更好的开始。所有这些你都可以找到(或在一个下午写)一个指令集模拟器,可以像啤酒工具一样免费使用。你只需插入并使用一个,就可以用arduino成本的一小部分买到10美元左右的电路板。是的,肯定会阅读一些示例代码。幸运的是,我发现其中一个ATmega PDF在汇编和C中都有示例代码。我想这将是一个好主意很好的开始。谢谢你的帮助,我会记住你的建议!