汇编中调用printf:传递参数超过4个,用栈传递参数

来源:互联网 发布:java如何处理高并发 编辑:程序博客网 时间:2024/05/16 19:40
/********************* 汇编中调用printf:传递参数超过4个,用栈传递参数*****************//**********************  uboot中go命令调用这个裸机程序    **************************///转载请注明原文地址:http://blog.csdn.net/oyhb_1992/article/details/77823235//函数参数传递规则:前4个参数依次放在r0-r3中传递,从第5个参数开始,通过栈来传递,被调用函数会从这些寄存器里取出参数/*裸机程序常识3  汇编中使用栈快捷指令push {r0-r, r5-r8, lr}pop {r0-r, r5-r8, lr}push压栈,pop出栈*/#define printf 0x43e11ad0   //uboot中printf函数地址.global _start_start://printf("%c 0x%x %d     %s %c %d\n" , 'Y' , 0x12345678 , 98765432, "stack", 'A', 112233);共传递了6个参数mov r4 , lr  //等价于push {lr}//传递后3个参数ldr r0 , =arg  //依次给printf函数传递4个参数mov r1 , #'A'ldr r2 , =112233push {r0,r1,r2}//传递前4个参数ldr r0 , =fmt  //依次给printf函数传递4个参数mov r1 , #'Y'ldr r2 , =0x12345678ldr r3 , =98765432mov lr , pc mov pc , =printfpop {r0,r1,r2}mov lr , r4  //等价于pop {pc}  //回到ubootfmt:.asciz "%c 0x%x %d     %s %c %d\n"  //z表示以‘0’结尾的字符串arg:      .asciz "static\n"  //z表示以‘0’结尾的字符串  

原创粉丝点击