asm: 实现打印“Hello, world!“

news2024/11/15 18:27:54

使用汇编打印“Hello, world!“

  • 实现打印"Hello, world!"的汇编代码
  • 代码详细剖析

实现打印"Hello, world!"的汇编代码

我们来直接贴代码

section    .text
   global _start
_start:
   mov    edx,len
   mov    ecx,msg
   mov    ebx,1
   mov    eax,4 
   int    0x80
   mov    eax,1
   int    0x80
section    .data
msg db 'Hello, world!', 0xa
len equ $ - msg

编译及执行如下:
在这里插入图片描述

代码详细剖析

每一行代码的详细解释如下:

section .text

指定了一个.text段,该段用于存放程序的代码。

global _start

定义了全局符号 _start,它是程序的入口点,告诉链接器(ld)需要将该程序的起始点作为可执行文件的入口地址。

_start:

标记了程序的入口点,告诉链接器这里是程序的起始位置。

mov edx,len

将要输出的字符串的长度 len 存储在寄存器 edx 中。

mov ecx,msg

将要输出的字符串的内存地址 msg 存储在寄存器 ecx 中。

mov ebx,1

将要使用的文件描述符 stdout 的编号 1 存储在寄存器 ebx 中。

mov eax,4

将系统调用号 sys_write 的编号 4 存储在寄存器 eax 中。
write 系统调用的参数分别存储在 edx、ecx 和 ebx 寄存器中,具体来说:

  • 将字符串长度 len 存储在 edx 中。
  • 将字符串地址 msg 存储在 ecx 中。
  • 将文件描述符 1(即标准输出)存储在 ebx 中。
int 0x80

int 0x80用于在 Linux 和其他基于 x86 架构的操作系统中调用内核功能。它可以将 CPU 控制权从用户空间切换到内核空间,以执行一些特权级别较高的操作,例如读写文件、网络通信、进程管理等。

具体来说,当进程需要执行系统调用时,通常会将相应的系统调用号存储在 EAX 寄存器中,然后使用 int 0x80 指令触发中断,使 CPU 转到内核态。在内核态下,内核会根据 EAX 中存储的系统调用号执行相应的操作,并将结果返回给用户空间。

在早期的 Linux 内核版本中,int 0x80 指令是唯一的系统调用方式。随着时间的推移,Linux 内核引入了更加高效的系统调用方式,如使用 syscall 指令,但仍保留了 int 0x80 方式,以便向后兼容旧版应用程序。

总之,int 0x80 是一种在 x86 架构上实现的系统调用方式,可以使进程在用户态和内核态之间切换,以执行各种系统级别的操作。

mov eax,1

将系统调用号 sys_exit 的编号 1 存储在寄存器 eax 中。

int 0x80

再次调用中断 0x80,退出程序。

section .data

指定了一个.data段,该段用于存放程序的数据。

msg db 'Hello, world!', 0xa

定义了一个以 0xa(即 ‘\n’)结尾的字符串 “Hello, world!”,并将其存储在名为 msg 的标签中。

具体来说,db 是一个伪指令,用于告诉汇编器将后面的数据按字节存储到内存中。在这里,msg 被定义为一个字符数组,包含文本字符串 “Hello, world!” 和一个换行符(\n)。最后的 0xa 表示字符串的结束,即 NULL 终止符。整个 msg 数组所占用的字节数是 14。

常见的汇编器使用 syntax 语句来控制汇编语言的风格和表示方法。在 AT&T 语法中,字符串通常用单引号括起来,且字符串末尾不需要显式添加 NULL 终止符。而在 Intel 语法中,字符串通常用双引号括起,并且必须显式添加 NULL 终止符。

len equ $ - msg

用于计算字符串 msg 的长度。

$ 符号表示当前位置(即当前指令的地址),因此,$ - msg 表示当前位置减去 msg 的地址,得到的结果就是字符串的长度。

equ 是一个伪指令,.用于定义一个符号常量。符号常量类似于 C 语言中的 #define 常量,可以用来代替数字或字符串等常量。在这里,len 被定义为一个常量,它的值等于 $ - msg,也就是字符串的长度。

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

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

相关文章

pytest 通过装饰器获取测试case的断言失败结果

test11.py import logging from functools import wrapsdef log_exceptions(func):wraps(func)def wrapper(*args, **kwargs):# 创建日志记录器logger logging.getLogger(func.__name__)logger.setLevel(logging.ERROR)# 创建文件处理器file_handler logging.FileHandler(er…

MySQL(五)缓存策略

MySQL系列文章 MySQL(一)基本架构、SQL语句操作、试图 MySQL(二)索引原理以及优化 MySQL(三)SQL优化、Buffer pool、Change buffer MySQL(四)事务原理及分析 MySQL(五&a…

利用pgloader工具将MySQL数据迁移至PostgreSQL数据库

一、简介 pgloader是一款开源软件,可以将各种来源的数据加载到PostgreSQL数据库中,支持动态读取数据,使用 COPY 流式传输协议将数据加载到 PostgreSQL 数据库中,并使用单独的线程读取和写入数据,由于能够直接从源数据库加载数据。…

1771_Windows下格式化Linux硬盘

全部学习汇总: GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 我自己使用Linux系统多年,但是对于很多操作系统相关的知识我其实并不是很了解。我当初之所以使用Linux一是因为这个系统能够提供给我所有想要的工…

Unity游戏源码分享-Unity手游射击横版游戏

Unity游戏源码分享-Unity手游射击横版游戏 战斗场景 项目地址: https://download.csdn.net/download/Highning0007/88050256

Deployment:让应用永不宕机

“Deployment”,顾名思义,它是专门用来部署应用程序的,能够让应用永不宕机,多用来发布无状态的应用,是 Kubernetes 里最常用也是最有用的一个对象。 Deployment 的关键字段:先看 replicas 字段。它的含义比…

在Vitis IDE中使用第三方库 libtiff 保存 tiff 文件

目的和思路 一个Vitis IDE 裸机项目,需要将视频帧无损地保存下来 由于每帧的像素数据是 16bit 1通道的 bayer 格式,满足这一需求的图像格式似乎只有 tiff 格式 开源的tiff 库是 libtiff,而在 Vitis IDE 裸机项目中要使用的话就需要交叉编译…

AD22软件系统参数的一些基本设置

AD22软件系统参数设置 SystemData managementSchematicPCB Editor System Data management Schematic PCB Editor

集群基础5——keepalived对apache高可用

文章目录 一、基本了解二、配置文件参数释义2.1 默认配置文件2.2 定制配置文件2.2.1 vrrp_instance段配置参数2.2.2 vrrp_script段配置参数2.2.3 real_server段配置参数2.2.4 tcp_check段配置参数 三、keepalived对apache高可用3.1 环境说明3.2 安装服务3.3 配置主服务器3.4 配…

前端编码规范

prettier 配置 1. vscode 安装prettier 的 插件 2. 新建 .prettierrc 文件 {"semi": false, // 不尾随分号"singleQuote": true, // 使用单引号"trailingComma": "none" // 多行逗号分隔的语法,最后一行不加逗号 }eslin…

orbslam3 生成标定板rosrun kalibr kalibr_create_target_pdf --type

rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.08 --tspace 0.3小师妹要做相机视觉标定,需要制作棋盘格,无奈其电脑有些卡,对此毫无经验的博主从头开始安装(此前博主已经安装了ROS环境&#x…

精品个人或团队引导页网站HTML源码_好看大气

2023全新宽屏大气好看团队个人指导页网站HTML源码,带音乐视频mv,源码比较小,只有七兆,就因为一个MV占了十几兆。源码也很漂亮,但是有个缺点就是没有手机适配,只能PC浏览器正常显示,手机不能完全…

“探索图像处理的奥秘:使用Python和OpenCV进行图像和视频处理“

1、上传图片移除背景后下载。在线抠图软件_图片去除背景 | remove.bg – remove.bg 2、对下载的图片放大2倍。ClipDrop - Image upscaler 3、对放大后的下载照片进行编辑。 4、使用deepfacelive进行换脸。 1)将第三步的照片复制到指定文件夹。C:\myApp\deepfakeliv…

Java 设计模式——模板方法模式

目录 1.概述2.结构3.案例实现3.1.抽象类3.2.具体子类3.3.测试 4.优缺点5.使用场景6.JDK 源码解析6.1.InputStream6.2.AbstractQueuedSynchronizer 1.概述 (1)在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知…

【代码随想录 | Leetcode | 第三天】数组 | 滑动窗口 | 209

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来滑动窗口的分享✨ 目录 前言209. 长度最小的子数组总结 209. 长度最小的子数组 ✨题目链接点这里 给定一个含有 n 个正整数的数组和一个正整数target。找出该数组中满足其和 ≥ target 的长度…

docker在arm64架构ubuntu系统的安装

卸载可能存在的旧版本 sudo apt remove docker docker-engine docker-ce docker-io安装依赖使apt可通过HTTPS下载包 sudo apt update && apt install -y apt-tranport-https ca-certificates curl software-properties-commonapt-transport-https用于支持通过HTTPS协…

如何设计光场2.0(聚焦型光场相机)系统参数

1. 系统参数设计 目前的硬件系统的现状:主透镜50mm,MLA:15*15,d0.5mm,f15mm,s4.8um 开普勒型光场系统: 首先我们需要确定系统的M,M参数表示单个位置的点能被多少个小微透镜成像&am…

C++【哈希表的完善及封装】

✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 🌇前言🏙️正文1、哈希表的完善1.1、拷贝与赋值1.2、优化:哈希函数1.3、优化&am…

带你快速了解字符(串)函数

​ ⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 💖 持续更文,谢谢大家支持 💖 文章目录 本文重点1. strlen函数1.1 模拟实现 2. strcpy函数2.1 模拟实现 3. strcat函数3.1 模拟实现 4. strcmp函…

基于linux下的高并发服务器开发(第一章)- 目录遍历函数

10 / 目录遍历函数 // 打开一个目录 #include <sys/types.h> #include <dirent.h>DIR *opendir(const char *name); 参数&#xff1a; - name: 需要打开的目录的名称 返回值&#xff1a; DIR * 类型&#xff0c;理解为目录流 错误…