Assembly 使用arduino(avr组件)编程

Assembly 使用arduino(avr组件)编程,assembly,arduino,avr,Assembly,Arduino,Avr,我在arduino董事会工作。我用C编写代码,但我想使用内联汇编。我有以下代码: volatile int input1[20]={1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,4}; volatile int input2[20]={1,2,8,9,6,2,0,3,4,5,6,7,0,0,0,2,2,3,3,0}; volatile int temp[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; volati

我在arduino董事会工作。我用C编写代码,但我想使用内联汇编。我有以下代码:

volatile int input1[20]={1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,4};
volatile   int input2[20]={1,2,8,9,6,2,0,3,4,5,6,7,0,0,0,2,2,3,3,0};
volatile   int temp[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
volatile int output[40]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//  // put your main code here, to run repeatedly:
 void setup() {

 // put your setup code here, to run once:
 Serial.begin(9600);


}

void loop() {
 asm(

"statrt:;"
"ldi   YL, low(input1[0]) ;   " //load address of Data
"ldi   YH, high(input1[0]) ;  "
"ldi   ZL, low(input2[0])   ; " //load address of Data
"ldi   ZH, high(input2[0])   ;"
"CompareLoop:;"
"lpm r0 , Z+;"
"lpm r1 , Y+;"
"cp r1,r0;"
"brlt Change;"
"cpi Z,20;"
"breq SubLoop;"
"brne CompareLoop;"

"Change:"
"lds   XL, low(temp[0])    ;" //load address of Data
"lds   XH, high(temp[0])   ;"
"MoveToTempLoop:"
"lpm r3,Z+;"
"st temp+,r3;"
"cpi Z,20;"
 "brne MoveToTempLoop;"

 "MoveToInput1Loop:"
 "lpm r3,Y+;"
 "st Z+,r3;"
 "cpi Z,20;"
 "brne MoveToInput1Loop;"

 "MoveToInput2Loop:"
 "lpm r3,temp+;"
 "st Y+,r3;"
 "cpi Y,20;"
 "brne MoveToInput2Loop;"
 "statrt:;"
 "add r3,r3;"
 "lds   XL, low(output[39])    ;" //load address of Data
 "lds   XH, high(output[39])   ;"

 "lds   YL, low(input1[19])    ;" //load address of Data
 "lds   YH, high(input1[19])   ;"

 "lds   ZL, low(input2[19])    ;" //load address of Data
 "lds   ZH, high(input2[19])   ;"
 "SubLoop:"
 "clr r2;"
 "lpm r0 , Z-;"
 "lpm r1 , Y-;"
 "cp r1,r0;"  //check kon moghe r1-r0 r1 koochiktar nabashe
 "brge Label;"
 "lpm r2,Z;"
 "subi r2,1;"
 "add r1,10;"
 "st Z,r2;"

 "Label:"
 "sub r1,r0;"
 "st X-,r1;"
 "cpi    ZL, -1 ;"      //if i >-1 then
 "brne    SubLoop ;"      // do it again

 );
 int i=0;
 for ( i=0; i<40;i++){
  Serial.println(output[i]);
}
}
volatile int input1[20]={1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,4};
volatile int input2[20]={1,2,8,9,6,2,0,3,4,5,6,7,0,0,0,0,2,2,3,3,0};
volatile int temp[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
易失性整数输出[40]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
////将主代码放在此处,以便重复运行:
无效设置(){
//将安装代码放在此处,以便运行一次:
Serial.begin(9600);
}
void循环(){
asm(
“国家:;”
“ldi YL,低(input1[0]);”//数据的加载地址
本地设计院YH,高(输入1[0])
“ldi ZL,低位(input2[0]);”//数据的加载地址
“ldi ZH,高(输入2[0])
“比较级:;”
lpm r0,Z+
“lpm r1,Y+;”
cp r1,r0
“brlt更改;”
“消费物价指数Z,20;”
“breq子循环;”
“布莱恩·比勒洛普;”
“更改:”
“lds XL,低温(温度[0]);”//数据的加载地址
lds XH,高温(温度[0])
“MoveToTempLoop:”
“lpm r3,Z+;”
“st温度+,r3;”
“消费物价指数Z,20;”
“brne MoveToTempLoop;”
“移动到输入1环路:”
“lpm r3,Y+;”
“st Z+,r3;”
“消费物价指数Z,20;”
“brne移动到输入1环路;”
“移动到输入2loop:”
“lpm r3,温度+;”
“st Y+,r3;”
“消费物价指数Y,20;”
“brne移动到输入2LOOP;”
“国家:;”
加上r3,r3
“lds XL,低(输出[39]);”//数据的加载地址
lds-XH,高(输出[39])
lds YL,低(input1[19]);“//数据的加载地址
lds YH,高(输入1[19])
“lds ZL,低(input2[19]);”//数据的加载地址
lds ZH,高(输入2[19])
“子循环:”
“clr r2;”
“lpm r0,Z-;”
“lpm r1,Y-;”
“cp r1,r0;”//检查kon moghe r1-r0 r1 koochiktar nabashe
“brge标签;”
lpm r2,Z
“subi r2,1;”
“添加r1,10;”
圣Z,r2
“标签:”
子r1,r0
“st X-,r1;”
“cpi ZL,-1;”//如果i>-1,则
“brne SubLoop;”//再做一次
);
int i=0;

对于(i=0;i,此代码有许多问题:

首先,您需要将
\n\t
(或者只是
\n
)放在程序集的每一行末尾,否则它会被挤成一行。在您的情况下,这意味着除了第一条指令以外的所有指令都会以注释的形式结束

第二,当您使用C风格的注释时,您实际上不需要在汇编代码中使用分号。汇编分号仅用于注释,不需要它们来结束指令

第三,您试图从汇编代码中访问C变量-您不能这样做,您必须使用输入和输出部分(您目前没有)将它们分配到寄存器

最后,您使用的是
asm
而不是
asm volatile
,这在某些情况下可能会导致问题


总之,我认为您应该重新阅读GCC对的解释,并确保您理解汇编代码的结构


另请参阅,以确保您知道说明正在执行的操作(例如
lpm
).

你确定你的易失性数据在程序内存中吗?另外,使用调试器逐步检查代码,看看哪里出错了。实际上,我不知道lpm是做什么的!我也不知道程序内存中有什么。实际上,我是arduino和avr编码的初学者……你的问题是?如何编写程序集,以产生uce input1-input2?首先,你需要学习汇编编程。经过几周的学习和实践,回到这一点上并做它。我与MIPS合作过,所以我知道MIPS编程,但我与avr合作过一点。事实上,我认为lds和lpm存在问题,但我真的不知道它们做什么。参考指令集reference(这也是您为MIPS所做的,对吗?)请注意,avr是哈佛体系结构,因此具有独立的数据和代码内存。
lds
从前者加载,
lpm
从后者加载。