V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lane0x
V2EX  ›  程序员

Linux 汇编如何使用系统调用

  •  
  •   lane0x · 2014-11-06 11:42:06 +08:00 · 4252 次点击
    这是一个创建于 3670 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题1:这些系统调用所需要的参数从哪里获取.
    问题2:如果想获得例子如何得到.
    问题3:现在最需要的是gettimeofday(78)和fork(2)的用法.
    问题4:想写一个计算程序运行时长的汇编程序.
    类似于times
    形如:
    $ mytimer ls -lR
    1m2.560s
    18 条回复    2014-11-08 14:45:55 +08:00
    austinchou0126
        1
    austinchou0126  
       2014-11-06 11:46:12 +08:00 via iPhone
    正在学操作系统,不知道回答对不对,大致思路是将中断号写入EAX,然后INT 80
    austinchou0126
        2
    austinchou0126  
       2014-11-06 11:47:35 +08:00 via iPhone
    就是把syscall的inline汇编展开写进去,具体可以参考linux syscall
    lane0x
        3
    lane0x  
    OP
       2014-11-06 11:51:40 +08:00
    @austinchou0126 我找到一些简单例子,但是对我自己的目标没有什么帮助,只找到read和write.应该是有类似帮助手册的整体命令参数的表,我的目标是这个
    yangff
        4
    yangff  
       2014-11-06 12:01:44 +08:00 via Android
    关于寄存器的填充看这里: 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
        5
    yangff  
       2014-11-06 12:02:42 +08:00 via Android
    网络上有一些system call table不过都比较旧了(基本都是2.x内核的。。)
    lane0x
        6
    lane0x  
    OP
       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
        7
    lane0x  
    OP
       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
        8
    choury  
       2014-11-06 12:58:41 +08:00 via Android
    @lane0x 系统调用这么多,有个例子就行了啊,都一样,自己查个调用号表,其他的就是传的参数不一样,为什么非要这两个呢?
    choury
        9
    choury  
       2014-11-06 13:00:35 +08:00 via Android
    @choury 所有返回值都在eax/rax里面
    yangff
        10
    yangff  
       2014-11-06 13:07:38 +08:00 via Android
    @choury gtod是在那里没错。。丢个指针过去的。。
    但是at&t我就帮不了lz了。。
    tabris17
        11
    tabris17  
       2014-11-06 13:09:15 +08:00
    syscall指令
    lane0x
        12
    lane0x  
    OP
       2014-11-06 13:39:48 +08:00
    @choury 参数...
    gettimeofday的那个是引用传参在C里面...
    choury
        13
    choury  
       2014-11-06 14:11:39 +08:00
    @lane0x 我说的是返回值
    你想要的是这个吗?http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html
    wwlzz
        14
    wwlzz  
       2014-11-06 14:15:30 +08:00
    husinhu
        15
    husinhu  
       2014-11-06 15:23:40 +08:00
    for x86, int
    for x86-64, syscall
    for armv7, svc
    for armv8, svc
    lu18887
        16
    lu18887  
       2014-11-07 00:55:11 +08:00 via iPhone
    先写c版本 ,用gcc编译,输出格式选汇编
    dbow
        17
    dbow  
       2014-11-07 09:45:51 +08:00
    lane0x
        18
    lane0x  
    OP
       2014-11-08 14:45:55 +08:00
    @dbow 并没有找到...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1936 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 16:16 · PVG 00:16 · LAX 08:16 · JFK 11:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.