首页 > 编程语言 >汇编语言学习_2_正确的退出方式

汇编语言学习_2_正确的退出方式

时间:2023-02-27 21:33:17浏览次数:55  
标签:sys 调用 正确 汇编语言 elf mov helloworld 学习 内存

第二节

正确的退出方式

翻译自:https://asmtutor.com/

背景知识

在 Lesson 1 中成功学习了如何执行系统调用之后,现在需要学习内核中最重要的系统调用之一 sys_exit

请注意我们的“Hello, world!”之后的情况。程序运行我们遇到了Segmentation fault(段错误)?好吧,计算机程序可以被认为是一长串指令,它们被加载到内存中并分成多个部分(或段)。这个通用内存池在所有程序之间共享,可用于存储变量、指令、其他程序或任何真正的东西。每个段都有一个地址,以便以后可以找到存储在该段中的信息。

要执行加载到内存中的程序,我们使用全局标签 _start 来告诉操作系统在内存中的什么位置可以找到并执行我们的程序。然后,按照程序逻辑顺序访问内存,程序逻辑决定要访问的下一个地址。内核跳转到内存中的那个地址并执行它。

告诉操作系统应该在哪里开始执行,在哪里停止,这一点很重要。在第一节中,我们没有告诉内核在哪里停止执行。因此,在我们调用 sys_write 之后,程序继续顺序执行内存中的下一个地址,这可能是任何地址。我们不知道内核试图执行什么,但最终其阻塞,终止进程并报错 “Segmentation fault” 。在所有程序结束时调用 sys_exit 将意味着内核确切知道何时终止进程并将内存归还到通用池,从而避免错误。

写程序

sys_exit 有一个简单的函数定义。在 Linux 系统调用表中,它被分配为 OPCODE 1,并通过 EBX 传递一个参数。
为了执行这个功能,我们需要做的是:

  • EBX 置为 0,表示没有错误
  • EBX 置为 1,来调用 sys_exit
  • 使用INT 80h 请求中断

然后我们再次编译、链接并运行它。

注意:只有在每节课中添加的新代码才会被注释。

; Hello World Program - asmtutor.com
; 文件名:helloworld.asm
; 编译:nasm -f elf helloworld.asm
; 链接(64位系统需要 elf_i386 选项):ld -m elf_i386 helloworld.o -o helloworld
; 运行:./helloworld
SECTION .data
msg     db      'Hello World!', 0Ah
 
SECTION .text
global  _start
 
_start:
 
    mov     edx, 13
    mov     ecx, msg
    mov     ebx, 1
    mov     eax, 4
    int     80h
 
    mov     ebx, 0      ; 返回状态0来表示'No Errors'
    mov     eax, 1      ; 调用 SYS_EXIT
    int     80h
~$ nasm -f elf helloworld.asm
~$ ld -m elf_i386 helloworld.o -o helloworld
~$ ./helloworld
Hello World!

标签:sys,调用,正确,汇编语言,elf,mov,helloworld,学习,内存
From: https://www.cnblogs.com/chai-yuan/p/17161994.html

相关文章

  • 2023年2月27日学习总结
    今天上午继续学习了androidapp的开发,知道了如何创建数据库,创建表,和页面间数据的传递。下午上课时按照老师的要求要做一个对文本文件中英文单词的接龙,找出最长的单词链,刚......
  • 学习记录(2.27)
    学习时长:6h代码行数:约160行今天继续进行了小游戏flappychicken的开发,成功debug了两次,解决了鸡无法触发管道侧边碰撞的问题,并且对地图进行了一些优化。......
  • 2.27学习总结
    今天学习了英语链packagepiao;importjava.io.*;importjava.util.ArrayList;publicclasscheck{ publicstaticvoidmain(String[]args)throwsIOException { Fi......
  • 虚幻引擎5 学习 入门 2Day
    今日的学习内容:灯光渲染灯光分类:DirectionalLight定向光源  PointLight点光源  SpotLight聚光灯 RectLight矩形灯 SkyLight天灯光照分移动性光照......
  • 并发多线程学习(二)上下文切换
    上下文切换(有时也称做进程切换或任务切换)是指CPU从一个进程(或线程)切换到另一个进程(或线程)。上下文是指某一时间点CPU寄存器和程序计数器的内容。寄存器是cpu内部的少......
  • 并发多线程学习(三)Java多线程入门类和接口
    1Thread类和Runnable接口上一章我们了解了操作系统中多线程的基本概念。那么在Java中,我们是如何使用多线程的呢?首先,我们需要有一个“线程”类。JDK提供了Thread类和Runn......
  • 并发多线程学习(五)Java线程的状态及主要转化方法
    1操作系统中的线程状态转换首先我们来看看操作系统中的线程状态转换。在现在的操作系统中,线程是被视为轻量级进程的,所以操作系统线程的状态其实和操作系统进程的状态是......
  • 并发多线程学习(四)线程组和线程优先级
    1线程组(ThreadGroup)Java中用ThreadGroup来表示线程组,我们可以使用线程组对线程进行批量控制。ThreadGroup和Thread的关系就如同他们的字面意思一样简单粗暴,每个Thread......
  • 并发多线程学习(六)Java线程间的通信
    合理的使用Java多线程可以更好地利用服务器资源。一般来讲,线程内部有自己私有的线程上下文,互不干扰。但是当我们需要多个线程之间相互协作的时候,就需要我们掌握Java线程的......
  • Java学习——Markdown语法
    标题:#+空格+标题名,支持1到6级标题,几级标题几个#1#+空格+一级标题2##+空格+二级标题3###+空格+三级标题4####+空格+四级标题5#####+空格+五级标题6######+空格+六级......