当前位置:首页 » 编程语言 » arm汇编c语言

arm汇编c语言

发布时间: 2022-11-12 09:08:23

‘壹’ arm汇编跟汇编、c语言的区别

不一样,汇编主要是要了解CPU指令及用法。
我们常说的是PC机的x86汇编,指令是x86的复杂指令集。
arm汇编是arm的精简指令集,比x86容易学,程序格式倒是和x86汇编差不多。你下载一份arm的手册就可以了解了。
C语言ARM的和x86的差不多,除了对硬件寄存器操作不同,其它语法和流程都一样。

回答补充:

arm汇编程序每一行是指定arm core执行一条指令,每条指令都是硬件相关。

LDR R3, #1 ;用LDR指令将数值1放入R3寄存器准备参与运算

C语言与arm指令无关,只与逻辑运算有关,指定硬件地址的操作才与硬件相关;如果用arm编译器来编译,每行可能编译出1到多条arm指令。

i++; //变量 i 递增1
等效于
LDR R3,#1 ;用LDR指令将数值1放入R3寄存器准备参与运算
ADD R2, R2, R3 ;用ADD指令将R2、R3寄存器里的数值相加后放回R2寄存器
以上等效汇编的R2、R3寄存器只是为了举例,C语言不像汇编,不需要由程序员指定用哪个寄存器参与运算,编译器编译时会根据程序结构自动判断选择。

强调mcuos有错,“c语言被编译器编译的时候会最终解释为汇编语言的”,无论是c语言还是汇编语言,编译器编译后的结果是机器执行码,很多人因为汇编语言比较难懂及指令相关,所以以为它就是机器语言,其实它仍是人类设计的编写程序的语言,仍需要编译器编译成机器码才能执行,它只是比C语言更接近硬件而已。

‘贰’ 用ARM汇编语言实现C语言中的memcmp函数的功能

头文件:#include <string.h>

定义函数:int memcmp (const void *s1, const void *s2, size_t n);

函数说明:memcmp()用来比较s1 和s2 所指的内存区间前n 个字符。

字符串大小的比较是以ASCII 码表上的顺序来决定,次顺序亦为字符的值。memcmp()首先将s1 第一个字符值减去s2 第一个字符的值,若差为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如,字符串"Ac"和"ba"比较则会返回字符'A'(65)和'b'(98)的差值(-33)。

返回值:若参数s1 和s2 所指的内存内容都完全相同则返回0 值。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。

范例#include <string.h>main(){ char *a = "aBcDeF"; char *b = "AbCdEf"; char *c = "aacdef"; char *d = "aBcDeF"; printf("memcmp(a, b):%d\n", memcmp((void*)a, (void*)b, 6)); printf("memcmp(a, c):%d\n", memcmp((void*)a, (void*)c, 6)); printf("memcmp(a, d):%d\n", memcmp((void*)a, (void*)d, 6));}

执行结果:
memcmp(a, b):1 //字符串a>字符串b, 返回1
memcmp(a, c):-1 // 字符串a<字符串c, 返回-1
memcmp(a, d):0 //字符串a=字符串d, 返回0

‘叁’ ARM汇编语言与C语言调用的一段代码问题

STR storage register 就是存储寄存器的意思,是将寄存器中的值存进内存中。LDR则是将内存单元中的值存入寄存器中。
STR lr, [sp, #-4]! 是将lr寄存器也称链接寄存器r14(用于保存子程序的返回地址)的值(32位)存入sp指向堆栈的地址,从sp到sp-3地址单元。感叹号是表示保存后sp的值跟着改变,及sp=sp-3,没有感叹号sp在使用结束后值不变。LDR那部分就不用解释了吧,应该很详细了。

‘肆’ arm编程与C语言的编程区别和方法

汇编主要是要了解CPU指令及用法,常说的是PC机的x86汇编,指令是x86的复杂指令集。
arm汇编是arm的精简指令集,比x86容易学,程序格式倒是和x86汇编差不多。
C语言ARM的和x86的差不多,除了对硬件寄存器操作不同,其它语法和流程都一样。
arm汇编程序每一行是指定arm core执行一条指令,每条指令都是硬件相关。
如:LDR R3, #1 ;用LDR指令将数值1放入R3寄存器准备参与运算
C语言与arm指令无关,只与逻辑运算有关,指定硬件地址的操作才与硬件相关;
如果用arm编译器来编译,每行可能编译出1到多条arm指令。
如:i++; //变量 i 递增1等效于LDR R3,#1 ;
用LDR指令将数值1放入R3寄存器准备参与运算ADD R2, R2, R3 ;
用ADD指令将R2、R3寄存器里的数值相加后放回R2寄存器以上等效汇编的R2、R3寄存器只是为了举例,C语言不像汇编,不需要由程序员指定用哪个寄存器参与运算,编译器编译时会根据程序结构自动判断选择。
无论是c语言还是汇编语言,编译器编译后的结果是机器执行码,很多人因为汇编语言比较难懂及指令相关,所以以为它就是机器语言,其实它仍是人类设计的编写程序的语言,仍需要编译器编译成机器码才能执行,它只是比C语言更接近硬件而已。

‘伍’ arm汇编语言实现c语言程序

不懂C语言但稍微懂一点ARM Cortex-M3 汇编
很久没写汇编了,下边这个没调试直接编的不是范例,所以肯定写错了
编译器GCC-ARM-NONE-EABI

应该有范例,你还是找范例吧

i: .int 20 @ int i=20

a: .int 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 @ 定义A数组

b: .int 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 @ 定义B数组

ldr r0, = i @ 把20存到R0

xunhuan1: @ if 里面

ldr r1, = a @ 把A数组的首地址存到R1

ldr r2, [r1, r0] @ 取出首地址加20处的数据存到R2

ldr r3, = b @ 把B数组的首地址存到R3

ldr r4, [r3, r0] @取出首地址加20处的数据存到R4

mov r5, # 4 @ 把被乘数存到R5

mul r4, r4, r5 @ R4乘以4 b[i]*4
add r6, r2, r4 @ R2加上R4存到R6 a[i]+b[i]*4

str r6, [r1, r0] @ R6的数据存到A首地址加20的地方

lsrs r0, # 1 @ R0逻辑右移

bne xunhuan @ 判断R0是不是等于0不等于跳到xunhuan

xunhuan: @ while 循环

sub r0, # 1 @ i减1

cmp r0, # 0 @比较R0和0

bge xunhuan1 @大于等于跳转xunhuan1

‘陆’ arm汇编跟汇编、C语言的区别

不一样,汇编主要是要了解CPU指令及用法。
我们常说的是PC机的x86汇编,指令是x86的复杂指令集。
arm汇编是arm的精简指令集,比x86容易学,程序格式倒是和x86汇编差不多。你下载一份arm的手册就可以了解了。
C语言ARM的和x86的差不多,除了对硬件寄存器操作不同,其它语法和流程都一样。
回答补充:
arm汇编程序每一行是指定arm
core执行一条指令,每条指令都是硬件相关。

LDR
R3,
#1
;用LDR指令将数值1放入R3寄存器准备参与运算
C语言与arm指令无关,只与逻辑运算有关,指定硬件地址的操作才与硬件相关;如果用arm编译器来编译,每行可能编译出1到多条arm指令。

i++;
//变量
i
递增1
等效于
LDR
R3,#1
;用LDR指令将数值1放入R3寄存器准备参与运算
ADD
R2,
R2,
R3
;用ADD指令将R2、R3寄存器里的数值相加后放回R2寄存器
以上等效汇编的R2、R3寄存器只是为了举例,C语言不像汇编,不需要由程序员指定用哪个寄存器参与运算,编译器编译时会根据程序结构自动判断选择。
强调mcuos有错,“c语言被编译器编译的时候会最终解释为汇编语言的”,无论是c语言还是汇编语言,编译器编译后的结果是机器执行码,很多人因为汇编语言比较难懂及指令相关,所以以为它就是机器语言,其实它仍是人类设计的编写程序的语言,仍需要编译器编译成机器码才能执行,它只是比C语言更接近硬件而已。

‘柒’ ARM汇编调用c语言的问题

强烈建议初学者使用Keil工具。
1,无论是Keil工具还是ADS工具,都有一段入口汇编代码,一般叫start.s。这取决于你这个程序的Project设置,自己去找找。
2,你一定要找到这个入口汇编代码的文件,然后把你的汇编函数添加到末尾。
3,入口汇编代码中要找到跳转到C程序入口的那条跳转语句。C程序的入口调用一般在ADS里是: B __main 这样的一句汇编。把这句改成B callsum5。

‘捌’ arm中如何实现C语言与汇编语言的混合编程

如果你是想在一个文件里混写c语言和arm汇编,这个跟编译器有关系,如果你用gcc,可以用__asm__语法,请自行搜索__asm__相关资料

另一种方法,就是arm汇编文件和c语言文件分开来写,在c语言中声明函数符号即可。然后分别编译后再用链接器链到一起

‘玖’ arm汇编里面怎么调用C语言函数

首先你得搞清楚s32 function(u32 VirtualAddr)编译后叫什么。一般来说可能会叫_function。

传递参数很简单,如果ax里放的就是参数,那么push ax,然后再调用就可以。
返回值如果我没有记错的话应该在AX里。如果返回值太长,就会放到堆栈里。

你想搞清楚如果跨语言编程,最好彻底明白C语言的机制。也就是写一段函数调用程序比如下面的

main()
{ int i;}

fu(int i)
{in j}

然后编译成汇编语言,好好研究一下。或者再复杂一点。请参考http://..com/question/348586073.html。
有什么问题再向我提问

‘拾’ arm编程与C语言的编程区别和方法

ARM公司卖的arm
cpu内核给许多公司,那些公司生产出众多的ARM处理器。ARM编程实际上指的是应用ARM公司自己出产的IDE(集成开发环境)所开发进行的编程,比如现在业界常用的ADS1.2,MDK3.5等等IDE。主要进行ARM汇编和与c混合编程。

ARM公司自己规定了一套ARM指令集,也规定了一套汇编指令集。当然,我们觉得汇编编程生产效率低下,不易编写大规模程序,那么我们就可以用高级语言,比如c语言,面向对象的语言在操作系统上运行。

热点内容
c在C语言中代表什么 发布:2025-01-12 05:52:59 浏览:46
政府PHP 发布:2025-01-12 05:34:30 浏览:648
转码算法 发布:2025-01-12 05:24:02 浏览:418
哪个国家开发安卓系统 发布:2025-01-12 05:08:58 浏览:407
华师数据库 发布:2025-01-12 05:07:03 浏览:505
爱情空间源码 发布:2025-01-12 04:51:53 浏览:892
mongodbphp安装 发布:2025-01-12 04:41:08 浏览:580
sql存储文件路径 发布:2025-01-12 04:37:31 浏览:243
我的世界服务器小灰机 发布:2025-01-12 04:21:36 浏览:932
九通车联网账号密码多少 发布:2025-01-12 04:21:32 浏览:294