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

基于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!

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

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


http://www.kler.cn/news/356503.html

相关文章:

  • 25计软新增考研院校!或可捡漏上岸!
  • 「C++」内存管理
  • linux centos7系统ARM架构下安装最新版docker 27.3.1及docker-compose v2.3.4
  • 【ESP32】Arduino开发 | LED PWM控制器+呼吸灯例程
  • 《重置MobaXterm密码并连接Linux虚拟机的完整操作指南》
  • C++类域访问方式(public,protected,private)对象访问 , 通过成员函数访问 ,通过友元函数访问
  • 从新手到高手:Spring AOP的进阶指南
  • 安防综合管理系统EasyCVR视频汇聚平台Linux环境下如何测试UDP端口是否正常开启?
  • 打印机出现线条和残影情况的主要原因和解决办法
  • 项目管理APP推荐_功能对比与用户评价
  • An.如何在an中截取音频片段
  • .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用
  • C++ 算法学习——1.3 双向深度优先搜索
  • 将一个单向链表插入到一个循环链表尾部
  • vue element upload取消上传后终止请求
  • 滑铁卢大学大模型公开课资料来了,大模型入门到精通,非常详细收藏我这一篇就够了
  • OpenCV之换脸技术:一场面部识别的奇妙之旅
  • PHP 函数 func_num_args() 的作用
  • spring boot 集成 dynamic-datasource-spring-boot-starter
  • 如何通过AI情侣头像项目日入1000+:详细教程揭秘