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

server/2024/10/20 11:47:08/

目录

前言

环境配置

基本硬件与操作系统要求

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!", 0xAhello_string_len    equ $ - hello_string
​
; 这里存放我们写的代码
section .text; 告知汇编器: 请把_start符号向外面暴露!; 这样,链接器就会找到这个符号解决undefined reference global _start
​
; 开始我们的程序
_start:; write(1, "Hello, Assembly!", sizeof(Hello, Assembly!));mov eax, 4                  ; SYS_WRITEmov ebx, 1                  ; stdout 的 file descriptermov ecx, hello_string       ; 字符串地址mov edx, hello_string_len   ; 打印字符的个数:这里我们选择全部打印int 0x80                    ; 发起128号中断; Like exit(0) then huh? :>mov eax, 1                  ; SYS_EXITmov 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!

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

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


http://www.ppmy.cn/server/133328.html

相关文章

Java爬虫:获取商品评论数据的高效工具

在电子商务的激烈竞争中&#xff0c;商品评论作为消费者购买决策的重要参考&#xff0c;对于商家来说具有极高的价值。它不仅能够帮助商家了解消费者的需求和反馈&#xff0c;还能作为改进产品和服务的依据。Java爬虫技术&#xff0c;以其稳健性和高效性&#xff0c;成为了获取…

探索 Python Web 开发:从框架到爬虫

Python 是 Web 开发中广泛使用的编程语言&#xff0c;因其简单、灵活和强大的生态系统&#xff0c;适合构建各种类型的 Web 应用和 API。在本篇博客中&#xff0c;我们将讨论 Web 开发的几个重要主题&#xff0c;包括 Flask 和 Django 框架、API 开发、HTTP 请求处理以及网页爬…

Python支持向量机(SVM)算法:面向对象的实现与案例详解

目录 Python支持向量机&#xff08;SVM&#xff09;算法&#xff1a;面向对象的实现与案例详解引言一、支持向量机算法概述1.1 支持向量机的基本思想1.2 SVM的分类问题1.3 SVM的优化目标 二、面向对象的SVM实现2.1 类的设计2.2 Python代码实现2.3 代码详解 三、案例分析3.1 案例…

计算机毕业设计Spark+大模型高考分数线预测 知识图谱高考志愿推荐系统 高考数据分析可视化 高考大数据 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 使用vuespringboot前后端分…

985研一学习日记 - 2024.10.16

一个人内耗&#xff0c;说明他活在过去&#xff1b;一个人焦虑&#xff0c;说明他活在未来。只有当一个人平静时&#xff0c;他才活在现在。 日常 1、起床6:00√ 2、健身1个多小时 今天练了二头和背部&#xff0c;明天练胸和三头 3、LeetCode刷了3题 旋转图像&#xff1a…

CollageController

目录 1、 CollageController 1.1、 保存领料主页面 1.1.1、 //审核人 1.1.2、 //审核时间 1.1.3、 //需要删除的ID集合 1.1.4、 //库存表 1.1.5、 //查询原来明细信息 1.1.6、 //修改配件表数量 1.1.7、 //修改配件表数量 1.1.8、 //查询原来明细信息 1.1…

区块链技术原理

1. 引言 区块链的定义 区块链是一种分布式账本技术&#xff08;Distributed Ledger Technology&#xff0c;DLT&#xff09;&#xff0c;其核心特征是通过密码学的方式将数据打包成一个个区块&#xff0c;按时间顺序依次相连&#xff0c;形成一个不可篡改、公开透明的链式数据…

数据结构-贪心算法笔记

前言&#xff1a;贪心无套路&#xff0c;狠狠刷就完事 分发饼干 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; class Solution {/*** 找出最多有多少个孩子可以得到糖果。** param g 一个数组&#xff0c;表示每个孩子对糖果大小的满意度。* param s 一个数组&…