专业编程基础技术教程

网站首页 > 基础教程 正文

linux汇编3-正确的程序退出

ccvgpt 2024-11-21 11:07:02 基础教程 1 ℃

第一个汇编程序helloWorld, 如果没有最后三行程序代码,将最后三行代码注释掉:

也可以运行,编译链接运行后会出现如下图所示:

linux汇编3-正确的程序退出

虽然正常输出了hello,world!, 但最后我们看到输出了“Segmentation fault ”的错误信息,原因就是缺少了linux 内核最重要的系统调用sys_exit

计算机程序作为多个指令被加载到内存中并且被分成多个片段,通用内存池是在所有程序之前共享并且能够被用来存储变量、指令等程序中真实存在的任何东东,每个片段会给一个地址用来存储信息,后续也能被找到。

执行一个程序意味在内存中程序被加载,我们使用全局变量 _start: 去告诉操作系统我们的程序在内存哪里能被找到并且被执行,内存然后根据接下来程序的逻辑顺序存取地址,内核跳转到内存中的地址去执行程序。

准确的告诉操作系统应该从哪里开始执行和从应该从哪里停止是和重要的, 程序没有调用退出意味着没有告诉操作系统内核应该从哪里停止执行,因此我们调用sys_write输出hello,world!后程序继续在内存中执行下一个地址的任何指令,导致内核阻塞并中断我们当前的进程,输出了"Segmentation fault", 我们所有的程序结尾调用sys_exit意味着内核明确知道去中断进程并返回到通用内存池从而避免错误。

sys_exit有一个简单的函数定义,在Linux系统调用表中它是分派为OPCODE 1 并且通过EBX寄存器传递单个参数。

为了去执行这个函数我们需要去做:

  • 通过用0加载EBX寄存器去传递0给函数表示0个错误
  • 通过用1加载EAX寄存器去调用sys_exit
  • 然后通过libc库使用INT 80h请求一个中断


如下图:两种写法都可以

Tags:

最近发表
标签列表