c语言汇编混编,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来声明外部函数

0818b9ca8b590ca3270a3433284dd417.png

汇编程序

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

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

汇编中调用c语言

0818b9ca8b590ca3270a3433284dd417.png

其中一个存在4个参数

汇编中调用方法

0818b9ca8b590ca3270a3433284dd417.png

首先有一个import

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

0818b9ca8b590ca3270a3433284dd417.png

STR R3, [SP, #-4]!

满递增:

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

LDMFA/STRFA

空递增

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

LDMED/STRED

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

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

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

数据块传送

堆栈操作

说明

存储

压栈

STMDA

STMED

空递减

STMIA

STMEA

空递增

STMDB

STMFD

满递减

STMIB

STMFA

满递增

数据块传送

堆栈操作

说明

加载

出栈

LDMDA

LDMFA

满递增

LDMIA

LDMFD

满递减

LDMDB

LDMEA

空递增

LDMIB

LDMED

空递减

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

参考该文获得

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值