英文原版地址:NASM Assembly Language Tutorials - asmtutor.com
背景知识
汇编语言是基础的。程序员在硬件上拥有的唯一接口是内核本身。为了使用汇编构建有用的程序,我们需要使用内核提供的linux系统调用。这些系统调用是内置在操作系统中的库,提供例如从键盘读取和输出到屏幕的函数。
当你调用一个系统调用,内核将立即暂停你的程序的执行。它将联系必要的驱动需要在硬件上执行你请求的任务然后将控制权还给你的程序。
注:驱动被叫做驱动是因为内核真的用它们去驱动硬件
通过将想要执行的函数号(操作码)存入到EAX寄存器以及将想传给系统调用的参数填充到剩余的寄存器,我们可以在汇编中完成系统调用。一个软件被请求INT命令中断,内核接管然后使用我们的参数从库调用函数。
举个例子,请求一个中断,当EAX寄存器为1时,将调用sys_exit,当EAX寄存器为4时将调用sys_write代替。如果函数需要,EBX,ECX和EDX将作为参数传递。
写代码
首先,我们在 .data 段创建一个变量 'msg' ,在本例中指定它为我们想输出的字符串'Hello World!'。在我们的代码段,我们通过提供一个全局标记 _start 表示程序的入口点,告诉内核从哪开始执行。
我们将使用系统调用sys_write来输出我们的消息到控制台窗口。这个函数在linux系统调用表中的操作码被分配为4。这个函数也带有三个参数,在请求中断来执行任务之前,将它们有序的存入EDX,ECX和EBX三个寄存器中。
传递的参数如下:
-
EDX将被存入字符串的长度(比特数)
-
ECX将被存入我们在 .data 段创建的变量的地址
-
EBX将被存入饿哦们想写入的文件(在本例中为标准化输出STD

这篇博客介绍了如何使用NASM汇编语言在Linux环境下实现系统调用来输出'Hello World!'。通过将字符串长度、内存地址和系统调用号填入特定寄存器,并调用INT命令中断,我们可以利用sys_write系统调用将消息写入标准输出。在执行汇编程序后,尽管会遇到Segmentation fault错误,但过程展示了基本的系统调用原理。
最低0.47元/天 解锁文章
1195

被折叠的 条评论
为什么被折叠?



