网站首页 > 基础教程 正文
第一个汇编程序helloWorld, 如果没有最后三行程序代码,将最后三行代码注释掉:
也可以运行,编译链接运行后会出现如下图所示:
虽然正常输出了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请求一个中断
如下图:两种写法都可以
- 上一篇: Linux学习总结4
- 下一篇: Linux系统编程中进程的控制:结束进程、等待进程结束
猜你喜欢
- 2024-11-21 Linux 汇编语言开发指南
- 2024-11-21 不小心删除/etc/passwd文件怎么办
- 2024-11-21 Linux | awk 特殊模式“BEGIN 和 END”
- 2024-11-21 Linux 网络编程——libpcap详解
- 2024-11-21 Linux Bash Shell学习之流程控制——if/else
- 2024-11-21 linux如何切换用户
- 2024-11-21 Linux系统常用命令
- 2024-11-21 Linux系统编程-02、进程
- 2024-11-21 Linux命令中特殊符号
- 2024-11-21 一行代码如何隐藏 Linux 进程?
- 12-31Java,设计模式,七大原则,里氏替换原则(LSP),案例
- 12-31「是时候升级Java11了」 JDK11优势和JDK选择
- 12-31「Java篇」-JIT机制详解
- 12-31版本不兼容Jar包冲突该如何是好?
- 12-31Java中字符串填充零和去零的常用方法
- 12-31设计模式 - 七大设计原则- 迪米特法则与里氏替换原则
- 12-31我的世界:关于鼠标中键,你不知道的11种用法!白玩了这么多年mc
- 12-31高德打车通用可编排订单状态机引擎设计
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)