c语言与汇编混编写法

 

R13 (stack pointer)

R14 (Link Register)

R15 (program counter)

c语言中内嵌汇编的规则:

 

内嵌汇编器与armasm的区别:

访问全局变量:

 

unsigned char              LDRB/ STRB

unsigned short            LDRH/STRH

unsigned int                LDR/STR

char                               LDRB/STRB

short                             LDRH/STRH

B 字节操作

H 双字节操作

c语言调用汇编程序

在汇编中使用EXPORT 伪指令声明本子程序,使其他程序可以调用该子程序

在c语言中使用extern来声明外部函数

 

 

  汇编程序

特别注意其中R0,R1 为默认的第一个参数和第二个参数

 

 函数名称只是一个标号而已,而其中的参数通过R0,R1来传输。

 

汇编中调用c语言

其中一个存在4个参数

汇编中调用方法

 

首先有一个import

然后将参数通过r0,r1,r2,r3,以及堆栈来传递数据

 

STR R3, [SP, #-4]!

满递增:

通过增大寄存器的地址向上增长, 堆栈指针指向内含有效数据项的最高地址

LDMFA/STRFA

空递增

通过增大寄存器的地址向上增长,堆栈指针直线堆栈上的第一个空位置

LDMED/STRED

空递减和空递增与上面的意思相对。

以入栈后SP的值是增加还是减少为依据,可将堆栈类型划分为递增堆栈(向上生长)和递减堆栈(向下生长);

 

STMFD SP!, {R1-R7, LR};将R1-R7以及LR,入栈满递减堆栈(FA 代表满),至于为何叫做递减???...疑问... 

数据块传送堆栈操作说明
存储压栈
STMDASTMED空递减
STMIASTMEA空递增
STMDBSTMFD满递减
STMIBSTMFA满递增
数据块传送堆栈操作说明
加载出栈
LDMDALDMFA满递增
LDMIALDMFD满递减
LDMDBLDMEA空递增
LDMIBLDMED空递减

第二列中的ED、EA、FD、FA分别表示empty descend(空递减)、 empty ascend(空递增)、 full descend(满递减)、 full ascend(满递增),其含义是说,如果你采用的是空递减(空递增、满递减、满递增)堆栈的话,入栈操作则使用指令STMED(STMEA、STMFD、STMFA),出栈操作则使用指令LDMED(LDMEA、LDMFD、LDMFA)。从此你再也不会为你应该使用ia、ib、da还是db来实现出、入栈操作而苦恼了。

 

参考该文获得

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值