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的结果。
综合1和2的试验结果,也可以区分出使用db,dw,dd伪指令和 equ伪指令的一点差别
3. 节默认采用4字节对齐
扩充上面的代码增加节标识
[SECTION .a]
dd 0x12345678
GdtLenEx1 equ $ ; GDT长度
dw 0x9abc
[SECTION .b]
dw 0x9abc
进行汇编,查看二进制码,如下图:
发现在第一个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,如下图:
在11后面多了3个字节的 00 00 00
5. 相同汇编指令的32位字节码和16位字节码是不一样的。
如操作AX的指令:mov AX,**
在16位模式下为 :B8
在32位模式下为 :66 B8