c语言转化为arm汇编指令
If(a==0||b==1)c=d+e(2)if((a==b)&&(c==d))&&(e==f)g++;...
If(a==0||b==1) c=d+e
(2) if ((a= = b)&&(c= = d))&&(e= =f) g++; 展开
(2) if ((a= = b)&&(c= = d))&&(e= =f) g++; 展开
3个回答
展开全部
额。。。。
你可以用编译器编译一下,然后调试看下汇编代码的。。。
你可以用编译器编译一下,然后调试看下汇编代码的。。。
追问
不是arm的
追答
用ADS1.2,armgcc,不就得了
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.汇编程序访问C语言全局变量
全局变量只能通过地址间接调用,为了访问C语言中全局变量,首先要通过extern伪指令引入全局变量,然后将其地址装入寄存器中。
对于unsigned char类型,使用LDRB/STRB访问;
对于unsigned short类型,使用LDRH/STRH访问;
对于unsigned int类型,使用LDR/STR访问;
对于char类型,使用LDRSB/STRSB访问;
对于short类型,使用LDRSH/STRSH访问;
例子:
.text
.global asmsubroutine
.extern globvar
asmsubroutine:
LDR R1,=globvar
LDR R0,[R1]
ADD R0,R0,#2
STR R0,[R1]
MOV PC,LR
.end
2.C程序调用汇编程序
C程序调用汇编程序首先通过extern声明要调用的汇编程序模块,声明中形参个数要与汇编程序模块中需要的变量个数一致,且参数传递要满足ATPCS规则,然后在C程序中调用。
例子:
#include<stdio.h>
extern void *strcopy(char*d,char*s);//模块声明
int main()
{
char*srcstr="first";
char*dststr="second";
strcopy(dststr,srcstr);//汇编模块调用;
}
.text
.global strcopy
Strcopy:
LDRB R2,[R1],#1
STRB R2,[R0],#1
CMP R2,#0
BNE Sstcopy
MOV PC,LR
.end
汇编程序调用C程序
在调用之前必须根据C语言模块中需要的参数个数,以及ATPCS参数规则,完成参数传递,即前四个参数通过R0-R3传递,后面的参数通过堆栈传递,然后再利用B、BL指令调用。
例子:
int g(int a,int b,int c,int d,int e)//C语言函数原型
{
return(a+b+c+d+e);
}
汇编语言完成是求i+2i+3i+4i+5i的结果;
.global _start
.text
_start:
.extern g ;引入c程序
STR LR,{SP,-#4}!;保存PC
ADD R1,R0,R0
ADD R2,R1,R0
ADD R3,R1,R2
STR R3,{SP,#-4}!
ADD R3,R1,R1
BL g ;调用C函数g
ADD SP,SP,#4
LDR PC,[SP],#4
.end
return(0);
全局变量只能通过地址间接调用,为了访问C语言中全局变量,首先要通过extern伪指令引入全局变量,然后将其地址装入寄存器中。
对于unsigned char类型,使用LDRB/STRB访问;
对于unsigned short类型,使用LDRH/STRH访问;
对于unsigned int类型,使用LDR/STR访问;
对于char类型,使用LDRSB/STRSB访问;
对于short类型,使用LDRSH/STRSH访问;
例子:
.text
.global asmsubroutine
.extern globvar
asmsubroutine:
LDR R1,=globvar
LDR R0,[R1]
ADD R0,R0,#2
STR R0,[R1]
MOV PC,LR
.end
2.C程序调用汇编程序
C程序调用汇编程序首先通过extern声明要调用的汇编程序模块,声明中形参个数要与汇编程序模块中需要的变量个数一致,且参数传递要满足ATPCS规则,然后在C程序中调用。
例子:
#include<stdio.h>
extern void *strcopy(char*d,char*s);//模块声明
int main()
{
char*srcstr="first";
char*dststr="second";
strcopy(dststr,srcstr);//汇编模块调用;
}
.text
.global strcopy
Strcopy:
LDRB R2,[R1],#1
STRB R2,[R0],#1
CMP R2,#0
BNE Sstcopy
MOV PC,LR
.end
汇编程序调用C程序
在调用之前必须根据C语言模块中需要的参数个数,以及ATPCS参数规则,完成参数传递,即前四个参数通过R0-R3传递,后面的参数通过堆栈传递,然后再利用B、BL指令调用。
例子:
int g(int a,int b,int c,int d,int e)//C语言函数原型
{
return(a+b+c+d+e);
}
汇编语言完成是求i+2i+3i+4i+5i的结果;
.global _start
.text
_start:
.extern g ;引入c程序
STR LR,{SP,-#4}!;保存PC
ADD R1,R0,R0
ADD R2,R1,R0
ADD R3,R1,R2
STR R3,{SP,#-4}!
ADD R3,R1,R1
BL g ;调用C函数g
ADD SP,SP,#4
LDR PC,[SP],#4
.end
return(0);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询