ARM汇编语言学习笔记(四)汇编语言中,如何调用C文件

目录

  • 一、目的
  • 二、堆栈设置
    • 1、为什么要设置栈
    • 2、怎么设置栈
      • 寄存器规则
    • 3、堆栈设置过程:
      • ①我们在c文件和s文件中的操作:
      • ②反汇编文件中机器的操作:
  • 三、.s文件中调用c函数:
    • b和bl的区别:

一、目的

有时候会想一下,为什么我们要应用这些高级语言了?因为,方便啊。
汇编语言对于机器来说固然是效率很高的,但是我们编写起来其实并没有那么方便,因为他的思路还是更近机器,所以在汇编语言的编写当中,C语言也可以被使用进来,帮助大家更快更好的完成工作。

  • 栈在汇编语言中的设置。
  • C语言在汇编中的调用。

二、堆栈设置

1、为什么要设置栈

因为,c语言函数需要。(如果你要问为什么需要,因为c语言所有的变量都要有地方放啊)

2、怎么设置栈

解决下面的三个问题,我们就可以成功设置栈啦。

  • 调用者怎么向被调用者传参。
  • 被调用者怎么返回值。
  • 怎么恢复调用函数前的寄存器状态。

寄存器规则

  • 这一篇寄存器规则很清楚的讲解了,我们怎么进入函数以及怎么恢复出来时的状态:
    ARM汇编语言学习笔记(四)汇编语言中,如何调用C文件_第1张图片

3、堆栈设置过程:

①我们在c文件和s文件中的操作:

.s文件中,将sp寄存器的值变为栈顶:
这里flash不同,则启动的地址不同。

	/* 设置内存: sp 栈 */
	ldr sp, =4096  /* nand启动 */
//	ldr sp, =0x40000000+4096  /* nor启动 */

没错,操作就是这么简单,给栈寄存器一个地址就可以了。

②反汇编文件中机器的操作:

led.elf:     file format elf32-littlearm

Disassembly of section .text:

00000000 <_start>:
   0:	e3a0da01 	mov	sp, #4096	; 0x1000		//给栈一个地址
   4:	eb000000 	bl	c 
//跳转到main函数 00000008 : 8: eafffffe b 8 //暂停 然后 跳转到暂停 //注意,程序到上面就跑完了,下面是函数的里面的操作 0000000c
: c: e1a0c00d mov ip, sp //存储栈顶地址到ip寄存器 10: e92dd800 stmdb sp!, {fp, ip, lr, pc} //这是一个指令,叫做(decrease before) //也就是,先减后存,过程为:sp= 4096 -4,[4096-4]= fp,4096-4-4,4[4096-4-4]=ip.... 14: e24cb004 sub fp, ip, #4 ; 0x4 // fp = ip -4 .fp = 4096-4-4 18: e24dd008 sub sp, sp, #8 ; 0x8 //sp =sp -8 = 4088 1c: e3a03456 mov r3, #1442840576 ; 0x56000000 // r3= 0x56000000 20: e2833050 add r3, r3, #80 ; 0x50 //r4 =r3 +80 = 0x56000050 24: e50b3010 str r3, [fp, #-16] //存储r3寄存器0x56000050到 4088 上面 28: e3a03456 mov r3, #1442840576 ; 0x56000000 //r3 = 0x56000000 2c: e2833054 add r3, r3, #84 ; 0x54 //r3 = r3 +84= 0x56000054 30: e50b3014 str r3, [fp, #-20] // r3 存储到:fp-20 上面 34: e51b2010 ldr r2, [fp, #-16] //r2= fp-16的地址读值 38: e3a03c01 mov r3, #256 ; 0x100 // r3 = 0x100 3c: e5823000 str r3, [r2] // 存储0x100到r2也就是fp -16的地址,0x56000050 40: e51b2014 ldr r2, [fp, #-20] // r2 = fp - 20 的值 44: e3a03000 mov r3, #0 ; 0x0 // r3 =0 ; 48: e5823000 str r3, [r2] //存储 r3 0 到r2也就是fp- 20也就是0x56000054上面 4c: e3a03000 mov r3, #0 ; 0x0 //移动r3 = 0; 50: e1a00003 mov r0, r3 //r0 =r3 =0 54: e24bd00c sub sp, fp, #12 ; 0xc // sp =fp -12 58: e89da800 ldmia sp, {fp, sp, pc} //(increase after):恢复fp,sp,pc的值 Disassembly of section .comment: 00000000 <.comment>: 0: 43434700 cmpmi r3, #0 ; 0x0 4: 4728203a undefined 8: 2029554e eorcs r5, r9, lr, asr #10 c: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1} 10: Address 0x10 is out of bounds.

三、.s文件中调用c函数:

很简单,bl跳转到 main函数中

	/* 调用main */
	bl main

b和bl的区别:

b:直接跳转
bl:带返回值的跳转

你可能感兴趣的:(ARM汇编)