linux 系统调用 汇编,ARM linux 汇编系统调用

系统调用格式

SWI + offset+ 系统调用号

参数 R0,R1,R2

.text

.align  2

.global main

main:

adr     r1, msg         @ address

mov     r0, #1          @ stdout

mov     r2, #13         @ length

swi     #0x900004       @ sys_write

mov     r0, #0

swi     #0x900001       @ sys_exit

.align  2

msg:

.asciz  "hello, world\n"

//系统调用汇编参数传递格式 include\asm-arm\unistd.h

#define __syscall_return(type, res)     \

do {         \

if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) { \

errno = -(res);      \

res = -1;      \

}        \

return (type) (res);      \

} while (0)

#define _syscall0(type,name)      \

type name(void) {       \

__SYS_REG(name)       \

register long __res_r0 __asm__("r0");     \

long __res;        \

__asm__ __volatile__ (      \

__syscall(name)       \

: "=r" (__res_r0)      \

: __SYS_REG_LIST()      \

: "memory" );       \

__res = __res_r0;       \

__syscall_return(type,__res);      \

}

#define _syscall1(type,name,type1,arg1)     \

type name(type1 arg1) {       \

__SYS_REG(name)       \

register long __r0 __asm__("r0") = (long)arg1;   \

register long __res_r0 __asm__("r0");     \

long __res;        \

__asm__ __volatile__ (      \

__syscall(name)       \

: "=r" (__res_r0)      \

: __SYS_REG_LIST( "0" (__r0) )     \

: "memory" );       \

__res = __res_r0;       \

__syscall_return(type,__res);      \

}

#define _syscall2(type,name,type1,arg1,type2,arg2)   \

type name(type1 arg1,type2 arg2) {     \

__SYS_REG(name)       \

register long __r0 __asm__("r0") = (long)arg1;   \

register long __r1 __asm__("r1") = (long)arg2;   \

register long __res_r0 __asm__("r0");     \

long __res;        \

__asm__ __volatile__ (      \

__syscall(name)       \

: "=r" (__res_r0)      \

: __SYS_REG_LIST( "0" (__r0), "r" (__r1) )   \

: "memory" );       \

__res = __res_r0;       \

__syscall_return(type,__res);      \

}

#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)  \

type name(type1 arg1,type2 arg2,type3 arg3) {    \

__SYS_REG(name)       \

register long __r0 __asm__("r0") = (long)arg1;   \

register long __r1 __asm__("r1") = (long)arg2;   \

register long __r2 __asm__("r2") = (long)arg3;   \

register long __res_r0 __asm__("r0");     \

long __res;        \

__asm__ __volatile__ (      \

__syscall(name)       \

: "=r" (__res_r0)      \

: __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2) )  \

: "memory" );       \

__res = __res_r0;       \

__syscall_return(type,__res);      \

}

#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)\

type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {  \

__SYS_REG(name)       \

register long __r0 __asm__("r0") = (long)arg1;   \

register long __r1 __asm__("r1") = (long)arg2;   \

register long __r2 __asm__("r2") = (long)arg3;   \

register long __r3 __asm__("r3") = (long)arg4;   \

register long __res_r0 __asm__("r0");     \

long __res;        \

__asm__ __volatile__ (      \

__syscall(name)       \

: "=r" (__res_r0)      \

: __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) ) \

: "memory" );       \

__res = __res_r0;       \

__syscall_return(type,__res);      \

}

#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \

type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) { \

__SYS_REG(name)       \

register long __r0 __asm__("r0") = (long)arg1;   \

register long __r1 __asm__("r1") = (long)arg2;   \

register long __r2 __asm__("r2") = (long)arg3;   \

register long __r3 __asm__("r3") = (long)arg4;   \

register long __r4 __asm__("r4") = (long)arg5;   \

register long __res_r0 __asm__("r0");     \

long __res;        \

__asm__ __volatile__ (      \

__syscall(name)       \

: "=r" (__res_r0)      \

: __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2),  \

"r" (__r3), "r" (__r4) )   \

: "memory" );       \

__res = __res_r0;       \

__syscall_return(type,__res);      \

}

#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \

type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) { \

__SYS_REG(name)       \

register long __r0 __asm__("r0") = (long)arg1;   \

register long __r1 __asm__("r1") = (long)arg2;   \

register long __r2 __asm__("r2") = (long)arg3;   \

register long __r3 __asm__("r3") = (long)arg4;   \

register long __r4 __asm__("r4") = (long)arg5;   \

register long __r5 __asm__("r5") = (long)arg6;   \

register long __res_r0 __asm__("r0");     \

long __res;        \

__asm__ __volatile__ (      \

__syscall(name)       \

: "=r" (__res_r0)      \

: __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2),  \

"r" (__r3), "r" (__r4), "r" (__r5) )  \

: "memory" );       \

__res = __res_r0;       \

__syscall_return(type,__res);      \

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值