查看汇编语句的编码字节长度
在CSAPP
的习题3.11中,第三问要求 比较两种不同的汇编命令的编码字节长度,下面介绍两种方式来实现该目的
利用反汇编命令
首先写出题目要求的两条汇编语句:
1 | a: |
写a
和b
主要是区分两条命令,由于计算机一般执行可执行文件,因此对其汇编的代码进行加工,通过汇编器生成二进制目标代码文件
命令:
1 | gcc -Og test.s -o test.o |
现在已经生成.o
后缀的二进制可执行目标代码文件
利用反汇编器来分析.o
文件,命令:
1 | objdump -d BitSize.o |
生成以下结果:
1 | ┌─[root@sun] - [/home/mycode/Linux/Chapter3] - [Sat Feb 19, 17:40] |
左侧为机器指令
注意到:a
形式的汇编语句占用了3个字节,b
形式的汇编语句占用了7个字节
利用nm命令
nm
命令是Linux
下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。
利用man
命令可以查看nm
的使用方法,可以采用-n
参数来以地址排序,而不是名称排序
得到:
1 | ┌─[root@sun] - [/home/mycode/Linux/Chapter3] - [Sat Feb 19, 18:20] |
可以得到:
a
形式的汇编语句占用了3个字节
但b
形式的汇编语句不明确 因此逻辑上人为增加一条语句:
1 | a: |
继续生成.o
文件然后用nm
命令分析
1 | ┌─[root@sun] - [/home/mycode/Linux/Chapter3] - [Sat Feb 19, 18:27] |
得到:a
形式的汇编语句占用了3个字节[0 - 2],b
形式的汇编语句占用了7个字节[3 - 9]
注意:地址是采用十六进制表示的