linux 汇编2-关于寄存器及系统调用
32位的X86处理器中有8个32位的通用寄存器(EAX、EBX、ECX、EDX、ESI、)。EDI、ESP、EBP),由于历史的原因,EAX通常用于计算,ECX通常
后续主要在linux操作系统下学习基于X86的32位汇编语言 32位的X86处理器中有8个32位的通用寄存器(EAX、EBX、ECX、EDX、ESI、)。EDI、ESP、EBP),由于历史的原因,EAX通常用于计算,ECX通常用于循环变量计数。ESP和EBP有专门用途,ESP指示栈指针(用于指示栈顶位置),而EBP则是基址指针(用于指示子程序或函数调用的基址指针)。 主要寄存器如下图所示 X86CPU 32位主要寄存器 如图中所示,EAX、EBX、ECX和EDX的前两个高位字节和后两个低位字节可以独立使用,也就是AX、BX、CX、DX作为16位寄存器使用,其中16位又被独立分为H和L部分,可以作为8位寄存器使用,这样做的原因主要是考虑兼容16位的程序。使用寄存器时,其名称大小写是不敏感的,如EAX和eax没有区别。 2. 系统调用 系统调用是用户空间访问内核的唯一手段;除了异常和陷入外,他们是内核唯一的合法入口。程序员需要直接操作硬件,拥有的唯一接口是操作系统内核本身。为了使用汇编构建有用的程序linux feof函数,我们需要使用内核提供的linux系统调用(systemcall)。这些系统调用是内置在操作系统中的库,提供例如从键盘读取和输出到屏幕的函数。 在linux中,每个系统调用都被赋予一个独一无二的系统调用号。当用户空间的进程执行一个系统调用的时候,这个系统调用号就用来指明到底是要执行哪个系统调用:进程不会提及调用的名称。 当你调用一个系统调用,内核将立即暂停你的程序的执行。它将通过必要的驱动需要在硬件上执行你请求的任务然后将控制权还给你的程序。 通过将想要执行的函数号(操作码)存入到EAX寄存器以及将想传给系统调用的参数填充到剩余的寄存器,我们可以在汇编中完成系统调用。一个软件被请求INT命令中断,内核接管后使用我们的参数从库调用函数。 X86平台上,Linux在通过软中断指令int 0x80进行系统调用时(在Intel Pentium II 以后又引入了sysenter指令),调用号存在于EAX中,第一个参数存在于EBX, ECX、EDX、ESi和EDI来依次传递最多五个参数 常用调用号如下: 举个例子,请求一个中断,当EAX寄存器为1时,将调用sys_exit,当EAX寄存器为4时将调用sys_write代替。如果函数需要,EBX,ECX和EDX将作为参数传递。 回过头再看第一个汇编helloWorld源程序 图中 1 部分:将使用系统调用sys_write来输出我们的消息到控制台窗口。这个函数在linux系统调用表中的操作码被分配为4,所以代码就是: mov eax,4 这个函数也带有三个参数,在请求中断来执行任务之前,将它们有序的存入EBX、EDX,ECX三个寄存器中。 传递的参数如下: 图中 2部分:使用系统调用sys_exit 终止进程来退出程序 每一行都有英文的注释, 通过这次的学习是不是又理解的更清楚了 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |