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

news2024/10/20 4:11:23

目录

前言

环境配置

基本硬件与操作系统要求

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!

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

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

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

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

相关文章

【含开题报告+文档+PPT+源码】贫困儿童一对一扶贫帮扶系统设计与实现

开题报告 根据《中华人民共和国慈善法》第五十八条规定&#xff0c;慈善组织确定慈善受益人&#xff0c;应当坚持公开、公平、公正的原则&#xff0c;不得指定慈善组织管理人员的利害关系人作为受益人[2]。以上所列举的平台基本没有做到公开、公平、公正的原则&#xff0c;例如…

一起搭WPF架构之livechart的MVVM使用介绍

一起搭WPF架构之livechart使用介绍 前言ModelViewModelView界面设计界面后端 效果总结 前言 简单的架构搭建已经快接近尾声了&#xff0c;考虑设计使用图表的形式将SQLite数据库中的数据展示出来。前期已经介绍了livechart的安装&#xff0c;今天就详细介绍一下livechart的使用…

应用层协议 序列化

自定义应用层协议 例子&#xff1a;网络版本计算器 序列化反序列化 序列化&#xff1a;将消息&#xff0c;昵称&#xff0c;日期整合成消息-昵称-日期 反序列化&#xff1a;消息-昵称-日期->消息&#xff0c;昵称&#xff0c;日期 在序列化中&#xff0c;定义一个结构体…

Python案例小练习——小计算器

文章目录 前言一、代码展示二、运行展示 前言 这是用python实现一个简单的计器。 一、代码展示 def calculate(num1, op, num2):if op "":return float(num1) float(num2)elif op "-":return float(num1) - float(num2)elif op "*":return…

案例分享-优秀蓝色系UI界面赏析

蓝色UI设计界面要提升舒适度&#xff0c;关键在于色彩搭配与对比度。选择柔和的蓝色调作为主色&#xff0c;搭配浅灰或白色作为辅助色&#xff0c;能营造清新、宁静的氛围。同时&#xff0c;确保文字与背景之间有足够的对比度&#xff0c;避免视觉疲劳&#xff0c;提升阅读体验…

利用 OBS 推送 WEBRTC 流到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…

新书速览|Android智能座舱开发:从源码到实践

《Android智能座舱开发:从源码到实践》 本书内容 《Android智能座舱开发:从源码到实践》是一本专注于Android智能座舱系统开发与优化的实战指南。《Android智能座舱开发:从源码到实践》共9章&#xff0c;第1章从搭建源码编译环境开始&#xff0c;详细指导读者如何下载和编译An…

前端SSR框架(Next、Nuxt)利用宝塔面板部署

1、部署的本质 SSR服务端渲染的框架部署区别于常规的CSR项目的部署&#xff0c;并不是打包之后访问某个文件就行&#xff0c;而是需要在服务器中运行项目之后访问某个地址&#xff0c;无论是基于Vue的Nuxt.js框架还是基于React的Next.js框架道理都是一样的 因此区别于CSR我们…

2024年中国工业大模型行业发展研究报告|附43页PDF文件下载

工业大模型伴随着大模型技术的发展&#xff0c;逐渐渗透至工业&#xff0c;处于萌芽阶段。 就大模型的本质而言&#xff0c;是由一系列参数化的数学函数组成的计算系统&#xff0c;且是一个概率模型&#xff0c;其工作机制是基于概率和统计推动进行的&#xff0c;而非真正的理解…

to_sql报错not all arguments converted during string formatting

报错&#xff1a; DatabaseError: Execution failed on sql SELECT name FROM sqlite_master WHERE typetable AND name?;: not all arguments converted during string formattingb 报错的代码如下&#xff1a; import pymysql import pandas as pd con pymysql.connect(…

如何测量场景的照度和色温?

1、问题背景 在我们平常的工作当中&#xff0c;经常都会使用照度计去测量当前场景的照度和色温&#xff0c;但测量时照度计具体该放在什么位置呢&#xff1f; 是和被测物体表面平行放置&#xff0c;还是和摄像头镜头位置平齐放置呢&#xff1f;本文将从照度、色温的概念出发&am…

ntfs MFT损坏(ntfs文件系统故障)导致oracle异常恢复---惜分飞

客户虚拟化环境,由于断电,启动数据库报ORA-01157错误,通过操作系统层面查看,发现文件是存在的,但是dbv检测报不可访问 感觉是文件系统损坏了,尝试把该文件拷贝到其他磁盘 查看操作系统事件,确认是ntfs文件系统的MFT损坏 基于这种情况,通过文件系统恢复工具进行恢复该文件…

【Java】Java 的反射机制(二):类的加载(拓展)

Java 的反射机制&#xff08;二&#xff09;&#xff1a;类的加载&#xff08;拓展&#xff09; 1.类的加载过程1.1 Java 内存分析1.2 类的加载过程1.3 类的加载与 ClassLoader 的理解1.4 什么时候会发生类的初始化 2.类加载器 1.类的加载过程 1.1 Java 内存分析 1.2 类的加载…

观测云 AI 助手上线:智能运维,从此触手可及!

在当前的云原生时代&#xff0c;运维的复杂性和数据的爆炸式增长给企业带来了前所未有的挑战。为了帮助企业高效应对这些挑战&#xff0c;观测云自豪地推出了 AI 助手——智能化的运维助手&#xff0c;让每位用户都能轻松驾驭复杂的可观测性场景。 01 你身边的 PE 助手&#x…

vs2022配置opencv静态库

本文将在windows10环境下&#xff0c;vs2022Cmake3.24.4编译opencv静态库&#xff0c;包括win32-release,win32-debug, x64-release, x64-debug四种&#xff1b; 文章内容有点长&#xff0c;请耐心看下去。 一、安装VS2022 下载链接&#xff1a;https://visualstudio.micros…

【设计模式系列】装饰器模式

目录 一、什么是装饰器模式 二、装饰器模式中的角色 三、装饰器模式的典型应用场景 四、装饰器模式在BufferedReader中的应用 一、什么是装饰器模式 装饰器模式是一种结构型设计模式&#xff0c;用于在不修改对象自身的基础上&#xff0c;通过创建一个或多个装饰类来给对象…

海南聚广众达电子商务咨询有限公司靠谱吗怎么样?

在当今这个数字化浪潮席卷全球的时代&#xff0c;抖音电商以其独特的魅力成为了众多商家争相入驻的新蓝海。而在这片浩瀚的电商海洋中&#xff0c;如何找到一家既专业又可靠的合作伙伴&#xff0c;成为了众多商家心中的一大难题。今天&#xff0c;我们就来深入剖析一下海南聚广…

模电基础(放大电路的频率响应+multisim)

目录 1.频率响应的基本概念 1.1频率响应的基本概念 1.1.1高通滤波器 1.1.2低通滤波器 1.1.3波特图 1.1.4multisim仿真 1.2晶体管高效等效模型 1.2.1晶体管的混合π模型 1.2.2晶体管电流放大倍数的频率响应 ​1.3单管放大电路的频率响应 1.3.1单管共射放大电路的频率响…

如何查看默认网关地址:详细步骤

在日常的网络配置与故障排查中&#xff0c;了解并正确查看默认网关地址是一项基础且至关重要的技能。默认网关是连接本地网络与外部网络&#xff08;如互联网&#xff09;的关键节点&#xff0c;它扮演着数据包转发的重要角色。无论是家庭网络、办公室网络还是更复杂的网络环境…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…