汇编基础之使用vscode写hello world
汇编语言(Assembly Language)
概述
汇编语言(Assembly Language)是一种低级编程语言,它直接对应于计算机的机器代码(machine code),但使用了更易读的文本符号。每台个人计算机都有一个微处理器,用于管理计算机的算术、逻辑和控制活动。每个处理器系列都有其自己的指令集,用于处理各种操作,例如从键盘获取输入、在屏幕上显示信息以及执行各种其他任务。这些指令集称为“机器语言指令”。处理器仅理解机器语言指令,这些指令是由1和0组成的字符串。然而,机器语言过于晦涩难懂,难以在软件开发中直接使用。因此,低级汇编语言应运而生,它为特定的处理器家族设计,以符号代码和更易理解的形式表示各种指令。学习汇编语言虽然困难,但它能提供对计算机系统的深刻理解,提升编程效率和低级编程技能,并在安全、逆向工程、调试、编译器开发等领域提供重要帮助。(◉3◉)
我这里使用的是kali linux,后续的操作可能不同的操作系统会不一样
汇编器(Assembler)
将汇编语言代码转换为机器码的工具。这就类似于python,nodejs,gcc将py,js,c转化为机器码。汇编语言是针对特定计算机体系结构的低级编程语言,而大多数高级编程语言通常可跨多个系统移植。
接下来,你需要选择一个汇编语言编译器(或汇编器)。常用的汇编器包括:
- NASM (Netwide Assembler)
- GAS (GNU Assembler)
- MASM (Microsoft Assembler) - Windows平台上使用
- FASM (Flat Assembler)
这里推荐使用NASM,支持linux和windows,免费并且在网上的教程比较多。
其他操作系统可根据网址自行下载nasm下载
sudo apt-get update
sudo apt-get install nasm
基础语法
1. 段(Section)
汇编程序通常分为三个主要部分,分别是数据段、代码段和栈段。段(Section)是程序的逻辑分区,用于组织代码和数据。每个段通常具有特定的用途,如存储代码、数据或堆栈。
注释
汇编语言注释以分号(;)开头。它可以包含任何可打印字符,包括空格。它可以单独出现在一行上
section .datahello db 'Hello, World!', 0 ; 已初始化的数据section .bssbuffer resb 64 ; 未初始化的数据section .textglobal _start_start:; 将 'Hello, World!' 输出到标准输出mov eax, 4 ; syscall number for sys_writemov ebx, 1 ; 文件描述符1是stdoutmov ecx, hello ; 指向消息的指针mov edx, 13 ; 消息长度int 0x80 ; 调用内核; 退出程序mov eax, 1 ; syscall number for sys_exitxor ebx, ebx ; 退出代码0int 0x80 ; 调用内核
1 .data 段
- 用途:存储已初始化的全局和静态变量。
- 特性:可读写段,程序可以在运行时修改该段的数据。
- 典型内容:字符串、已初始化的变量和常量。
2 .bss 段
- 用途:存储未初始化的全局和静态变量。
- 特性:该段在程序加载时被清零,因此初始值为0。
- 典型内容:未初始化的变量,通常在程序开始时被初始化。
3 .text 段
- 用途:存储程序的可执行代码。
- 特性:该段通常是只读的,防止在运行时意外修改代码。
- 典型内容:函数、指令和跳转标签。
hello db 'Hello, World!', 0:定义了一个名为 hello 的字节数组,存储字符串 "Hello, World!",以 null 字符(0)结尾。
global _start:定义 _start 为全局符号,使得链接器知道程序从 _start 标签开始执行。
_start::程序的入口点,汇编程序从这里开始执行
2. 指令(Instruction)
汇编语言中的指令是处理器执行的基本操作单元。每条指令通常由操作码和操作数组成。
mov eax, 1 ; 将立即数1加载到寄存器eax
add eax, ebx ; 将寄存器ebx的值加到eax
int 0x80 ; 触发中断0x80,调用内核功能
3. 寄存器(Register)
寄存器是CPU内部用于临时存储数据的高速存储器。常见的寄存器有通用寄存器(如eax、ebx、ecx、edx)、段寄存器(如ds、es、fs、gs)、指针寄存器(如esp、ebp)等。
4. 标签(Label)
标签用于标识程序中的位置,便于跳转和调用,标签以冒号结尾。如下的两个标签
_start:mov eax, 1jmp _exit_exit:mov eax, 60 ; 系统调用号(sys_exit)xor edi, edi ; 退出状态码0syscall
5.系统调用
在Linux系统中,汇编程序通常通过触发中断(如int 0x80)或使用syscall指令进行系统调用。
vscode配置
-
安装拓展:
在拓展搜索:NASM
如果你只需要语法高亮,可以选择 The Netwide Assembler (NASM) highlight 或 nasm x86 syntax highlighting。
如果你需要更多的语言支持和调试功能,可以选择 NASM Language Support 或 NASM X86 Assembly Language。
如果你希望集成编译和运行功能,可以选择 nasm-compiler-linux。
-
创建文件:
在 VSCode 中创建一个新的文件,命名为 hello.asm,并将之前的汇编代码粘贴进去。在上面哦
-
汇编代码:
在终端中,导航到包含 hello.asm 文件的目录,然后运行以下命令进行汇编:
1. nasm -f elf32 -o hello.o hello.asm
作用:使用 NASM(Netwide Assembler)编译汇编源文件 hello.asm 生成目标文件 hello.o。
nasm:调用 NASM 汇编器。-f elf32:指定生成的目标文件格式为 32 位 ELF(Executable and Linkable Format),这是 Linux 上常用的目标文件格式。-o hello.o:指定输出文件名为hello.o。hello.asm:输入的汇编源文件名。
2. ld -m elf_i386 -o hello hello.o
作用:使用链接器 ld 将目标文件 hello.o 链接成可执行文件 hello。
ld:调用链接器。-m elf_i386:指定链接的目标为 32 位 ELF 格式(即 i386 架构)。-o hello:指定输出文件名为hello。hello.o:输入的目标文件名。
3. ./hello
作用:运行生成的可执行文件 hello。
./hello:运行当前目录下的hello可执行文件。
nasm -f elf32 -o hello.o hello.asmld -m elf_i386 -o hello hello.o./hello
如图所示,完成这步就可以输出hello world了。但是这样每次输入都很麻烦

快捷配置
-
创建任务配置文件: 在 VSCode 中,按下
Ctrl+Shift+P,输入Tasks: Configure Task,选择Create tasks.json file from template,选择Others。 -
编辑
tasks.json文件: 将以下内容粘贴到tasks.json文件中:
{"version": "2.0.0","tasks": [{"label": "Build, Link and Run","type": "shell","command": "bash","args": ["-c","nasm -f elf32 -o ${fileDirname}/${fileBasenameNoExtension}.o ${file} && ld -m elf_i386 -o ${fileDirname}/${fileBasenameNoExtension} ${fileDirname}/${fileBasenameNoExtension}.o && ${fileDirname}/${fileBasenameNoExtension}"],"group": {"kind": "build","isDefault": true},"problemMatcher": []}]
}
说明
- label: 任务的标签,这里命名为 "Build, Link and Run"。
- type: 设置为 "shell",表示在 shell 中执行命令。
- command: 设置为 "bash",用于在 Linux 环境中执行一系列命令。
- args: 参数部分,这里使用
bash -c执行一连串的命令。包括编译、链接和运行三个步骤,使用&&确保每一步成功后才执行下一步。 - group: 配置任务组,这里将其设置为默认的构建任务。
按 Ctrl+Shift+B,选择 "Build, Link and Run" 任务来一键运行整个过程(我是按下后直接执行了的)。
这样,执行这个任务时,它会依次编译汇编代码、链接生成的目标文件并运行生成的可执行文件。
注意:这样做会生成.vscode,(像.git一样)管理这个文件夹下的文件,使用快捷命令会成功,但是使用别的文件夹没有做如上的配置快捷键是没有用的。注意每次都要配置好了
确保权限和路径正确
- 确保
nasm和ld命令在你的 PATH 环境变量中可用。 - 确保你的
.asm文件和生成的.o文件以及可执行文件具有正确的路径和权限。
相关文章:
汇编基础之使用vscode写hello world
汇编语言(Assembly Language) 概述 汇编语言(Assembly Language)是一种低级编程语言,它直接对应于计算机的机器代码(machine code),但使用了更易读的文本符号。每台个人计算机都有…...
APS计划排程系统如何打破装备使用约束
APS计划排程系统是离散制造型企业在计划控制方向的重要支撑,它提供的是交期预测、订单排产计划、物料采购计划、人力分配计划等等。近些几年来,多品种、小批量、多订单的生产模式,让企业的计划员应接不暇、疲累不堪,传统的人工经验…...
gigachad - suid
gigachadeasyftp利用、google反图搜索、 suid提权、s-nail 提权 主机发现 ┌──(kali㉿kali)-[~/桌面/OSCP] └─$ sudo netdiscover -i eth0 -r 192.168.44.138/24服务探测 ┌──(kali㉿kali)-[~/桌面/OSCP] └─$ sudo nmap -sV -A -T 4 -p- 192.168.44.138 |_/kingchad…...
QtScript模块
在Qt中,可以使用Qt Script模块来将C类和方法绑定到Qt脚本引擎中,从而使得可以在Qt脚本中调用这些C类和方法。以下是一个简单的示例,演示了如何在Qt中将C类暴露给Qt Script引擎: 假设有一个名为 MyClass 的C类,其头文件…...
qt中for循环不要使用循环中会更改的变量
检查代码,发现始终会少了一位,最后发现我在使用for循环时,懒省事,判断条件中使用的变量是涉及到循环体中更改的变量,代码如下,更直观 for (int i 0; i < m_images.size(); i) {packageToDBList[0].imag…...
spark独立集群搭建
spark独立集群搭建(不依赖Hadoop) 1、上传spark-2.4.5-bin-hadoop2.7.tgz至 /usr/local/moudel ,再解压到 /usr/local/soft tar -zxvf spark-2.4.5-bin-hadoop2.7.tgz -C /usr/local/soft/ 重命名 mv spark-2.4.5-bin-hadoop2.7/ spark-2.4.5 配…...
【BFS算法】广度搜索·由起点开始逐层向周围扩散求得最短路径(算法框架+题目)
0、前言 深度优先搜索是DFS(Depth Frst Search),其实就是前面所讲过的回溯算法,它的特点和它的名字一样,首先在一条路径上不断往下(深度)遍历,获得答案之后再返回,再继续往下遍历。…...
微信小程序---登录
手机号登录 手机号快速验证和手机号实时验证区别 手机号快速验证组件,平台会对号码进行验证,但不保证是实时验证;收费0.0.3元手机号实时验证组件,在每次请求时,平台均会对用户选择的手机号进行实时验证。收费0.0.4元…...
IPython大师课:提升数据科学工作效率的终极工具
IPython是一个增强的Python交互式shell,它提供了丰富的功能和易用性改进,特别适合进行数据分析、科学计算和一般的Python开发。本文将全面介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython最初由Fe…...
抖音素材网站平台有哪些?素材下载网站库分享
在这个视觉信息充斥的时代,抖音已经成为众多自媒体人展示才华的舞台。要在众多创作者中脱颖而出,不仅需要独特的创意,还需要优质的素材来支持你的内容制作。今天,我将介绍几个为抖音视频提供高品质素材的网站,包括国内…...
MODBUS TCP协议实例数据帧详细分析
MODBUS TCP协议实例数据帧详细分析 1.简介 2.ModbusTCP数据帧 2.1.报文头MBAP 2.2.帧结构PDU 3.ADU详细结构 3.1. 0x01:读线圈 3.2. 0x02:读离散量输入 3.3. 0x03:读保持寄存器 3.4. 0x04:读输入寄存器 3.5. 0x05:写单…...
Spring Boot启动与运行机制详解:初学者友好版
Spring Boot启动与运行机制详解:初学者友好版 随着微服务的兴起和容器化部署的流行,Spring Boot以其快速搭建、简单配置和自动化部署的特性,成为了众多开发者的首选。对于初学者而言,理解Spring Boot的启动与运行机制是掌握其精髓…...
Ubuntu 22.04 解决 firefox 中文界面乱码
问题复现 在为Ubuntu 22.04 Server安装完整的GNOME 42.01桌面后,将桌面语言设置为中文时,打开Firefox可能会出现中文乱码的问题。经过网上调查发现,这个问题是由Snap软件包引起的。 解决方案 为了避免在Ubuntu 22.04中文模式下的乱码问题…...
前端面试题日常练-day77 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 在Sass中,以下哪个功能用于将样式规则应用于多个选择器? a) extend b) mixin c) import d) include Sass中的嵌套规则(Nested Rules)有助于实现以下哪个…...
团队协同渗透测试报告输入输出平台部署
目录 简介 文章来源 部署环境 文件下载 开始安装 系统初始化 免责声明 结语 简介 因应监管部需求,国内访问Docker源pull镜像开始变得复杂且困难起来了,大佬github给的在线/离线安装脚本跑了很久也无法拉取到镜像,所以将以前的镜像打…...
vue3-父子通信
一个简单的vue3子组件调用父组件方法的demo <template> <div> <h2>Parent Component父组件</h2> <ChildComponent notify-parent"handleParentMethod" /> </div> </template> <script> import { ref } fr…...
微信小程序—页面滑动,获取可视区域数据
需求:页面有一列表,获取可视区域的数据;滑动过程中不处理,停止滑动后才获取。 实现原理:获取列表中每个条目的位置信息(元素顶部距可视区域顶部的距离),和可视区域比较,…...
C#语言进阶(一)—委托
总目录 C# 语法总目录 委托 委托1. 基本用法2.委托作为方法参数3.多播委托4.实例对象方法、静态方法与委托之间的关系5. 委托类型参数为泛型6. System空间下的 Func 委托和 Action 委托 委托 委托类似于CPP中的函数指针。它定义了一个方法类型,这个方法类型有返回类…...
VST3音频插件技术介绍
一.概述 1.VST3介绍 VST3(Virtual Studio Technology 3)是一种音频插件格式,由Steinberg公司开发,用于在数字音频工作站(DAW)中使用。VST3插件可以是模拟合成器、鼓机、混响器、压缩器等多种类型的音频处理…...
MySQL数据库管理 二
1、数据表高级操作 (1)克隆表 方法一: create table 新表名 like 旧表名; #克隆表结构 insert into 新表名 select * from 旧表名; #克隆表数据 #此方法能保证 新表的表结构、表数据 跟旧表都是一致的 方法二&#x…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
