汇编基础之使用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…...

android system UI 基础的基础
Android 系统中的 SystemUI 是一种特殊的应用程序,它负责管理和显示设备的用户界面组件,例如状态栏、导航栏和最近任务列表等。SystemUI 是在 Android 启动过程中由 Zygote 进程启动的。以下是 SystemUI 启动过程的详细步骤: SystemUI 启动过…...

ARM32开发——GD32F4定时器查询
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录...

【机器学习】第7章 集成学习(小重点,混之前章节出题但小题)
一、概念 1.集成学习,顾名思义,不是一个玩意,而是一堆玩意混合到一块。 (1)基本思想是先 生成一定数量基学习器,再采用集成策略 将这堆基学习器的预测结果组合起来,从而形成最终结论。 &#x…...

代码随想录——子集Ⅱ(Leecode 90)
题目链接 回溯 class Solution {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> list new ArrayList<Integer>();boolean[] used; public List<List<Integer>> subsetsWithDup(int[] nums) {use…...

vue关闭页面时触发的函数(ai生成)
在Vue中,可以通过监听浏览器的beforeunload事件来在关闭页面前触发函数。这里是一个简单的示例: new Vue({el: #app,methods: {handleBeforeUnload(event) {// 设置returnValue属性以显示确认对话框event.returnValue 你确定要离开吗?;// 在…...

马尔可夫性质与Q学习在强化学习中的结合
马尔可夫性质是强化学习(RL)算法的基础,特别是在Q学习中。马尔可夫性质指出,系统的未来状态只依赖于当前状态,而与之前的状态序列无关。这一性质简化了学习最优策略的问题,因为它减少了状态转移的复杂性。 …...

【LeetCode 5.】 最长回文子串
一道题能否使用动态规划就在于判断最优结构是否是通过最优子结构推导得到?如果显然具备这个特性,那么就应该朝动态规划思考。如果令dp[i][j]表示串s[i:j1]是否是回文子串,那么判断dp[i][j] 是否是回文子串,相当于判断s[i] 与 s[j]…...

联邦学习周记|第四周
论文:Active Federated Learning 链接 将主动学习引入FL,每次随机抽几个Client拿来train,把置信值低的Client概率调大,就能少跑几次。 论文:Active learning based federated learning for waste and natural disast…...

机器学习课程复习——逻辑回归
1. 激活函数 Q:激活函数有哪些? SigmoidS型函数Tanh 双曲正切函数...

Rocky Linux 更换CN镜像地址
官方镜像列表,下拉查找 官方镜像列表:https://mirrors.rockylinux.org/mirrormanager/mirrorsCN 开头的站点。 一键更改镜像地址脚本 以下是更改从默认更改到阿里云地址 cat <<EOF>>/RackyLinux_Update_repo.sh #!/bin/bash # -*- codin…...