使用NASM汇编的一点测试

本文通过实际测试介绍了X86架构下的字节序特点,并探讨了汇编语言中的伪指令用法,包括小端序的存储顺序、equ伪指令的功能以及不同节之间的对齐规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. X86字节序的一点测试

对于dw双字节类型,dd四字节类型作了一点测试,很简单。在文件中写入下汇编码,就可以看出来了:

 

dd  0x12345678

dw 0x9abc

 

文件名取成 test.asm,使用nasm编译:nasm -o t.o test.asm

使用ultra查看生成的二进制码:

 

可以看到是小字节序的x86字节序

a. 对于双字 0x12345678,先存78,然后是56,然后是34,最后是12

b. 对于单字 0x9abc,先存bc,然后是9a

 

2. equ

equ是伪操作码,汇编编译后不占空间

 

如将1种的代码插入一行:

dd  0x12345678

GdtLenEx1  equ $ ; GDT长度

dw 0x9abc

 

进行汇编,我发现仍然是1的结果。

 插入equ后

综合1和2的试验结果,也可以区分出使用db,dw,dd伪指令和 equ伪指令的一点差别

 

3. 节默认采用4字节对齐

扩充上面的代码增加节标识

[SECTION .a]
dd  0x12345678
GdtLenEx1  equ $ ; GDT长度
dw 0x9abc
[SECTION .b]

dw 0x9abc

 

进行汇编,查看二进制码,如下图:

节4字节对其

 

发现在第一个bc 9a后面多了两个字节的 00 00

这是cpu默认采用4字节对齐方式的结果。

 

4. 节标号之前,也采用默认4字节对齐的方式,增加代码如下:

db  0x11
[SECTION .a]
dd  0x12345678
GdtLenEx1  equ $ ; GDT长度
dw 0x9abc
LABEL_BEGIN:
[SECTION .b]
dw 0x9abc 

 

 使用nasm编译,:nasm -o t.o test.asm,ultra打开生成的t.o,如下图:

节前也是4字节对齐

在11后面多了3个字节的 00 00 00

 

5. 相同汇编指令的32位字节码和16位字节码是不一样的。

如操作AX的指令:mov AX,**

在16位模式下为 :B8

在32位模式下为 :66 B8

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值