企业网站源码带支付网站如何解除绑定域名
企业网站源码带支付,网站如何解除绑定域名,我国档案网站建设比较分析,儿童故事网站建设一、目标说明
嵌入式设备尝试用的芯片是ARM架构的#xff0c;所以说明一下ARM架构下的汇编调用C语言函数的使用方式。32位ARM调用的方式和64位的还有一些区别#xff0c;32位架构调用ATPCS调用约定#xff0c;64位则使用AAPCS64。
二、架构#xff0c;汇编风格#xff0c;…一、目标说明嵌入式设备尝试用的芯片是ARM架构的所以说明一下ARM架构下的汇编调用C语言函数的使用方式。32位ARM调用的方式和64位的还有一些区别32位架构调用ATPCS调用约定64位则使用AAPCS64。二、架构汇编风格调用约定ARM架构32位架构下使用的寄存器名称以及主要作用说明如下R0-R3 通常用于传递参数入参的第一到第四项参数通常使用R0-R3进行传递。R4~R11 主要用于保存局部变量。R11 这个地方需要注意有说它作为FP指针的FP指针对应X86架构下面的BP指针但是它不是强制的有的时候会被优化掉。gcc就有一个关于stack frame的优化选项加上该选项则忽略掉FP栈顶指针而且默认是不加的。所以上述这个图也对就是默认情况下把R11当做通用寄存器使用。r12 用作子程序间scratch 寄存器即 ip 寄存器R13 (SP)堆栈指针用于管理函数调用过程中的堆栈。R14 (LR)链接寄存器用于保存子程序返回地址。R15 (PC)程序计数器即指令指针IP指向当前执行指令的地址。2.汇编风格ARM 32的汇编风格倒是比较像Intel的风格。一般指令的是 指令 目的操作数源操作数MOV R0,#1//将1放入R0ADD sp,sp,#8//从堆栈中删除8个字节ldr r1,[r2,#4]/*将地址为r24的内存单元数据读取到r1中*/3.调用约定ATPCS调用约定规定入参的前4个使用R0-R3超过4个使用堆栈传递使用堆栈传递的参数从右至左。 返回值使用R0寄存器。三、实例汇编作为总入口调用C语言的函数入参有6个看下汇编是如何传递的.text.global main main:MOV R0,#1//将1放入R0MOV R1,#2//将2放入R1MOV R2,#3//将3放入R2MOV R3,#4//将4放入R3MOV R4,#6//将6放入R4STR R4,[SP,#-4]!//第6个参数通过堆栈传递, 先压入第6个再压入第五个MOV R4,#5//将5放入R4STR R4,[SP,#-4]!//第5个参数通过堆栈传递BL fcn//调用C程序ADD sp,sp,#8//从堆栈中删除第五和第六个参数MOV r7,#1// exit syscallMOV r0,#0SWI #0文件名称asm.s#includestdio.hintfcn(inta,intb,intc,intd,inte,intf){printf(The sum of %d, %d, %d, %d, %d , %d is %d\n,a,b,c,d,e,f,abcdef);returnabcde;}文件名称fun.cC语言函数的入参是6个依次是a,b,c,d,e,f, 汇编使用R0传递a参数使用R1传递b参数使用R2传递c参数使用R3传递d参数。 此时使用寄存器能传递的参数到达上限接下来需要使用堆栈传递参数。堆栈向下移动4字节压入R4(放入6) 也就是 STR R4, [SP, #-4]!这里面先压入最右边的6而不是5因为堆栈是从右到左压入参数的。注意STR R4, [SP, #-4]!这条指令是会改变SP的值的这条指令执行过之后SP的值被修改成向下的4字节之后的地址。堆栈再向下移动4字节压入R4(放入5) 也就是 STR R4, [SP, #-4]!前面的MOV R4, #5,把5放入了R4中。BL fcn 调用C函数这里直接使用名字。最后堆栈恢复一下前面压入两个4字节参数这里SP加了8把它们都释放出去了。编译 由于使用的是32位嵌入式环境前面带了了一大串gcc路径前缀所以使用了一个Makefile辅助编译CC :/opt/toolchains/anyka/ak100/arm-anycloud-linux-uclibcgnueabi/bin/arm-anycloud-linux-uclibcgnueabi-gcc LIB_PATH :/opt/toolchains/anyka/ak100/arm-anycloud-linux-uclibcgnueabi/lib HEAD_PATH :/opt/toolchains/anyka/ak100/arm-anycloud-linux-uclibcgnueabi/includeexportLD_LIBRARY_PATH/opt/toolchains/anyka/ak130/arm-anycloud-linux-uclibcgnueabi/lib:$LD_LIBRARY_PATHtest: fun.c asm.s$(CC)-I$(HEAD_PATH)-L$(LIB_PATH)-otestfun.c asm.s clean:rm$(subst .c,.o,$(wildcard *.c))rmtestubuntu18:~/code/test/asm/arm32$make直接使用make指令编译。注意makefile里面的LD_LIBRARY_PATH这个环境变量的export操作如果没有容易报错关于路径要修改成自己的环境路径。运行运行的时候把程序拷贝到/tmp目录下执行验证下可以看到参数按照1,2,3,4,5,6,正确传递过来,那就说明前面压栈的次序是对的。