免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1063 | 回复: 0
打印 上一主题 下一主题

ARM linux 汇编系统调用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-30 02:45 |只看该作者 |倒序浏览
系统调用格式

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);      \


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39383/showart_433141.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP