当前位置: 首页 > news >正文

汇编基础之使用vscode写hello world

汇编语言(Assembly Language)

概述

汇编语言(Assembly Language)是一种低级编程语言,它直接对应于计算机的机器代码(machine code),但使用了更易读的文本符号。每台个人计算机都有一个微处理器,用于管理计算机的算术、逻辑和控制活动。每个处理器系列都有其自己的指令集,用于处理各种操作,例如从键盘获取输入、在屏幕上显示信息以及执行各种其他任务。这些指令集称为“机器语言指令”。处理器仅理解机器语言指令,这些指令是由1和0组成的字符串。然而,机器语言过于晦涩难懂,难以在软件开发中直接使用。因此,低级汇编语言应运而生,它为特定的处理器家族设计,以符号代码和更易理解的形式表示各种指令。学习汇编语言虽然困难,但它能提供对计算机系统的深刻理解,提升编程效率和低级编程技能,并在安全、逆向工程、调试、编译器开发等领域提供重要帮助。(◉3◉)

我这里使用的是kali linux,后续的操作可能不同的操作系统会不一样

汇编器(Assembler)

将汇编语言代码转换为机器码的工具。这就类似于python,nodejs,gcc将py,js,c转化为机器码。汇编语言是针对特定计算机体系结构的低级编程语言,而大多数高级编程语言通常可跨多个系统移植。

接下来,你需要选择一个汇编语言编译器(或汇编器)。常用的汇编器包括:

  1. NASM (Netwide Assembler)
  2. GAS (GNU Assembler)
  3. MASM (Microsoft Assembler) - Windows平台上使用
  4. 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) highlightnasm x86 syntax highlighting

如果你需要更多的语言支持和调试功能,可以选择 NASM Language SupportNASM 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一样)管理这个文件夹下的文件,使用快捷命令会成功,但是使用别的文件夹没有做如上的配置快捷键是没有用的。注意每次都要配置好了

确保权限和路径正确

  • 确保 nasmld 命令在你的 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循环不要使用循环中会更改的变量

检查代码&#xff0c;发现始终会少了一位&#xff0c;最后发现我在使用for循环时&#xff0c;懒省事&#xff0c;判断条件中使用的变量是涉及到循环体中更改的变量&#xff0c;代码如下&#xff0c;更直观 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 &#xff0c;再解压到 /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&#xff08;Depth Frst Search)&#xff0c;其实就是前面所讲过的回溯算法&#xff0c;它的特点和它的名字一样&#xff0c;首先在一条路径上不断往下&#xff08;深度&#xff09;遍历&#xff0c;获得答案之后再返回&#xff0c;再继续往下遍历。…...

微信小程序---登录

手机号登录 手机号快速验证和手机号实时验证区别 手机号快速验证组件&#xff0c;平台会对号码进行验证&#xff0c;但不保证是实时验证&#xff1b;收费0.0.3元手机号实时验证组件&#xff0c;在每次请求时&#xff0c;平台均会对用户选择的手机号进行实时验证。收费0.0.4元…...

IPython大师课:提升数据科学工作效率的终极工具

IPython是一个增强的Python交互式shell&#xff0c;它提供了丰富的功能和易用性改进&#xff0c;特别适合进行数据分析、科学计算和一般的Python开发。本文将全面介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython最初由Fe…...

抖音素材网站平台有哪些?素材下载网站库分享

在这个视觉信息充斥的时代&#xff0c;抖音已经成为众多自媒体人展示才华的舞台。要在众多创作者中脱颖而出&#xff0c;不仅需要独特的创意&#xff0c;还需要优质的素材来支持你的内容制作。今天&#xff0c;我将介绍几个为抖音视频提供高品质素材的网站&#xff0c;包括国内…...

MODBUS TCP协议实例数据帧详细分析

MODBUS TCP协议实例数据帧详细分析 1.简介 2.ModbusTCP数据帧 2.1.报文头MBAP 2.2.帧结构PDU 3.ADU详细结构 3.1. 0x01&#xff1a;读线圈 3.2. 0x02&#xff1a;读离散量输入 3.3. 0x03&#xff1a;读保持寄存器 3.4. 0x04&#xff1a;读输入寄存器 3.5. 0x05&#xff1a;写单…...

Spring Boot启动与运行机制详解:初学者友好版

Spring Boot启动与运行机制详解&#xff1a;初学者友好版 随着微服务的兴起和容器化部署的流行&#xff0c;Spring Boot以其快速搭建、简单配置和自动化部署的特性&#xff0c;成为了众多开发者的首选。对于初学者而言&#xff0c;理解Spring Boot的启动与运行机制是掌握其精髓…...

Ubuntu 22.04 解决 firefox 中文界面乱码

问题复现 在为Ubuntu 22.04 Server安装完整的GNOME 42.01桌面后&#xff0c;将桌面语言设置为中文时&#xff0c;打开Firefox可能会出现中文乱码的问题。经过网上调查发现&#xff0c;这个问题是由Snap软件包引起的。 解决方案 为了避免在Ubuntu 22.04中文模式下的乱码问题…...

前端面试题日常练-day77 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 在Sass中&#xff0c;以下哪个功能用于将样式规则应用于多个选择器&#xff1f; a) extend b) mixin c) import d) include Sass中的嵌套规则&#xff08;Nested Rules&#xff09;有助于实现以下哪个…...

团队协同渗透测试报告输入输出平台部署

目录 简介 文章来源 部署环境 文件下载 开始安装 系统初始化 免责声明 结语 简介 因应监管部需求&#xff0c;国内访问Docker源pull镜像开始变得复杂且困难起来了&#xff0c;大佬github给的在线/离线安装脚本跑了很久也无法拉取到镜像&#xff0c;所以将以前的镜像打…...

vue3-父子通信

一个简单的vue3子组件调用父组件方法的demo <template> <div> <h2>Parent Component父组件</h2> <ChildComponent notify-parent"handleParentMethod" /> </div> </template> <script> import { ref } fr…...

微信小程序—页面滑动,获取可视区域数据

需求&#xff1a;页面有一列表&#xff0c;获取可视区域的数据&#xff1b;滑动过程中不处理&#xff0c;停止滑动后才获取。 实现原理&#xff1a;获取列表中每个条目的位置信息&#xff08;元素顶部距可视区域顶部的距离&#xff09;&#xff0c;和可视区域比较&#xff0c;…...

C#语言进阶(一)—委托

总目录 C# 语法总目录 委托 委托1. 基本用法2.委托作为方法参数3.多播委托4.实例对象方法、静态方法与委托之间的关系5. 委托类型参数为泛型6. System空间下的 Func 委托和 Action 委托 委托 委托类似于CPP中的函数指针。它定义了一个方法类型&#xff0c;这个方法类型有返回类…...

VST3音频插件技术介绍

一.概述 1.VST3介绍 VST3&#xff08;Virtual Studio Technology 3&#xff09;是一种音频插件格式&#xff0c;由Steinberg公司开发&#xff0c;用于在数字音频工作站&#xff08;DAW&#xff09;中使用。VST3插件可以是模拟合成器、鼓机、混响器、压缩器等多种类型的音频处理…...

MySQL数据库管理 二

1、数据表高级操作 &#xff08;1&#xff09;克隆表 方法一&#xff1a; create table 新表名 like 旧表名; #克隆表结构 insert into 新表名 select * from 旧表名; #克隆表数据 #此方法能保证 新表的表结构、表数据 跟旧表都是一致的 方法二&#x…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...