寄存器
debug 命令
r 查看所有寄存器的内容,把当前CS:IP指向的机器码翻译成汇编指令显示出来;通过 “r +寄存器”修改指定寄存器的内容
d 查看内存中的内容,可以通过 “d +地址”指定查看的内存地址,显示结果左侧是地址,中间是数据,右侧是数据对应的ACSII码
u 将机器码翻译成汇编指令
a 以汇编指令的格式向内存中写入数据,同样,可以通过“a +地址”指定写入地址
t 执行当前CS:IP所指向的机器指令
e 修改内存中的数据,同样可以通过 “e+地址” 指定地址
对于8086的系统:
寄存器按照功能的不同可分为通用寄存器(AX,BX,CX,DX,SP,BP,SI,DI。其中的前四个寄存器可分别分成AH,AL ;BH,BL;CH,CL;DH,DL的八位寄存器)、指令指针寄存器(IP)、标志寄存器(FLAGS)、段寄存器(CS,DS,ES,SS)。它们的区别和联系体现在它们的功能上,对它们的深入了解和正确运用需要通过编写程序来实现。
大致功能如下:
AX:可存放一般数据,而且可作为累加器使用;
BX:可存放一般数据,而且可用来存放数据的指针(偏移地址),常常和DS寄存器连用;
CX:可存放一般数据,而且可用来做计数器,常常将循环次数用它来存放;
DX:可存放一般数据,而且可用来存放乘法运算产生的部分积,或用来存放输入输出的端口地址(指针);
SP:用于寻址一个称为堆栈的存储区,通过它来访问堆栈数据;
BP:可存放一般数据,用来存放访问堆栈段的一个数据区,作为基地址;
SI:可存放一般数据,还可用于串操作中,存放源地址,对一串数据访问;
DI:可存放一般数据,还可用于串操作中,存放目的地址,对一串数据访问;
IP:用于寻址当前需要取出的指令字节,程序员不能对它直接操作;
FLAGS:用于指示微处理器的状态并控制它的操作;
CS:代码段寄存器,代码段是一个存储区域,存放的是CPU要使用的代码,CS存放代码段的段基地址;
DS:数据段寄存器,数据段是包含程序使用的大部分数据的存储区,DS中存放数据段的段基地址;
ES:附加段寄存器,附加段是为某些串操作指令存放目的操作数而附近的一个数据段,ES中存放该数据段的段基地址;
SS:堆栈段寄存器,堆栈段是内存中一个特殊的存储区,用于暂时存放程序运行时所需的数据或地址信息。SS中存放该存储区的段基地址。
通用寄存器
AX BX CX DX
这四个16位寄存器均可以分为两个8位寄存器,例如:
AX = AH + AL 高8位和低8位
数据与寄存器之间,寄存器与寄存器之间要保持位数的一致性
赋值失败,如:
mov al, 0001 0001(16进制)共16位,而al是8位寄存器,
mov ax, al ax是16位寄存器,al是8位寄存器·,
做加法运算是如果运算结果超过寄存器的位数,那么只保存该寄存器能保存的位数:
add al,118 最终al内保存的是18
表示地址的寄存器
段地址寄存器:
DS ES SS CS
偏移地址寄存器:
SP BP SI DI IP BX
8086CPU有20根地址线,而地址寄存器只有16位,寻址方式为:
物理地址 = 段地址 × 10H + 偏移地址
CS:IP
在内存中,指令和数据都是二进制数,没有区别。只有在CPU工作的时候,将CS(段地址):IP(偏移地址)指向的内存单元的数据当作指令执行。
指令的执行过程
1.CPU从CS:IP指向的内存中单元中获取指令,存放到指令缓存其中
2.IP = IP + 所读指令长度 ,从而只想下一条指令
3.执行指令缓存中的内容,回到步骤 1
注:地址寄存器存储数据的单位是字节,即IP每增加 1,偏移地址增加一个字节(8位)。
CS和IP的值不能通过MOV指令修改,而可以使用JMP
SS:SP
任意时刻SS:SP指向栈顶元素。
DS和[address]
程序加载到内存后,DS存放着程序所在内存区的段地址
mov al,[0] 表示将内存地址DS:[0] 的数据存入al,默认其段地址寄存器是DS
不同的寻址方式(偏移地址)
- [idata] 用一个常量表示地址,直接定位一个内存单元
- [bx] 用一个变量表示内存地址,间接定位一个内存单元
- [bx+idata] 用一个变量和一个常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元
- [bx+si] 用两个变量表示地址
- [bx+si+idata] 用两个变量和一个常量表示地址
bx,si,di,bp
1.在8086CPU中,只有这四个寄存器可以用在 [...] 中来进行内存单元的寻址
2.在[...]中,这四个寄存器可以单个出现,或只能以四种组合出现:bx和si,bx和di,bp和si,bp和di
3.只要在[...]中使用bp,而指令中没有现实给出段地址,段地址就默认在ss中
字型数据和字节型数据
在X86体系中,一个字固定为两个字节
字型数据在内存中,有两个连续地址的内存单元组成:
- 高地址存放字型数据的高位字节
- 低地址存放字型数据的低位字节
确定数据长度
通过寄存器确定数据长度:
mov bs:[0], ax 操作的是字型数据
mov bs:[0], al 操作的是字节型数据
声明数据长度:
mov word ptr ds:[0], 1 操作的是字型数据
mov byte ptr ds:[0], 1 操作的是字节型数据
标志寄存器
flag寄存器和其他寄存器不一样,它是按位起作用的。也就是说,它的每一位都有专门的含义,记录特定的信息。
ZF:零标志为,它记录相关指令执行后,其结果是否为0。为0 zf = 1,不为0 zf = 0
PF:奇偶标志位,记录相关指令执行后,其结果所有bit位中1的个数是否为偶数
SF:符号标志位。记录相关指令结束后,其结果是否为负
CF:进位标志位,记录无符号标志位运算后是否产生进位
OF:溢出标志位。记录有符号运算是否发生了溢出
注:CF是对无符号运算有意义的标志位,而OF是对有符号数运算有意义的标志位
DF:方向标志位。在串处理指令中,控制每次操作后si,di的增减
df = 0,递增 df = 1,递减
串传送指令:movsb,相当于以下操作:
1.((es)*16+(di)) = ((ds)*16+(si))
2.如果df = 0,则:si,di增1,df = 1,si,di减1
movsb传送一个字节,而movsw传送一个字,di,si增减2,两者一般配合rep使用,rep movsb相当于:
s:movsb
loop s
8086提供两条指令对df进行设置:
cld:将df置0
std:将df置1
相关指令
adc:带进位加法指令,利用了CF上记录的进位值
指令格式:adc 操作对象1 操作对象2
功能:操作对象1 =操作对象1 + 操作对象2 + CF
sbb:带进位减法指令,利用了CF上记录的借位值
指令格式:sbb 操作对象1 操作对象2
功能:操作对象1 = 操作对象1 - 操作对象2 - CF
cmp:比较指令
指令格式:cmp 操作对象1 操作对象2
功能:计算操作对象1 - 操作对象2但并不保存结果,仅根据计算结果对相关标志位进行设置
比如,指令 cmp ax,ax,做(ax) - (ax)运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。指令执行后:
zf = 1,pf = 1,sf = 0,cf = 0,of = 0
除了jcxz外,CPU还提供了其他条件转移指令,这些指令通常都和cmp指令相配合使用

pushf:将标志及存器压栈
popf:将标志及存器弹栈

浙公网安备 33010602011771号