ARM汇编与C语言对照

转载 2013年12月02日 13:00:23

汇编语言的结构:

①    开头声明

②    数据初始化

④函数(入栈、操作、出栈)

③    被初始化的数据的地址(文字池)

注意:②和③联系比较大,但为了让③处在不会被执行的地方,所以将③放在④之后。

下面的例子是一个算术运算的汇编与C的对照,首先是C语言

/*文件名:test.c*/
/*说明:算术运算*/
int v1 = 1;
static int v2 = 2;
 
int main(void)
{
      int vr;
      int v3 = 3, v4 = 4;
      vr = (v1 + v2 ) – ( v3 + v4 )
      return vr;
}

以下为汇编语言的内容(请结合表2-1-2理解本程序):

            .file    “test.c”
            .global v1 @声明v1为全局标签
            .data @ 数据段开始
            .align 2 @地址与4的倍数对齐
            .type  v1,  %object  @v1标签代表数据对象
            .size   v1,  4 @对象v1的长度为4
v1:
            .word   1  @存放v1的初始值1
            .align   2  @地址与4的倍数对齐
            .type   v2,  %object @v2标签代表数据对象
            .size    v2, 4 @对象v2的长度为4
v2:
            .word   2  @存放v2的初始值2
            .text @ 代码段开始
            .align    2
            .global   main @ 声明main为全局标签
            .type   main,  %function @ main标签代表函数
main:
            @ args = 0, pretend = 0, frame = 12
            @ frame_needed = 1, uses_anonymous_args = 0
            @入栈及开辟存放局部变量的空间
            mov    ip, sp @暂时用ip保存栈指针
            stmfd   sp!, {fp, ip, lr, pc} @ 入栈
            sub     fp, ip, #4 @ fp指向入栈的第一个元素(函数帧的开始)
            sub     sp, ip, #12 @ 在栈上开辟3个整形数的空间,用于存放局部变量
            @给v3,v4赋初值
            mov    r3, #3
            str     r3, [fp, #-20] @ 将v3赋值为3
            mov    r3, #4
            str     r3, [fp, #-24] @ 将v4赋值为4
            @计算表达式v1+v2,将结果放到r1中
            ldr     r3, .L2 @ 将变量v1的地址加载到r3
            ldr     r2, .L2+4 @ 将变量v2的地址加载到r2
            ldr     r1, [r3, #0] @ 将变量v1的值加载到r1
            ldr     r3, [r2, #0] @ 将变量v2的值加载到r3
            add    r1, r1, r3 @ v1+v2的结果放到r1中
            @计算表达式(v3+v4) ,将结果放到r3中
            ldr     r2, [fp, #-20] @ 将变量v3的值加载到r2上
            ldr     r3, [fp, #-24] @ 将变量v4的值加载到r3上
            add     r3, r2, r3 @ (v1+v2)+(v3+v4)的结果放到r3中
            @将(v1+v2)-(v3+v4)的值放到r3中,保存,返回
            rsb      r3, r3, r1 @ 将(v1+v2) - (v3+v4)的值放到r3之中
            str      r3, [fp, #-16] @将结果保存到vr中
            ldr      r3, [fp, #-16] @将vr的值加载到r3中
            mov      r0, r3 @ 将(v1+v2) - (v3+v4)的值放到r0中返回
            @出栈
            sub     sp, fp, #12 @ 重设栈指针准备返回
            ldmfd   sp, {fp, sp, pc} @ 返回
           
.L3:
            .align  2
.L2
            .word   v1 @变量v1的地址,即标号v1【使.L2获得v1的指针】
            .word   v2 @变量v2的地址,即标号v2
            .size    main,  .-main @ main函数的大小,当前位置减去main标号处
            .ident   “GCC: (GNU) 3.4.4”

这里有点4需要注意的:

①    全局变量都被放在数据段上,数据段中保存的其实是变量的初始值

②    未用static声明的变量会被声明为.global,表示他可以链接到其它文件。

③    加载全局变量实际上使用的是文字池的方法,即将变量地址放在代码段中某个不会执行到的位置,使用时先加载变量的地址,然后通过变量的地址得到变量的值。

④    每条汇编指令只能执行一个简单的运算,计算的中间结果使用寄存器保存。如果表达式非常复杂以至于无法用寄存器保存所有的中间结果,则还会在栈上开辟局部变量来保存。【非静态的局部变量都放在栈上,通过帧指针和偏移量的方式来访问。帧指针(fp)在开始时设好,整个函数执行期间不会该变而期间sp会改变)。】

ARM汇编 C语言 C++ 相互调用

C语言和ARM汇编语言的相互调用 1.汇编程序访问C语言全局变量 全局变量只能通过地址间接调用,为了访问C语言中全局变量,首先要通过extern伪指令引入全局变量,然后将其地址装入...
  • zhanglianpin
  • zhanglianpin
  • 2014年04月18日 21:17
  • 3484

ARM 汇编指令

ARM 汇编指令 转自: http://blog.chinaunix.net/uid-23193900-id-3251565.html ARM汇编程序特点: l         所有运算处理都是发...
  • kasalyn
  • kasalyn
  • 2013年06月29日 21:08
  • 17885

系统学习ARM之五 --C语言和汇编混合编写

一、GNU汇编书写格式: 代码行中的注释符号: ‘@’ 整行注释符号: ‘#’ 语句分离符号: ‘;’ 直接操作数前缀: ‘#’ 或 ‘$’全局标号:标号只能由a~z,A~Z,0~9,“...
  • qqliyunpeng
  • qqliyunpeng
  • 2015年09月28日 22:14
  • 1583

机器语言、汇编语言、C语言(高级语言)的对比

三种语言的对比 分别用机器语言、汇编语言、C语言(高级语言)来写一个计算1+1的程序 1) 机器语言:简直是天书!!! 10111000  00000001 00000000  0000010...
  • yyshln
  • yyshln
  • 2017年07月22日 09:30
  • 243

ARM中C和汇编混合编程及示例

参数的传递规则.      根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.      1.参数个数可变的子程序参数传...
  • Ropai
  • Ropai
  • 2013年05月20日 15:07
  • 2387

arm汇编编程(示例)

一、arm的认知及基本概念 (一).arm的基本概念 1. 什么是arm    arm是一家英国电子公司的名字,全名是Advanced RISC Machine    这家企业设计了大量高性能...
  • EastonWoo
  • EastonWoo
  • 2012年11月17日 11:37
  • 10222

ARM中C和汇编混合编程及示例

  在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的。在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构...
  • rockyqiu2002
  • rockyqiu2002
  • 2004年09月10日 11:10
  • 9003

汇编语言对应的C语言

mov     ebx, [ebp+hash] test    ebx, ebx mov     eax, ebx jz      short loc_80484D3 nop         ...
  • turbocc
  • turbocc
  • 2014年09月16日 22:29
  • 1200

汇编与C的基本逻辑语句对应关系

基本函数结构:push        ebpmov         ebp,espsub          esp,44hpush        ebxpush        esipush     ...
  • Yes_life
  • Yes_life
  • 2011年06月03日 09:36
  • 650

GCC ARM C语言嵌入汇编语法

(转:http://www.ethernut.de/en/documents/arm-inline-asm.html) ARM GCC Inline Assembler Cookbook ...
  • lijiatong1005
  • lijiatong1005
  • 2013年07月16日 22:59
  • 933
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARM汇编与C语言对照
举报原因:
原因补充:

(最多只允许输入30个字)