Dosbox的基本使用
安装与配置
网上下载Dosbox虚拟机,安装。
下载调试,编译,连接的程序,放到同一个目录下(这里是D盘下的ASM目录)
然后打开dosbox,在里面输入
mount c d:\ASM\ (这里我的是ASM,根据自己放上面三个程序的位置写)
这样就挂载成功将d:\ASM\挂载到C盘上了,接下来进入虚拟机的C盘,
输入C:
一般来说这两步我们每次都要用,所以我们可以把它写到虚拟机开机自启的文件里,这样就不用每次打开dosbox都要输一遍了。
找到跟这个窗口一起弹出来的另一个窗,打开下面框出来的文件。
在最后添加下面两行,也就是之前输入的那两个
保存退出,再打开dosbox,他就自动执行这两句了。
基本指令
debug指令:这篇总结比较到位debug基本命令
汇编简介
计算机基本结构
可以简单地看成CPU通过一些线与存储器,和io设备(就是有数据交流地设备,比如鼠标、键盘什么的)相连
这张图先挂这,以后再讲。
寄存器
8086/8088中共有14个16位寄存器,寄存器在CPU内部,所以访问速度快。但容量小。寄存器就是存东西的地方
寄存器概览
这就是8086汇编要用的到的所有寄存器,先混个眼熟。
数据寄存器
就是用于数据计算用的,其中有两个比较特殊,BX(还可用于寻址),CX(还可用于循环),然后这四个16寄存器(一次可以存16位数)有两个8位寄存器组成,一个高(H),一个低(L),这两个可以分开使用。
看一下,两个寄存器的独立性:
输入指令
在执行第一个指令前,我们看到ax,bx都是0
两个赋值操作后,al,bl被赋值
相加后可以看到溢出的1并没有出现到ah上,而是不知道跑哪去了
但是如果我们把最后一句改为add ax,bx,进位就跑到ah上了
这说明两个8寄存器既是16寄存器一部分又是相对独立的。
AX,DX还有一些联系,这在后面讲乘除时会讲。
寻址方式
在这里把后面有些寄存器一起讲了
首先谈一下物理地址和逻辑地址的问题,物理地址顾名思义就是本来的地址,但是这个我们一般不用,因为电脑存东西的时候是乱取的,在物理地址上不连续。所以我们给我们申请的地址编号,这样他们就连续了,这就叫做逻辑地址,我们一般直接操作逻辑地址。
然后再给出一些常识:
- 8086最小的操作单位是是字节(8位),不能像一些单片机(比如51,32)一样实现位操作
- 8086是小端系统,就是一个字(比如说16位)有两个字节,那么我村这个字的时候,连续占16位地址,低8位放在低的8位地址上,高8位放到高的8位地址上
- 8086的地址有段地址和偏移地址组成
解释一下第三点:
还记得这张图吗,由于CPU内部的寄存器是16位的,而外部的地址线有20根(即有220个内存单元(字节))那显然一个寄存器无法表示全部地址。
解决方法是用两个寄存器,由于16+16=32>20,我们必须设计一种对应的方式使两个16位的得到20位的地址。那么我们就让第一个寄存器乘8(24)让它变成20位,然后再加上第二个寄存器,第一个寄存器就叫做端地址寄存器,第二个叫做偏移地址寄存器,两个寄存器的值用:隔开,像这样:
当然这里的数都是16位数。然后一个逻辑地址有很多种段地址和偏移地址的组合方式只要算出来结果是他就行了。
一个段里最多有216个字节,因为偏移地址有16位嘛
这种方式有点像什么呢,相当于是告诉你第几层后在走几步来确定房间。
具体操作时的寻址
简单的说就是如何给他地址,是直接给呢还是用寄存器
直接寻址方式(direct addressing)
[]里没有寄存器
寄存器间接寻址方式(register indirect)
[]只有一个寄存器
寄存器相对寻址方式(register relative)
[]只有一个寄存器和一个数字
基址变址寻址方式(based indexed…)
[]只有两个寄存器
注意[]里只能放BX,BP,SI,DI四个寄存器其他寄存器不能放,而且将BX,BP作为基地址寄存器,SI,DI作为变址寄存器,[]最多只能放一个基址和一个变址寄存器,基址同时出现或变址同时出现都会报错。还有[]里放BP时默认的段地址寄存器为SS,需要改为其他段地址寄存器要在前面加上DS:[BP+2H](以DS为例)指定为其他段地址寄存器
相对基址变址方式(relative based indexed…
[]里有两个寄存器和数字
段寄存器
首先命令和数据同时存在内存中,我们用CS作为段地址寄存器指向存有命令的段,IP作为偏移地址寄存器指向命令。SS指向用作栈的段,SP(偏移地址寄存器)作为栈顶指针,DS,ES作为数据的段地址寄存器搭配上面的5种寻址方式。
另外,不是通用寄存器的寄存器不能直接用mov赋值,要赋值的话一般有下面两种方式:
- 通用寄存器作为媒介:mov ax,1 mov ds,ax
- 把数据放到内存中,然后把内存赋给非通用寄存器 mov ds,[1000H]
标志位
简介
当CPU做了一次运算,我们可以通过标志位来得知有没有特定的状况发生。还有一些控制信息。
CF
把运算的两个对象当作无符号数,看看有无进位,有的话这个符号位为1,否则为0
OF
把运算的两个数当作有符号数,看看结果会不会溢出,溢出的为1
电路设计的话就是看高两位的异或,高两位同时进位则溢出否则没溢出
ZF
运算结果是否为0,是的话这个符号位为1
SF
有符号数据利用最高有效位表示数据的符号。
所以,最高有效位就是符号标志的状态,就是结果最高位为1,他就为1,否则为0
PF
当运算结果最低字节中“1”的个数为偶数时,PF = 1;否则PF = 0
AF
运算时D3位(低半字节)有进位或借位时,AF
= 1;否则AF = 0。
就是第4位有进位就为1,否则为0