汇编编码字节长度

查看汇编语句的编码字节长度

CSAPP的习题3.11中,第三问要求 比较两种不同的汇编命令的编码字节长度,下面介绍两种方式来实现该目的

利用反汇编命令

首先写出题目要求的两条汇编语句:

1
2
3
4
a:
xorq %rdx, %rdx
b:
movq $0, %rdx

ab主要是区分两条命令,由于计算机一般执行可执行文件,因此对其汇编的代码进行加工,通过汇编器生成二进制目标代码文件

命令:

1
2
3
gcc -Og test.s -o  test.o
as test.s -o test.o
//两种方式均可

现在已经生成.o后缀的二进制可执行目标代码文件

利用反汇编器来分析.o文件,命令:

1
objdump -d BitSize.o

生成以下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─[root@sun] - [/home/mycode/Linux/Chapter3] - [Sat Feb 19, 17:40]
└─[$]> objdump -d BitSize.o

BitSize.o: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <a>:
0: 48 31 d2 xor %rdx,%rdx

0000000000000003 <b>:
3: 48 c7 c2 00 00 00 00 mov $0x0,%rdx

左侧为机器指令

注意到:a形式的汇编语句占用了3个字节,b形式的汇编语句占用了7个字节

利用nm命令

nm命令是Linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。

利用man命令可以查看nm的使用方法,可以采用-n参数来以地址排序,而不是名称排序

得到:

1
2
3
4
┌─[root@sun] - [/home/mycode/Linux/Chapter3] - [Sat Feb 19, 18:20]
└─[$]> nm -n BitSize.o
0000000000000000 t a
0000000000000003 t b

可以得到:

a形式的汇编语句占用了3个字节

b形式的汇编语句不明确 因此逻辑上人为增加一条语句:

1
2
3
4
5
a:
xorq %rdx, %rdx
b:
movq $0, %rdx
c:

继续生成.o文件然后用nm命令分析

1
2
3
4
5
┌─[root@sun] - [/home/mycode/Linux/Chapter3] - [Sat Feb 19, 18:27]
└─[$]> nm BitSize.o
0000000000000000 t a
0000000000000003 t b
000000000000000a t c

得到:a形式的汇编语句占用了3个字节[0 - 2],b形式的汇编语句占用了7个字节[3 - 9]

注意:地址是采用十六进制表示的