汇编:Linux汇编基本框架与系统调用

news2024/11/26 4:26:19

在Linux操作系统下进行汇编编程时,基本的汇编程序框架通常包括以下几个部分:

全局段声明(section declarations):定义数据段、代码段等。

入口点(entry point):程序的执行起点,通常为_startmain

系统调用(system calls):通过操作系统提供的接口完成基本功能,如输入输出。

以下是一个简单的32位Linux汇编程序的框架示例,使用了NASM汇编器:

1.创建.asm汇编文件
sudo vim Hello.asm

2.编写汇编代码

这段汇编代码是一个在Linux系统下编写的简单程序,使用系统调用输出"Hello World!"并换行,然后退出程序。

section .data
    msg db "Hello World!",0xa
    len equ $ - msg
​
section .text
    global _start
​
_start:
    mov edx,len
    mov ecx,msg
    mov ebx,1
    mov eax,4
    int 0x80
​
    mov ebx,0
    mov eax,1
    int 0x80
数据段(section .data):

section .data:定义数据段,包含已初始化的数据。

msg db "Hello World!",0xa:定义一个字符串"Hello World!",并在末尾添加换行符(ASCII码为0xa)。db指令用于定义字节序列(data byte)。

len equ $ - msg:定义一个常量len,其值是当前地址($)减去字符串msg的起始地址,即字符串的长度。这里,$表示当前汇编位置的地址,因此$ - msg计算了字符串msg的长度。

代码段(section .text):

section .text:定义代码段,包含程序的指令。

global _start:定义入口点_start,告诉链接器程序的起始位置。

程序入口(_start):

_start::程序的入口点。

1)打印内容

mov edx, len:将字符串长度len(即12,包括换行符)加载到寄存器edx中。这是系统调用write所需的第三个参数,表示要写入的字节数。

mov ecx, msg:将字符串地址msg加载到寄存器ecx中。这是系统调用write所需的第二个参数,表示要写入的缓冲区地址。

mov ebx, 1:将文件描述符1(标准输出stdout)加载到寄存器ebx中。这是系统调用write所需的第一个参数,表示目标文件描述符。

mov eax, 4:将系统调用号4sys_write)加载到寄存器eax中。这告诉内核要执行write系统调用。

int 0x80:触发中断0x80,向内核发出系统调用请求。

这段代码执行的是write系统调用,具体调用格式如下:

ssize_t write(int fd, const void *buf, size_t count);

在汇编中,参数按照以下顺序放入寄存器:

  1. fd(文件描述符):ebx

  2. buf(缓冲区地址):ecx

  3. count(字节数):edx

2)退出程序

mov ebx, 0:将退出状态码0(表示正常退出)加载到寄存器ebx中。

mov eax, 1:将系统调用号1sys_exit)加载到寄存器eax中。这告诉内核要执行exit系统调用。

int 0x80:再次触发中断0x80,向内核发出系统调用请求。

这段代码执行的是exit系统调用,具体调用格式如下:

void _exit(int status);

在汇编中,参数按照以下顺序放入寄存器:

  1. status(退出状态码):ebx

通过这段代码,程序将输出"Hello World!"并换行,然后正常退出

更多的系统调用可以根据程序架构查看文件:
/usr/include/asm/unistd_32.h    #x86架构程序的系统调用头文件
​
/usr/include/asm/unistd_64.h    #x64架构程序的系统调用头文件

这两个文件分别定义了32位架构和64位架构汇编的系统调用的编号;系统调用号在汇编程序中非常重要,因为它们用于指示内核执行特定的操作。例如,sys_write系统调用的编号在unistd_64.h上是1;在unistd_32.h上是4。

3.生成目标文件(汇编)
nasm -f elf32 Hello.asm 

使用 nasm 汇编器将 Hello.asm 汇编成目标文件 Hello.o;这条命令会生成一个名为 Hello.o 的目标文件。

-f指定格式位32位的elf格式(因为上述代码中使用的系统调用是32位的系统调用)所以此时在汇编的使用要指定32位架构格式的目标文件。

4.链接

使用 ld 链接器将目标文件 Hello.o 链接成可执行文件 Hello32;将32位目标文件链接成可执行文件。

ld -m elf_i386 -s -o Hello32 Hello.o

5.执行程序
./Hello32

尽管大多数情况下x64系统可以运行x86程序,但有些情况下可能会出现兼容性问题:

①缺少32位库:如果系统中没有安装需要的32位库或特定的依赖项,32位程序将无法运行。
②系统调用和内核模块:某些32位程序可能直接使用特定的系统调用或内核模块,这些调用或模块在64位系统中不可用或行为不同。
③依赖特定硬件特性:某些32位程序可能依赖于特定的硬件特性或设备驱动,这些特性或驱动在64位系统中不可用或需要特定的32位支持。

这里顺便记录一下简答的x64汇编架构;

以下是一个简单的32位Linux汇编程序的框架示例,同样使用NASM汇编器:

这段汇编代码是一个Linux 64平台下的程序,实现了输出"Hello World"并换行,并正常退出的功能。

section .data
    msg db "Hello World",0xa
    len equ $ - msg
​
section .text
    global _start
​
_start:
    mov edx,len
    mov esi,msg
    mov edi,1
    mov eax,1  ;调用号为1因为是64位程序所以对应的调用号可以在/usr/include/asm/unistd_64.h文件中进行查阅
    syscall
​
    mov edi,0   ;调用号为0因为是64位程序所以对应的调用号可以在/usr/include/asm/unistd_64.h文件中查阅
    mov eax,60
    syscall

这段代码实现了以下功能:

  1. 输出字符串

    • 使用sys_write系统调用(系统调用号为1),它的参数分别是:edx寄存器存放字符串长度,esi寄存器存放字符串的地址,edi寄存器存放文件描述符(1表示标准输出)。

    • 执行syscall指令来触发系统调用。

  2. 退出程序

    • 使用sys_exit系统调用(系统调用号为60),它的参数是退出状态码,这里设置为0表示正常退出。

    • 再次执行syscall指令来触发系统调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1827375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 显示笔记本电脑的电池状态和百分比

方法一: import psutil import psutil battery psutil.sensors_battery() if battery is None:print("No battery is found.")exit() print (battery) percentagebattery.percent print(f"Battery Percentage: {percentage}%")Battery的信息…

一个在C#中集成Python的例子

一个在C#中集成Python的例子。在C#中可以执行Python脚本,在Python中也可以调用C#宿主中的功能(clr.AddReference(Business))。 文件说明 Debug为执行目录 Mgr.exe为执行文件 Py\init.py为python初始化脚本 Py\Lib.zip为python需要的模块&…

数据库 | 期末复习专题(HBUT 韩洪木)

总结: 考研数据库系统概论题目整理_若视图的属性来自聚集函数、表达式,则该视图是可以更新的。-CSDN博客 数据库系统概论 ---知识点大全(期末复习版)_数据库系统概论期末复习-CSDN博客 1.数据库系统(DBS)的组成&#…

第一篇:容器化的未来:从Docker的革命到云原生架构

容器化的未来:从Docker的革命到云原生架构 1. 引言 在当今快速演进的技术领域,容器化技术已经成为云计算和微服务架构的重要组成部分。该技术以其高效的资源利用率、快速的部署能力和卓越的隔离性能,彻底改变了软件开发和部署的方式。容器化…

【Pytorch】一文向您详细介绍 model.eval() 的作用和用法

【Pytorch】一文向您详细介绍 model.eval() 的作用和用法 下滑查看解决方法 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕…

深入浅出談 隐马尔可夫的概念(1/ 2)

文章目录 一、说明二、Markov Chain三、Introduction四、State Sequence五、Comment六、介绍隐藏式马可夫法则。七、隐藏马尔可夫Introduction八、结论 一、说明 在许多机器学习的章节中,常常遇见 HMM ,往往看到它的数学式子后,就当没看到似…

[Algorithm][贪心][K次取反后最大化的数组和][身高排序][优势洗牌][最长回文串]详细讲解

目录 1.K 次取反后最大化的数组和1.题目链接2.算法原理详解3.代码实现 2.身高排序1.题目链接2.算法原理详解3.代码实现 3.优势洗牌1.题目链接2.算法思路详解3.代码实现 4.最长回文串1.题目链接2.代码实现 1.K 次取反后最大化的数组和 1.题目链接 K 次取反后最大化的数组和 2.…

Qt状态机框架

概述 状态机框架提供了用于创建和执行状态图的类。这些概念和符号基于Harel的Statecharts:复杂系统的可视化形式(http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf),也是UML状态图的基础。状态机执行的语义基于状态图XML (SCXML)(http://…

Ms08067安全实验室成功实施多家业务系统渗透测试项目

点击星标,即时接收最新推文 近日,Ms08067安全实验室针对多家公司重要系统实施渗透测试项目。公司网络信息系统的业务应用和存储的重要信息资产均较多,存在网络系统结构的复杂性和庞杂等特点,使得公司网络信息系统面临一定风险。项…

如何打开pak文件-翻译pak语言包

最近碰到一些程序的语言包是pak格式,用Notepad打开全是乱码,百度搜索了一下,pak是一种少见的压缩文件格式,是pak Quake系列游戏所采用的一种特殊压缩包格式,由Quake游戏公司开发,用高版本的winrar可以打开&…

新能源汽车高压上电、高压下电逻辑分析

高压上电逻辑 新能源汽车的上电分为高压上电和低压上电,高压上电流程一般理解为高压件通电的过程,具体流程如下: 1、点火开关处于ON档时,仪表盘点亮,低压电接通。 2、VCU、BMS、MCU等控制模块依次被唤醒并开始进行自检…

【因果推断python】38_预测模型1

目录 工业界中的机器学习 之前的部分涵盖了因果推理的核心。那里的技术是众所周知和成熟的。他们经受住了时间的考验。第一部分建立了我们可以依赖的坚实基础。用更专业的术语来说,第一部分侧重于定义什么是因果推理,哪些偏差会阻止相关性成为因果关系&…

ffmpeg封装和解封装介绍-(10)综合完成视频重编码为h265,解封装解码编码再封装

主函数逐句解析: 由于代码太多我们只解析主函数,(其他封装函数见前面文章,同时用到了解码编码封装代码)。 初始化和参数处理 int main(int argc, char* argv[]) {/// 输入参数处理string useage "124_test_x…

[Vulnhub]Wintermute LFI+SMTP+Screen+Structv2-RCE+Lxc逃逸

概要 靶机 192.168.8.104 信息收集 $ nmap 192.168.8.103 --min-rate 1000 -sC -sV 结果: Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-15 05:54 EDT Nmap scan report for 192.168.8.103 (192.168.8.103) Host is up (0.035s latency). Not shown: 997 closed t…

docker 简单在线安装教程

1、配置阿里镜像源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 2、指定版本安装docker 本次制定安装 docker 服务版本、客户端版本都为: 19.03.14-3.el7 yum -y install docker-ce-19.03.14-3.e…

动态规划的递归写法和递推写法详解

目录 动态规划的概念 动态规划的递归写法 动态规划的递推写法 动态规划的概念 动态规划是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。需要注意的是&…

论文阅读笔记:Towards Higher Ranks via Adversarial Weight Pruning

论文阅读笔记:Towards Higher Ranks via Adversarial Weight Pruning 1 背景2 创新点3 方法4 模块4.1 问题表述4.2 分析高稀疏度下的权重剪枝4.3 通过SVD进行低秩逼近4.4 保持秩的对抗优化4.5 渐进式剪枝框架 5 效果5.1 和SOTA方法对比5.2 消融实验5.3 开销分析 6 结…

秋招突击——6/14——复习{(树形DP)树的最长路径,(单调队列优化DP)——最大子序和}——新作{四数之和}

文章目录 引言复习树形DP——树的最长路径实现代码答疑 单调队列优化DP——最大子序和个人实现思路参考思路分析实现代码 无重复最长字串思路分析实现代码 新作四数之和实现思路需要注意的问题 参考代码分析思路实现代码 总结 引言 今天好好看看树的最长的路径,自己…

《Deep learning practice》learning notes

学习笔记: 【公开课】旷视x北大《深度学习实践》(28课时全) R Talk | 旷视科技目标检测概述:Beyond RetinaNet and Mask R-CNN 文章目录 Lecture 1: Introduction to Computer Vision and Deep Learning(孙剑&#x…

apt-get update和apt-get upgrade的区别

apt-get update apt-get update 命令用于更新本地软件包列表。具体来说,做了以下事情: ①从 /etc/apt/sources.list 文件和 /etc/apt/sources.list.d/ 目录下的所有文件中读取软件源配置。 ②连接到这些软件源,并下载最新的软件包列表。 ③将…