x86 汇编语言介绍001

1,搭建编程环境

1.1 NASM 基本信息

示例使用的汇编器为 nasm

主页:    

https://www.nasm.us/https://www.nasm.us/

下载最新的稳定版源代码

wget https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/nasm-2.16.01.tar.gz

1.2解压并编译安装

tar zxf nasm-2.16.01.tar.gz
cd cd nasm-2.16.01/
./configure
make -j
sudo make install

执行make -j前的文件夹内容:

执行make -j 后的文件夹内容:

安装

不安装的话也可以使用,只是每次需要跑到这个nasm的文件夹里来使用它。

简单测试:

2,示例测试 Hello World x86

2.1 源代码 及说明:

源码文件名可能有所改动,可以调整回来。

;assembly language hello world
section .data
	bbb db "hello asm lan world!\n", 0
section .bss
section .text
	global main
main:
	mov rax, 3	;
	mov rdi, 1	;
	mov rsi, bbb	;
	mov rdx, 21	;
	syscall
	mov rax, 60	;
	mov rdi, 0	;
	syscall

2.2 汇编,链接并执行

汇编命令:

nasm hello.asm -f elf64 -g -l hello.lst

由于nasm只是个汇编器,会把汇编语言翻译成机器码,生成 *.o 文件,还没有链接,于是不能执行;

链接:

$ gcc -o hello hello.o -no-pie

运行:

写一个Makefile:

all: hello

hello: hello.o
        gcc -o $@ $< -no-pie

hello.o: hello.asm
        nasm $< -f elf64 -g -l hello.lst -o $@

.PHONY: clean

clean:
        -rm -f hello *.o *.lst

规则行的起始处要用tab键

或者为了能够简单地加入更多被编译的 asm 源文件,也可以使用如下的Makefile

例如,还需要编译一个名为 world.asm 的汇编源文件,只需要将EXE 修改为:

EXE := hello world

EXE := hello

all: $(EXE)

%: %.o
	gcc -o $@ $< -no-pie

%.o: %.asm
	nasm $< -f elf64 -g -l $*.lst -o $@

.PHONY: clean

clean:
	-rm -f hello *.o *.lst

效果:

3, gcc 的角色

上述单行命令或Makefile中的 gcc 都仅作为编译器的 driver,并没调用编译功能和汇编功能,而是仅仅调用了链接功能 collect2,这可以在 gcc 后边跟上 -v 来查看详细的信息:

3.1 gcc -v

将上述过程中的

$ gcc -o hello hello.o -no-pie

修改为

$ gcc -v -o hello hello.o -no-pie

可以得到如下输出信息:

这里调用了 gnu 的collect2 连接器

3.2 clang -v

可以将上述过程中的 gcc 改用 clang,则得到类似的结果,稍微不同的是这里使用了 gnu ld 链接器。

4. 关于list列表文件 hello.lst

4.1 内容

vim ./hello.lst 可以看到如下内容:

4.2 分析

.lst 文件是汇编器生成的,此时还没有进入链接流程。
第一列的8个16进制数是内存相对地址,第二列是对应的机器吗,再往后是汇编语言源码;
其中第8行:
8 00000000 B801000000                  mov rax, 1    ;
如果源代码改为   mov rax,    3
那么lst文件将变成:
8 00000000 B803000000                  mov rax, 3    ;
这里 
mov rax 被汇编成为 B8,  mov rax, 3 中的 3 也跟在了后边  B803 中的3.
同样,
mov rdi 被汇编成为 BF,后边跟着01是 汇编源代码中移入的数字1;
msg 变量地址为0000000000,这是因为还没有链接,是相对内存地址。
大概的对应关系如下图:
这里有一个现象, 比如第一行源代码对应的机器码为 B803000000 其实是5个8bit。
这是压缩折中后的机器码长度。二进制文件占的内存空间越小越好,且代码也得到了优化。
4.3 List File 的初衷

列表文件包含了源代码和编译器生成的机器指令之间的详细对应关系,以及行号和地址信息。它对于调试和理解汇编程序的结构非常有用。

列表文件会包含以下信息:

  • 源代码行:原始的汇编语言指令。
  • 地址:每条指令或数据元素在生成的目标文件中的地址。
  • 机器码:汇编指令对应的二进制编码。
  • 行号:源文件中的行号,方便开发者对照源代码。

通过 -l 指定生成列表文件,是一个可选步骤,但在复杂的汇编项目中,这个文件可以帮助开发者更好地理解代码是如何被转换为机器码的,以及各个指令的放置位置。此外,如果在汇编过程中遇到错误或警告,列表文件也可以帮助快速定位问题所在的源代码行。

5. IDE Simple ASM

GitHub - Dman95/SASM: SASM - simple crossplatform IDE for NASM, MASM, GAS and FASM assembly languages

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值