基于x86_64汇编语言简单教程1: 环境预备与尝试

目录

前言

环境配置

基本硬件与操作系统要求

WSL + VSCode基本配置(For Windows)

安装基本的依赖

为您的VSCode安装插件:

学习要求

入门

先试试味道


前言

笔者最近正在梭哈使用NASM汇编器的x86 32位汇编,笔者这里记录一下一个晚上的成果。

环境配置

基本硬件与操作系统要求

如果您是Linux常客,或者已经有了WSL且使用VSCode SSH连接进行了一段时间的开发,只需要跳转道环境安装就OK。

WSL + VSCode基本配置(For Windows)

笔者主要是在Linux发行版下尝试汇编(原因是简单而又方便,屁事少),这里建议参考本人教程的同志们配一个WSL2。然后就可以开始coding了。

Preparing for the Assembly Coding:开始通过 WSL 使用 VS Code | Microsoft Learn

安装基本的依赖

好在NASM很轻量,几乎一瞬间就可以下载完成:

如果您是Ubuntu或者发行版使用apt管理

sudo apt install nasm # for Ubuntu or any Releases owns apt as the main package manager

或者您是Arch Linux膏首!

yay -Ss nasm    # do this if u r using yay

当然,您可以看看自己有没有GDB,这是我们用来调试您写的汇编程序的!

sudo apt install gdb ; download gdb if u r using apt 
yay -Ss gdb; download gdb if u r using yay

测试一下:

charliechen@Charliechen:~/demo/demo5$ nasm -v
NASM version 2.16.01
charliechen@Charliechen:~/demo/demo5$ gdb -v
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

为您的VSCode安装插件:

直接搜NASM,下载这个:

没了!现在,让我们做最后的检查:👇

学习要求

笔者需要假设您

  • 会使用基本的Linux命令行

  • 学习过至少一门高级编程语言,啊哈!如果是C,还很熟练那就更好了!

  • 有过GCC命令行编译的经历(不求经验,笔者自己就不咋地...

  • (Bonus!)会使用GDB调试您的程序!

  • (Great Bonus!)有过微机原理/ 计算机组成原理/操作系统 三门课程中至少一门的上课经验(貌似您不需要看这篇教程了)

我相信任何一个入门计算机最迟一年的各位看官都可以轻松胜任上面的任何一条要求。所以,满足上述条件,您可以开始汇编之旅了!

入门

先试试味道

笔者花费了,嗯,大概几分钟的时间为您写了一份Hello, World!

; --------------------------------------------------
;   Program written in 10.19 2024
;   Author:             Charlie chen
;   Functionality:      Print Hello, Assembly to the console 
; --------------------------------------------------
​
; 英文分号; 后的一行表达的是这一行是注释,汇编器自动jmp后面的内容当作空白 :|
​
; 这里存放数据!
section .data
    ; 下面定义的是一个字符串, 学习过高级编程语言(except C then :) )的都知道
    ; 字符串需要维护一个字符数组和长度
    ; 这里我们就是这样做的
    hello_string        db "Hello, Assembly!", 0xA
    hello_string_len    equ $ - hello_string
​
; 这里存放我们写的代码
section .text
    ; 告知汇编器: 请把_start符号向外面暴露!
    ; 这样,链接器就会找到这个符号解决undefined reference 
    global _start
​
; 开始我们的程序
_start:
    ; write(1, "Hello, Assembly!", sizeof(Hello, Assembly!));
    mov eax, 4                  ; SYS_WRITE
    mov ebx, 1                  ; stdout 的 file descripter
    mov ecx, hello_string       ; 字符串地址
    mov edx, hello_string_len   ; 打印字符的个数:这里我们选择全部打印
    int 0x80                    ; 发起128号中断
    ; Like exit(0) then huh? :>
    mov eax, 1                  ; SYS_EXIT
    mov ebx, 0                  ; 参数0表示正常退出
    int 0x80                    ; 发起128号中断

现在,请你掏出最喜欢的文本编辑器(笔者是VSCode),将上面的代码CV。然后记得保存 :)笔者保存的是test.asm

现在,你可以开始使用NASM汇编器开始你的表演:

nasm -g -f elf32 test.asm1 -o test.o

上面这个指令指挥NASM将test.asm汇编文件汇编成全部由机器指令构成的test.o文件。.o文件是一个relocatable的重定位文件。我们后面会谈到啥叫重定位,但不是现在 :)

  • -g : 生成详细的调试符号,您在发布您的程序给其他人使用的时候,如果对方只是使用您的程序,请去掉-g,您也不希望别人把你的程序一眼望穿 :)

  • -f : Format!什么格式呢?笔者的OS是Linux Kernel Releases的Ubuntu,那就需要ELF文件。我们的汇编是32位,遵循32位的文件格式!所以带上参数elf32,当然后面自己写64位汇编的时候就不用-f了,默认是elf64

  • -o:output is what? Oh! it''s test.o :)

现在请您ls一下您的文件夹

charliechen@Charliechen:~/demo/demo5$ ls
test.asm  test.o

非常好!但是我们仍然无法执行它!因为还没有使用链接器连接必要的文件(具体是啥?当然,是一些指挥操作系统分配的工作,你我写不来,请操作系统帮忙咯!)

ld -g -m elf_i386 -o test test.o

上面这个指令告知的是调用链接器连接文件:

-g:链接时继续保留连接调试信息

-m: 按照x86平台的方式进行连接,连接的是x86 32位文件

-o: 略

现在,您的文件夹下会有test汇编文件。执行它:

charliechen@Charliechen:~/demo/demo5$ ./hello 
Hello, Assembly!

啊哈!没有任何问题!恭喜你,你学会了。。。好吧,还远着,但是至少您现在是一个汇编程序员新手了!

这份文件的含义如何,到底做了什么,请听下回分解!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

chrome清除https状态

莫名其妙的http跳转到https的url了。 解决办法 浏览器地址栏输入&#xff1a;chrome://net-internals/#hsts 输入你需要删除的域名即可&#xff01;&#xff01;&#xff01;

工业级三防平板在工厂极端环境下保障稳定运行

在现代工业环境中&#xff0c;尤其是在工厂车间&#xff0c;设备和技术的稳定性直接关系到生产效率与产品质量。然而&#xff0c;极端的工作条件常常给电子设备的使用带来了不小的挑战。为此&#xff0c;市场上出现了一种专为工业应用设计大尺寸手持三防平板电脑。这种设备以其…

大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

空开老化损坏更换

如果预算充足&#xff0c;空开电流选择比常用工况多30%最佳&#xff0c;太大也没必要。 设备 空开一般质保一年到三年。 现象 这个空开用了三年多&#xff0c;最近跳闸越来越频繁。 这是相关人员安装的充分落实减负增效&#xff0c;工况和空开最大功率相一致&#xff0c;三年…

java基于SpringBoot+Vue+uniapp微信小程序的自助点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

使用短效IP池的优势是什么?

短效IP池作为代理IP服务中一种独特的资源管理方式&#xff0c;其应用已经在数据采集、市场分析和网络安全等多个领域中展示出强大的功能。尽管“短效”听起来似乎意味着某种限制&#xff0c;然而在某些特定的应用场景下&#xff0c;短效IP池却提供了无可比拟的优势。本文将详细…

Linux:Linux中第一个小程序_进度条

前言&#xff1a; 在日常生活中&#xff0c;我们下载软件&#xff0c;文件&#xff0c;都会都一个进度显示&#xff0c;来告知我们的下载进度&#xff0c;接下来我们可以自己手搓一个进度条&#xff0c;在我们自己写扫雷、贪吃蛇等小游戏时&#xff0c;可以做一个游戏加载进度使…

【Hive】6-Hive函数、运算符使用

Hive函数、运算符使用 Hive内置运算符 概述 整体上&#xff0c;Hive支持的运算符可以分为三大类&#xff1a;关系运算、算术运算、逻辑运算。 官方参考文档&#xff1a;https://cwiki.apache.org/confluence/display/Hive/LanguageManualUDF 也可以使用下述方式查看运算符的…

数控机械制造工厂ERP适用范围有哪些

在当今制造业高速发展的背景下&#xff0c;企业资源计划(ERP)系统已成为提升工厂管理效率、实现生产自动化与信息化的关键工具。特别是对于数控机械制造工厂而言&#xff0c;一个合适的ERP系统能够帮助其优化生产流程、提高产品质量、降低生产成本并增强市场竞争力。 1. 生产计…

Windows上安装Go并配置环境变量(图文步骤)

前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量&#xff1b; Go语言版本&#xff1a;1.23.2 Windows版本&#xff1a;win11&#xff08;win10通用&#xff09; 下载Go环境 下载go环境&#xff1a;Go下载官网链接(https://golang.google.cn/dl/) 等待…

Dokcer如何容器部署及常见问题

本文讲解通过Docker部署Jenkins过程及遇到的问题。 通过 Docker 部署 Jenkins 使用 Docker 来部署 Jenkins 是一个快速且高效的方式。以下是使用 Docker 部署 Jenkins 的分步骤指南&#xff1a; 1. 安装 Docker 如果你的系统上还没有安装 Docker&#xff0c;请根据操作系统…

VScode实现服务器免密登录(亲测有效)

目录 1 免密步骤1.1 在本地生成密钥1.2 在vscode中下载Remote-SSH1.3 配置SSH文件1.4 在服务器中添加本地公开密钥1.5 远程免密连接试验 2 后记 1 免密步骤 1.1 在本地生成密钥 window R打开命令面板 ssh-keygen1.2 在vscode中下载Remote-SSH 1.3 配置SSH文件 本地密钥的文…

快速查看平台信息脚本(完善中...)

前言&#xff1a; 在熟悉一个平台时&#xff0c;我们经常要去了解这个平台的一些信息&#xff0c;例如架构、CPU核心情况、线程数、用户、内存、磁盘等信息&#xff0c;所以我将这些命令汇总成脚本~方便查看。后面会持续更新&#xff0c;尽量从兼容以及实用地角度修改脚本.....…

JUC并发编程进阶2:CompletableFuture

1 Future接口理论知识复习 Future接口&#xff08;FutureTask实现类&#xff09;定义了操作异步任务执行一些方法&#xff0c;如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等 举例&#xff1a;比如主线程让一个子线程去执行任务…

基于SpringBoot+Vue+uniapp微信小程序的澡堂预订的微信小程序的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Java项目实战II基于Spring Boot的毕业就业信息管理系统设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着高校扩…

Python酷玩之旅_数据分析入门(matplotlib)

导览 前言matplotlib入门1. 简介1.1 Pairwise data1.2 Statistical distributions1.3 Gridded data1.4 Irregularly gridded data1.5 3D and volumetric data 2. 实践2.1 安装2.2 示例 结语系列回顾 前言 翻看日历&#xff0c;今年的日子已划到了2024年10月19日&#xff0c;今天…

【重学 MySQL】七十二、轻松掌握视图的创建与高效查看技巧

【重学 MySQL】七十二、轻松掌握视图的创建与高效查看技巧 创建视图查看视图注意事项 在MySQL数据库中&#xff0c;视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;它基于一个或多个表的数据计算生成结果集&#xff0c;但不存储实际的数据。视图可以简化复杂的查询、…

【OD】【E卷】【真题】【100分】光伏场地建设规划(PythonJavajavaScriptC++C)

题目描述 祖国西北部有一片大片荒地&#xff0c;其中零星的分布着一些湖泊&#xff0c;保护区&#xff0c;矿区; 整体上常年光照良好&#xff0c;但是也有一些地区光照不太好。 某电力公司希望在这里建设多个光伏电站&#xff0c;生产清洁能源对每平方公里的土地进行了发电评…

打印机出现线条和残影情况的主要原因和解决办法

本篇文章主要讲解&#xff0c;打印机出现打印文本&#xff0c;出现线条和残影情况时的解决办法和主要原因的详细解答和处理方法。 作者&#xff1a;任聪聪 日期&#xff1a;2024年10月19日 博客地址&#xff1a;https://rccblogs.com/604.html 打印现象&#xff1a; 说明&…