linux下32位汇编调用规则

传递给系统调用的参数必须安装参数顺序一次放到寄存器中,当系统调用完成后,返回值放在eax中:

  1. 当系统调用参数<=5个时:
    eax中存放系统调用的功能号,传递给系统调用的参数顺序依次放到寄存器:ebx,ecx,edx,esi,edi中
  2. 当系统调用参数>5个时:
    eax中存放系统调用的功能号,全部参数应依次放在一块连续的内存区域中,同时在寄存器ebx中保存指向该内存区域的指针(内存块的首地址);linux采用的是C调用模式,这意味着如果要以stack来实现这个连续的内存块(当然可以用其他方式实现,比如heap)时,所有参数必须以相反的顺序进栈:即最后一个参数最先进栈,第一个参数最后进栈,最后将栈指针的值(栈顶地址)放到寄存器ebx中。

C库函数的参数传递规则:

  1. 参数从右向左一次入栈(push);
  2. 库函数返回值放在eax中;
  3. 系统调用exit参数值在exit调用结束程序退出时会被传递给系统shell,通过打印$?的值可以看到

汇编函数的返回值:

  1. 对于32位返回值放在寄存器eax中
  2. 对于64位返回值,高位放在edx,低位放在eax中

本篇未给出浮点数值的调用和返回规则,虽然略知一二,但没有系统化的认识,不敢乱写;如各位有相关的完整文档请不吝赐教帮助补全,谢谢。

时间: 2024-08-27 17:19:57

linux下32位汇编调用规则的相关文章

linux下64位汇编的系统调用(2)

知道了syscall调用号之后还不算完,还要搞清楚2件事: 1 每种调用号需要传递哪些参数: 2 调用如何传递参数以及结果如何返回: 第一个问题的答案是: 在linux系统中某个程序执行时进行的系统调用可以通过strace命令来查看,solaris中对应的命令为dtrace,而mac os x中可以通过类似的dtruss命令来查看.当进程已经处于 D 状态(uninterruptible sleep)时,strace 也帮不上忙.这时候可以通过: cat /proc/<PID>/syscall

linux下64位汇编的系统调用(1)

现在基本上系统都是64位了,而64位系统下的汇编和32位有了较大的变化,无论是系统调用的接口还是C标准库的接口都和32位汇编有所不同:下面简单谈一下在64位linux下如何利用汇编直接调用系统调用. 需要准备的有: 1.一台linux机器:我的系统是ubuntu 14.10 x64版: 2.还要一个汇编器:我没有使用gas,而是使用了跨平台的nasm: 3.一个调试器:这里选择的不多,要不就是gdb,要不就是lldb,不过这里选择前者. 4.一个编辑器,linux下有很多优秀的语法编辑器,这里用

linux下64位汇编的系统调用(3)

背景知识基本交代清楚了,下面我们实际写一个小例子看一下.代码的功能很简单,显示一行文本,然后退出.我们使用了syscall中的write和exit调用,查一下前面的调用号和参数,我们初步总结如下: write(即sys_write)调用号为1,需传递3个参数 unsigned int fd const char *buf size_t count exit(sys_exit)调用号为60,只需传递一个错误码 int error_code 如果该值为0表示程序执行成功. 因为以上两个调用最多的也只

Mac OS X下64位汇编与Linux下64位汇编的一些不同

1 首先系统调用号大大的不同:mac64和linux32的系统调用号也不同(虽然局部可能有相同) 2 mac64的系统调用号在: /usr/include/sys/syscall.h 可以查到,但是调用的时候其值要加上0x2000000,可以写一个宏处理: %define mk64 0x2000000+ 使用方式如下: mov rax,mk64 1 ;exit NO mov rdi,0 ;error_code syscall 3 如果在mac64下汇编要与C库相链接,所有extern符号名前要加

linux下64位汇编的系统调用(4)

经过上一篇的铺垫貌似可以很轻松的用汇编写出mmap的代码来,可仔细一看,还是有不少问题需要解决: 1.系统调用mmap如果出错并不直接返回MAP_FAILED(-1),而是一个"类似"值:C库中的mmap函数对其做了包装,使其最终返回-1:如果我们直接调用mmap syscall,则这些事必须自己来做. 2.C库函数如果出错会设置errno的值,而在汇编中没法直接用: extern errno 的方法使用外部的值,连接时会报错: /usr/bin/ld: errno: TLS defi

linux下64位汇编的系统调用(5)

看到这里大家都基本知道了如何进行linux下的汇编系统调用:不过有些童鞋可能会问:那些C库中函数里为我们解决的额外汇编代码你是怎么知道的? 好吧,我承认:我是通过逆向知道的,这貌似有点犯规的嫌疑- 比如举个例子,那上一篇里的mmap C库函数来说,首先写一个C代码: #include <stdlib.h> #include <stdio.h> #include <stdbool.h> #include <sys/mman.h> #include <sy

如何看linux是32位还是64位

查看linux机器是32位还是64位的方法: 方法一:file /sbin/init    或者   file /bin/ls 结果如下:/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped 如果显示 64-bit 则为64位:file /sbin/init/sbin/init: E

Linux如何使用shell查看Linux是32位还是64

  现在绝大多数用户使用的是Windows系统,都知道Windows系统有分32位和64位,其实Linux系统也有32位和64位之分,你知道你的Linux系统是几位的吗?下面小编就教你如何使用shell查看Linux是32位还是64位. 手动查看系统位数 查看linux系统位数,可以分别执行以下两个命令 getconf WORD_BIT 用于获取word的位数 getconf LONG_BIT 用于获取long的位数 对于64位系统以上两个命令应该分别得到32和64. 判断linux系统是32位

五种方法检测你的 Linux 是32位还是64位

有的时候 Linux 新手们在下载软件的时候十分困惑,因为下载页面常常同时提供32位和64位版本的软件.所以弄清楚你的操作系统是32位的还是64位的十分重要,因为你在做很多事情的时候都需要这个信息.在这篇文章里,我们会讨论五种检测你的Linux系统是32位还是64位的方法. 检测你的 Linux 是32位还是64位的 请注意文中的这些方法是在 Ubuntu 13.10 平台测试. 1. 执行'uname -a' 命令 最常见的一个测试方法是运行 uname command 命令. 例如,在我的系