汇编基础之使用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 文件以及可执行文件具有正确的路径和权限。

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

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

相关文章

iOS 18 Siri 升级之后都有哪些改变?

新界面 首先最显著的改变就是 Siri 的界面不同了,之前的界面是在打开 Siri 之后会出现一个圆形图案,而在 Siri 升级之后变成了屏幕边缘发出亮光。 来源:Apple 可在任意位置使用 苹果的生成式人工智能 Apple Intelligence 将为 Siri 提供支…

注意力机制和Transformer模型各部分功能解释

文章目录 Transformer1、各部分功能解释2、通过例子解释a.输入预处理位置编码b.Encoder 的处理c.Decoder的输入Decoder的工作流程d.输出预测总结 Attention代码和原理理解 Transformer 运行机理: (1)假设我们需要进行文本生成任务。我们将已…

Springboot集成SSE消息推送

SSE介绍 SSE(Server-Sent Events)的全称是服务器推送事件,它是一种基于 HTTP 协议的实时通信技术,用于在客户端和服务器之间建立持久、单向的链接,允许服务器向客户端发送异步消息。 了解 websocket 的小伙伴&…

SAP BC 换了logo后,其他人的logo都已经换了,但是其中有一台就是PRD 显示DEV的logo,从smw0上下载的是PRD

昨天终于发现是缓存的问题 GUI登录后 选项-本地数据-缓存 删除本地缓存文件,问题解决了

机器学习课程复习——聚类算法

Q:什么是硬聚类,什么是软聚类? 如果一个样本只能属于一个类,则称为硬聚类(hard clustering); 如果一个样本可以属于多个类,则称为软聚类(soft clustering)。 Q:聚类和分类的区别? 聚类分类学习类型无监督学习方法 不需要事先标记的数据 通过发现数据中的模式或结构来组…

sprintboot依赖管理和自动配置

springboot依赖管理和自动配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starter场景启动器基本介绍官方提供的starter第三方starter 自动配置自动配置基本介绍SpringBoot自动配置了哪些?如何修改默认配置如何修改默认扫描包结构re…

深入解析 iOS 应用启动过程:main() 函数前的四大步骤

深入解析 iOS 应用启动过程:main() 函数前的四大步骤 背景描述:使用 Objective-C 开发的 iOS 或者 MacOS 应用 在开发 iOS 应用时,我们通常会关注 main() 函数及其之后的执行逻辑,但在 main() 函数之前,系统已经为我们…

C++及cmake语法介绍

c/cmake学习 文章目录 c/cmake学习1. c1.1 基本模型1.1.1 for循环1.1.2 main函数1.1.2 带参数函数编译函数 2. CMAKE2.1 相关命令2.1.1 编译基本命令2.1.2 动态库静态库编译2.1.3 消息输出2.1.4 cmake变量常见参数1. 设置构建类型2. 设置编译器标志3. 指定编译器4. 设置安装路径…

机器学习_PCA

目录 一、概念 二、原理 三、步骤 四、实战 1、数据处理——转rgb为灰度图像 2、手动实现pca降维 3、查看信息保留数量 4、调用第三方库实现pca降维 五、小结 引入: 当说黄河五路和渤海三路交叉口的时候,这些路就类似于我们说的坐标系。而城市中的…

高等数学笔记(三):导数

一、导数概念 1.1 导数的定义 1.1.1 函数在一点处的导数与导函数 1.1.2 单侧导数 1.2 导数的几何意义 1.3 函数可导性与连续性的关系 二、函数的求导法则 2.1 函数的和、差、积、商的求导法则 2.2 反函数的求导法则 2.3 复合函数的求导法则 2.4 基本求导法则与导数公式 三…

必看!!! 2024 最新 PG 硬核干货大盘点(上)

PGConf.dev(原名PGCon,从2007年至2023年)首次在风景如画的加拿大温哥华市举办。此次重新定位的会议带来了全新的视角和多项新的内容,参会体验再次升级。尽管 PGCon 历来更侧重于开发者,吸引来自世界各地的资深开发者、…

深入理解并打败C语言难关之一————指针(5)(最终篇)

前言: 仔细一想,小编已经把指针的大部分内容都说了一遍了,小编目前有点灵感枯竭了,今天决定就结束指针这一大山,可能很多小编并没有提到过,如果有些没说的小编会在后续博客进行补充道,不多废话了…

服务器数据恢复—NTFS文件系统下双循环riad5数据恢复案例

服务器存储数据恢复环境: EMC CX4-480存储,该存储中有10块硬盘,其中有3块磁盘为掉线磁盘,另外7块磁盘组成一组RAID5磁盘阵列。运维人员在处理掉线磁盘时只添加新的硬盘做rebuild,并没有将掉线的硬盘拔掉,所…

ARCGIS 如何对河流等线条图形进行Smooth处理——具有多个断点高阶版

1.线转点折点(注意!很重要,不是线转点) 2.点转线步骤 ## 3 线的融合 2.1 新建Filed 》短精度类型》利用选择工具的 线文件。全选同一条河流点,进入Tabel的选择界面。给同一条河赋值同一个值。 大功告成!…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及多类型储能调频容量动态申报的电能量与调频市场联合出清方法研究》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

深入探究RTOS的任务调度

阅读引言: 此文将会从一个工程文件, 一步一步的分析RTOS的任务调度实现, 这里选用FreeRTOS分析, 别的也差不多的, 可能在细节上有少许不一样。 目录 1, 常见嵌入式实时操作系统 2, 任务调度的…

【机器学习】第11章 神经网络与深度学习(重中之重)

一、概念 1.神经元模型 (1)神经网络的基本组成单位 (2)生物上,每个神经元通过树突接受来自其他被激活神经元的信息,通过轴突释放出来的化学递质改变当前神经元内的电位。当神经元内的电位累计到一个水平时…

Kubernetes Dashboard

Dashboard Dashboard 的项目网站,可以查看说明文档和基本的使用情况。 下载yaml wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml注意需要修改镜像,不然可能会拉去不下来镜像 cat recommended.yaml…

人工智能--自然语言处理NLP概述

欢迎来到 Papicatch的博客 目录 🍉引言 🍈基本概念 🍈核心技术 🍈常用模型和方法 🍈应用领域 🍈挑战和未来发展 🍉案例分析 🍈机器翻译中的BERT模型 🍈情感分析在…

函数(下) C语言

函数下 嵌套调用和链式访问1. 嵌套调用2. 链式访问 函数的声明和定义1. 单个文件2. 多个文件3. static 和 extern3.1 static 嵌套调用和链式访问 1. 嵌套调用 嵌套调用就是函数之间的互相调用,每个函数就像⼀个乐高零件,正是因为多个乐高的零件互相无缝…