汇编程序--退出

2024-02-03 12:58
文章标签 退出 汇编程序

本文主要是介绍汇编程序--退出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作为第一个汇编程序,本程序除了退出以外,并没有执行其他的功能。

#目的: 退出并向Linux内核返回一个状态码的简单程序#输入: 无#输出: 返回一个状态码.在运行程序后可通过输入echo $?来读取状态码#变量:
# %eax保存系统调用号
# %ebx保存返回状态
#
.section .data.section .text.globl _start_start:
movl $1, %eax  #这是用于退出程序的Linux内核命令号(系统调用)movl $40, %ebx  #这是我们将返回给操作系统的状态码#改变这个数字,则返回到echo $?的值会不同int $0x80      #这将唤醒内核,以运行退出命令

在编辑器中输入以上代码之后,我们需要做的第一步就是汇编程序,汇编的过程就是将汇编语言转换成机器指令。汇编程序可以输入以下命令:

as exit.s -o exit.o

其中as是运行汇编程序的命令,exit.s是保存以上代码的源文件,-o exit.o是告诉汇编程序将输出到目标文件exit.o中,exit.o是用机器语言写成的代码。目标文件的内容通常不完全放到一个地方,许多大的程序有许多个源文件,将每个源文件转化成一个目标文件,形成许多个目标文件。这是就需要用链接器程序把多个目标文件合二为一,并向其中添加信息,使内核知道该如何加载和运行该程序,链接程序的命令为:

ld exit.o -o exit

其中,ld是运行链接器的命令,exit.o 是目标文件,-o exit指示链接器输出新程序到名为exit的文件。对于文件的扩展名来说,在Liunx或者Unix中,文件的扩展名是可有可无的,Unix的可执行文件通常是没有扩展名的。注意:对源文件做任何修改之后,为在程序中实现这些更改,必须重新汇编和链接程序。接下来要运行程序,可以输入如下命令:

./exit

其中,./用来告诉计算机,改程序并非位于常用目录下,而是当前目录下,.指系统当前目录。

如果你在运行完改程序之后,立即输入:

echo $?

屏幕上就会出现一个40,因为每个程序退出的时候都会向Linux返回一个退出状态码,告诉系统一切运行是否正常,可以通过echo $?来查看状态码。

下面开始介绍本程序的代码的含义

在本程序中有很多以#开头的行,这表示这一行是注释,用来解释说明程序。

.section .data
在汇编程序中,任何以小数点(.)开始的指令都不会被直接翻译成机器指令,这些针对汇编程序本身的指令,由于是由汇编程序处理,实际上并不会由计算机运行,因此被称为汇编指令或伪操作。本程序中.section指令将程序分成几个部分。.section  .data命令是数据段的开始,数据段中要列出本程序所需要的内存的存储空间。有该程序没有使用任何的数据,所以可以不需要该指令,但是为了使程序具有完整性,我们保留了该指令。

int $0x80 

.section .text
表示文本段开始,文本段用来存放程序的指令。

.globl _start
.globl表示汇编程序不应该在汇编之后废弃这个符号,因为链接器需要它。_start 是一个特殊的符号,总是用.globl来标记,它将在汇编或者链接过程中被其他的内容替换。符号一般用来程序或者数据的位置,所以你可以用名字来代替内存地址。

_start:
用来定义_start的标签的值。标签是一个符号,后面跟一个冒号。标签定义一个符号的值。当汇编程序对程序进行汇编的时候,必须为每个数值或者每条指令分配地址。标签告诉汇编程序以该符号的值作为下一条指令或者下一条数据的位置。

movl $1, %eax 
将数字1移入寄存器%eax,其中1前面的$表示要用立即寻址方式寻址。之所以将1移入寄存器%eax中,是因为我们需要进行系统调用exit。当我们进行系统调用的时候,必须将系统调用号加载到%eax中。

大多数的指令都有两个操作数,第一个操作数是源操作数,第二个操作数是目的操作数。在这种情况下,源操作数根本不会改变,结果存放到目的操作数中。

movl $40, %ebx 
操作系统除了要知道要进行哪个调用,还需要知道其他的各种信息,在进行exit调用的时候,操作系统需要将状态码加载到%ebx,这个值将被返回到操作系统。

Linux只需要在系统调用之前将某些参数加载到某些寄存器中,通常我们需要将系统调用号加载到%eax中,而对于其他的寄存器,每个系统调用有不同的要求。

int $0x80
int代表中断,0x80是用到的中断号。中断会中断正常的程序流,把控制权从我们的手中转移到操作系统,和执行一个系统调用,当完成一个系统调用之后,控制权再次回到程序中。本程序中要求Linux退出程序,因此程序不会再获得控制权。

这篇关于汇编程序--退出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674217

相关文章

SpringBoot登录退出|苍穹外卖登录退出分析

文章目录 概要整体流程注意事项一、拦截路径二、token三、注册防止用户重复提交 苍穹外卖登录退出分析注意解决JWT退出后依然有效的问题 概要 结合Spring Boot和Vue3实现安全的用户登录和退出功能,并使用拦截器、JWT和Redis缓存来提高系统的安全性和性能。 整体流程 注意事项 一、拦截路径 像登录页面的路径就不要拦截了,否则都不能登录了 例如:

解决OAuth Token,点击退出登录报404问题

首先,认证服务器发送请求 http://auth.test.com:8085/logout?redirect_uri=http://admin.test.com:8080’ 退出后报404无法跳转到网站首页,这个时候增加一个参数redirect_uri指定退出成功后跳转的路径,因为是自定义的,所以需在认证服务器做一些处理 找到源码默认实现接口DefaultLogoutPageGeneratingF

SylixOS pthread_join退出

1 问题描述 在移植中间件过程中,在SylixOS下调用pthread_join时,如果线程在pthread_join等待之前结束,则线程返回无效线程错误值。在Linux下这种调用会正常返回。两种实现是有差别的,实现的原理分别如下。 2 函数实现机制 2.1 实现机制 在SylixOS下调用pthread_join时,如果线程在pthread_join等待之前结束,线程返回无效线程错误标志

基于SylixOS的Telnet退出异常

1.Telnet的定义 1.1 Telnet的定义 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。

王立平--android中让程序终止退出的解决办法 System.exit(0)

System.exit(0); System.exit(0)是将你的整个虚拟机里的内容都停掉了, 而finish()只是退出了activity,并没有退出应用,Application还是存在于内存中的,除非被系统回收。   System.exit(0)是正常退出程序, System.exit(1)或者说非0表示非正常退出程序 System.exit(sta

Mac系统中移动硬盘热拔(强制退出)后,在插上不显示移动硬盘的问题和解决办法

Mac系统中移动硬盘热拔(强制退出)后,在插上不显示移动硬盘的问题和解决办法 一、问题描述: 好久没有写博客了,被调研和开题的事情折磨得好久没有写日志和学编程了,现在又到了校招的时间,自己基础好差,感觉有些不知所措,网申简历笔试宣讲会神马的也是挺浪费时间的。 今天上午正在看视频过程时,由于未关闭视频窗口,直接在桌面右击移动硬盘快捷方式,点击推出,弹出一个未关闭文件,需要异常退出的弹窗,

开发app在android6.0运行直接退出解决(二)

上篇文章:http://blog.csdn.net/u013408979/article/details/52289534 只简单的解决能在android6.0运行,但没有根本的解决问题。 下面介绍解决方法: 参考 http://xdeveloper.cn/gai-jin-ban-android6-0quan-xian-gua-pei-bi-ni-xiang-de-huan-yao-ji

题目:有 n 个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位。

题目:有 n 个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到 3 的人退出圈子,问最后最后留下的是原来第几号的那位。 提示:用数组完成 import java.util.ArrayList;import java.util.List;import java.util.ListIterator;import java.util.Scanner;public class D

Android 吸入动画效果详解(仿mac退出效果)

转载自: http://m.blog.csdn.net/blog/leehong2005/9127095

QT5.15.2使用QXlsx读取Excel文件后退出程序时程序异常结束

QT5.15.2使用QXlsx读取Excel文件后退出程序时程序异常结束 这是一个困扰了我很久的问题,今天终于解决啦。 异常场景 我的情况是只要用了QXlsx去操作Excel文件后,在关闭程序时无法正常退出程序,会卡住,过一会后在QT的IDE上显示程序异常结束。 解决方法 主要原因在于QXlsx源码的xlsxcellreference.cpp中, 我们只需要找到void CellRefe