x86汇编从实模式到保护模式实验
x86汇编从实模式到保护模式实验
实验一
实验环境:MacOS High Sierra
安装nasm
nasm是一个开源的汇编语言编译器,可以将汇编代码编程成x86平台可以执行的二进制代码
Vim 编辑器–用于编辑代码
xxd 命令可以以二进制或者十六进制的形式查看二进制文件,配合vim可以当做十六进制查看器使用。
写入代码,并编译
创建虚拟机镜像,并启动虚拟机查看实验结果
打开virtualbox->创建虚拟机->操作系统类型:Other->Other unknow -> 不要硬盘。
设置虚拟机->存储->注册->选中上边创建的os.img
。开启虚拟机。引导设置为软盘
此外可以通过以下方式将img转换为vdi的硬盘

创建一个虚拟硬盘,并写入MBR
然后将此硬盘镜像设置为虚拟机的启动硬盘,可以得到和上边实验相同的结果。
Bochs
bochs是一个开源的x86模拟器,可以单步调试,可以查看CPU的寄存器值。各个版本的下载链接
|
|
bochs在macos上编译的时候遇到fatal error: 'linux/types.h' file not found
错误,暂时不知道怎么解决。
代码解释
|
|
div指令:
被除数是32位时存储在 (DX:AX) 除数是16位的跟在div指令后,商存在AX,余数在DX中
被除数是16位时存储在 AX中,除数是8位的跟在div指令后,商在AL,余数在AH中
DB是伪指令,即没有对应的机器码,只是给编译器用的。DB表示声明一个字节数据,此外还有DW(两个字),DD(双字),DQ(四字)
|
|
movsw指令
movsw和movsb指令执行时,原始数据串的地址由DS:SI指定,要传送的目的地址为ES:DI,传送次数为CX,movsb每次传送一个字节,movsw每次传送两个字节。
正向传送时,没传送一个字节(movsb)或者一个字(movsw)SI和DI加1或者2;
反向传送时,没传送一个字节(movsb)或者一个字(movsw)SI和DI减1或者2;
传送方向由标志寄存器(FLAGS)的DF位指定,0为正,1为负。cls清零DF位,std将DF位置1.
单纯的movsw或者movsb指令只能执行1此,需要加上rep前缀,只要CX不为0就一直执行movsw或者movsb。