寄存器

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

 

不同的寻址方式(偏移地址)

  1. [idata]  用一个常量表示地址,直接定位一个内存单元
  2. [bx]  用一个变量表示内存地址,间接定位一个内存单元
  3. [bx+idata]  用一个变量和一个常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元
  4. [bx+si]  用两个变量表示地址
  5. [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:将标志及存器弹栈

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



posted @ 2019-10-29 14:26  tianqibucuo  阅读(1141)  评论(0)    收藏  举报