《x86汇编语言 从实模式到保护模式》学习实验笔记【03】
目录
NASM编译器
NASM编译器是专门为x86CPU架构设计的汇编器。它使用intel汇编语法格式,可运行于各个现代操作系统之上。
安装及查看
在Ubuntu系统上可以使用sudo apt-get install nasm来安装,之后可以通过输入nasm -v来查看是否安装成功。也可以使用sudo apt show nasm来查看nasm的版本信息,如下图所示:
基本使用方法
- -f 指定输出格式
- -o 指定输出文件名
- -E 只进行预处理,默认输出到标准输出
- -g 生成调试信息
- -F 指定调试信息的格式
查看NASM支持的输出格式
$ nasm -hf
valid output formats for -f are (`*’ denotes default):
* bin flat-form binary files (e.g. DOS .COM, .SYS)
ith Intel hex
srec Motorola S-records
aout Linux a.out object files
aoutb NetBSD/FreeBSD a.out object files
coff COFF (i386) object files (e.g. DJGPP for DOS)
elf32 ELF32 (i386) object files (e.g. Linux)
elf64 ELF64 (x86_64) object files (e.g. Linux)
elfx32 ELFX32 (x86_64) object files (e.g. Linux)
as86 Linux as86 (bin86 version 0.3) object files
obj MS-DOS 16-bit/32-bit OMF object files
win32 Microsoft Win32 (i386) object files
win64 Microsoft Win64 (x86-64) object files
rdf Relocatable Dynamic Object File Format v2.0
ieee IEEE-695 (LADsoft variant) object file format
macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
dbg Trace of all info passed to output stage
elf ELF (short name for ELF32)
macho MACHO (short name for MACHO32)
win WIN (short name for WIN32)
基本编译方法
打开终端,输入
nasm -f bin 汇编源文件名.s -o 汇编程序名.bin
之后按回车键即可。如下图所示:
这里指定-f bin,就是要求NASM生成的文件中只含有纯二进制的内容。
检测点3.1答案
- 在你的计算机中启动Nasmide程序(这里我是用vim替代),输入图3-1中的三行代码,然后编译它们。看看消息显示区是否有编译成功的提示。
代码如上所示,输入后用nasm编译如下动态图所示: - 选择填空:指令 mov ax, 0xf5fc 中,”mov“指示这是一条(B)指令,0xf5fc是(A)。指令执行后,寄存器AX中的内容是(C)。
A. 立即数 B.传送 C.0xf5fc D.加法 E.0xfcf5 F.寄存器
使用Hexdump来查看编译后的机器代码
hexdump简明手册
语法
hexdump [-bcCdovx] [-e format_string] [-f format_file] [-n length] [-s offset] file
选项
选 项 | 含义 |
---|---|
-b | 单字节八进制显示。每一行首先以16进制显示偏移量,之后以8进制显示16个字节的数据。这些字节之间用空格分隔。每个字节的数据占三列,不足三列使用数字0补足高位。 |
-c | 单字节字符显示。每一行首先以16进制显示偏移量,之后显示16个字符。这些字符之间使用空格分隔。每个字符占据三列,所以高两位用空格填充。 |
-C | 标准十六进制+ASCII显示(Canonical hex+ASCII display)。每一行的显示分为三个部分。 第一部分:每一行首先以16进制显示偏移量。 第二部分:之后以16进制显示16个字节的数据,每个字节的数据占2列,字节之间使用空格分隔。 第三部分:再之后以%_p格式显示之前同样的数据。第三部分用两个 |
-d | 两字节十进制显示。每一行首先以16进制显示偏移量,之后显示8个用空格分隔的数据。每个数据对应原文件中两个字节,以无符号十进制形式显示,数据显示占5列,不足5列高位补0。 |
-e | 按指定格式字符串显示数据。类似printf的格式控制字符串。 |
-f | 指定一个文件,其中包含着一行或多行格式控制字符串。文件中的空行或者以#开头的行都会被忽略掉。 |
-n | 指定输入的总字节数 |
-o | 双字节八进制显示。每一行首先以16进制显示偏移量,之后以8进制显示8个双字节的数据。这些双字节之间用空格分隔。每个双字节的数据占6列,不足6列使用数字0补足高位。 |
-s | 跳过指定的字节数。从头开始跳过指定的字节数。默认情况下,按十进制来解析指定的数字。但是如果指定的数字是以0x或0X开头,则按照16进制来解析。同理,如果以0开头,则按照8进制来解析。 同时,如果数字后面跟着b,k或者m,那么跳过的字节数还要乘以512,1024或者1048576。 |
-v | 强制hexdump程序完整显示所有数据。如果不加-v选项,那么若后续每行的数据和前一行数据相同时,后续行会被代替,用符号*显示。 |
-x | 双字节16进制显示。每一行首先以16进制显示偏移量,之后以16进制显示8个双字节的数据。这些双字节之间用空格分隔。每个双字节的数据占4列,不足4列使用数字0补足高位。 |
-e选项
下面针对hexdump的-e选项的格式化字符串,进行详细的说明。
所谓格式化字符串,就是指包含任意数量的用空白符分隔的格式化单元。而一个格式化单元,是指至多包含三项内容的字符串:一个是可迭代数量,一个是字节数目,第三个是一个格式化符号。
- 可迭代数量N
可迭代数量N是一个可选的正整数,默认是1。每个格式化符号会被迭代执行N次。 - 字节数量C
字节数量C也是一个可选的正整数。它指示每一次迭代时被格式化符号解析的数据的字节数。 - 格式化符号
格式化符号必须被双引号包围。
_p 对于可打印字符,原样输出。对于不可打印字符,则输出为.
对于如下格式化字符串
‘a/b “format1” “format2”’
对于形如a/b,a表示对每a个输入字节应用format2格式,b表示对每b个输入字节使用format1格式。
一般a>b,且b只能为1,2,4。另外a可以省略,省略则a=1。
format1和format2中可以使用类似printf的格式字符串。