汇编基础之使用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…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)
经过前面几期的内容我们学习了很多网络安全的知识,而这期内容就涉及到了前面的第六期-RCE模块,第七期-File inclusion模块,第八期-Unsafe Filedownload模块。 什么是"遍历"呢:对学过一些开发语言的朋友来说应该知道&…...
MyBatis-Plus 常用条件构造方法
1.常用条件方法 方法 说明eq等于 ne不等于 <>gt大于 >ge大于等于 >lt小于 <le小于等于 <betweenBETWEEN 值1 AND 值2notBetweenNOT BETWEEN 值1 AND 值2likeLIKE %值%notLikeNOT LIKE %值%likeLeftLIKE %值likeRightLIKE 值%isNull字段 IS NULLisNotNull字段…...
