Linux 汇编如何使用系统调用

2014-11-06 11:42:06 +08:00
 lane0x
问题1:这些系统调用所需要的参数从哪里获取.
问题2:如果想获得例子如何得到.
问题3:现在最需要的是gettimeofday(78)和fork(2)的用法.
问题4:想写一个计算程序运行时长的汇编程序.
类似于times
形如:
$ mytimer ls -lR
1m2.560s
4072 次点击
所在节点    程序员
18 条回复
austinchou0126
2014-11-06 11:46:12 +08:00
正在学操作系统,不知道回答对不对,大致思路是将中断号写入EAX,然后INT 80
austinchou0126
2014-11-06 11:47:35 +08:00
就是把syscall的inline汇编展开写进去,具体可以参考linux syscall
lane0x
2014-11-06 11:51:40 +08:00
@austinchou0126 我找到一些简单例子,但是对我自己的目标没有什么帮助,只找到read和write.应该是有类似帮助手册的整体命令参数的表,我的目标是这个
yangff
2014-11-06 12:01:44 +08:00
关于寄存器的填充看这里: http://man7.org/linux/man-pages/man2/syscall.2.html
syscall有哪些看这里,点进去可以看参数: http://man7.org/linux/man-pages/man2/syscalls.2.html
syscall的编号去头文件里面找sys_xxxxx
注意在64位下用syscall,在32位下用sysenter。。int 80可能可以用吧。。
yangff
2014-11-06 12:02:42 +08:00
网络上有一些system call table不过都比较旧了(基本都是2.x内核的。。)
lane0x
2014-11-06 12:10:38 +08:00
@yangff 比如我想用gettimeofday
msg:
.long 1
movl $78,%eax
movl $msg,%ebx
movl $0,%ecx
int $0x80
这样msg里保存了系统时间吗?
lane0x
2014-11-06 12:22:19 +08:00
.section .rodata
msg:
.ascii "Hello, world.\n"
.section .text
.globl _start
_start:

movl $2, %eax #调用fork系统调用
int $0x80

movl $4, %eax # system call 系统调用号(sys_write)
movl $1, %ebx # file descriptor 参数一:文件描述符(stdout)
movl $msg, %ecx # string address 参数二:要显示的字符串
movl $14, %edx # string length 参数三:字符串长度
int $0x80 # 调用内核功能

movl $1, %eax # 系统调用号(sys_exit)
movl $0, %ebx # 参数一:退出代码
int $0x80 # 调用内核功能

类似于这种...有人能给个汇编使用系统调用的其他例子吗.
最好是gettimeofday和fork的
choury
2014-11-06 12:58:41 +08:00
@lane0x 系统调用这么多,有个例子就行了啊,都一样,自己查个调用号表,其他的就是传的参数不一样,为什么非要这两个呢?
choury
2014-11-06 13:00:35 +08:00
@choury 所有返回值都在eax/rax里面
yangff
2014-11-06 13:07:38 +08:00
@choury gtod是在那里没错。。丢个指针过去的。。
但是at&t我就帮不了lz了。。
tabris17
2014-11-06 13:09:15 +08:00
syscall指令
lane0x
2014-11-06 13:39:48 +08:00
@choury 参数...
gettimeofday的那个是引用传参在C里面...
choury
2014-11-06 14:11:39 +08:00
@lane0x 我说的是返回值
你想要的是这个吗?http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html
wwlzz
2014-11-06 14:15:30 +08:00
husinhu
2014-11-06 15:23:40 +08:00
for x86, int
for x86-64, syscall
for armv7, svc
for armv8, svc
lu18887
2014-11-07 00:55:11 +08:00
先写c版本 ,用gcc编译,输出格式选汇编
dbow
2014-11-07 09:45:51 +08:00
lane0x
2014-11-08 14:45:55 +08:00
@dbow 并没有找到...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/144352

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX