云昴

汇编复习要点二——寄存器

| 【专业·学习】汇编

寄存器

寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。——《汇编语言(第三版)》第2章

在8086CPU中一共有14个寄存器:

ax,bx,cx,dx,si,di,sp,bp,ip,cs,ss,ds,es,flag

AX――累加器(Accumulator),使用频度最高 BX――基址寄存器(Base Register),常存放存储器地址 CX――计数器(Count Register),常作为计数器 DX――数据寄存器(Data Register),存放数据 SI――源变址寄存器(Source Index),常保存存储单元地址 DI――目的变址寄存器(Destination Index),常保存存储单元地址 BP――基址指针寄存器(Base Pointer),表示堆栈区域中的基地址 SP――堆栈指针寄存器(Stack Pointer),指示堆栈区域的栈顶地址 IP――指令指针寄存器(Instruction Pointer),指示要执行指令所在存储单元的地址。IP寄存器是一个专用寄存器。

通用寄存器(ax,bx,cx,dx)

都可以分为独立使用的2个8位寄存器来使用

ax:ah,al

bx:bh,bl

cx:ch,cl

dx,dh,dl

h结束的为高位,l的为低位,而且这两个8位寄存器之间相互独立,例如:ah本来为0000,0000,当向al传入一个数据,但这个数据已经超8位,就假设为1,0000,0000,最后结果为ah:0000,0000,al:0000,0000。传进去的数据的最高位(超出的一位),将会被舍弃,而不是往ah进位。

地址相关寄存器

段地址+偏移地址(cs,ss,ds,es,ip,sp,bp,bx,si,di)

段地址寄存器(段寄存器):cs,ss,ds,es

可用来存储偏移地址的寄存器:ip,sp,bp,si,di

1)cs:ip:指示指令地址

cs和ip是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。

在8086CPU机中,任意时刻,设cs中的内容为M,ip中的内容为N,8086CPU将从内存Mx16+N单元开始,读取一条指令执行,若该条指令不是跳转指令,则执行完后,L为刚执行完的指令的长度(所占内存单元的个数),N=N+L,然后继续读取下一条指令执行。

换句话说,8086机中,任意时刻,CPU将cs:ip指向的内容当做指令执行,就是说假如你原来存储在某个内存单元的是数据,但是如果你的cs:ip指向了该内存单元,CPU依然会把内存单元中的内容当做指令来执行。

而且,cs,ip也是唯二的两个寄存器不能被mov指令修改,只能被转移指令修改。

2)ss:sp:指示栈顶地址

8086CPU提供了相关的指令来以栈的方式访问内存空间,也就是说,基于8086CPU编程时,可将一段内存当做栈来使用,然后这时,ss:sp指示的就是栈顶的地址。

栈中的一个单元大小是两个内存单元,就是16位,就是每次入栈,不管是8位还是16位,最后在栈中都占据16位大小也就是2个内存单元。

在8086CPU中,任意时刻,设ss中的内容为M,sp中的内容为N,每次入栈后,N=N-2(栈底在高地址,栈顶在低地址),每次出栈后,N=N+2。当使用push,pop指令时,CPU就会按照当前ss:sp指示的位置,进行入栈,出栈操作。

3)ds(es):idata(bx,bp,si,di):指示代码段地址

这里和前面的两对都不同,它们不用一一对应,而且除了用寄存器中的数据,还可以直接用立即数来作为偏移地址。它们用于对内存单元中的内容以数据形式读取。

使用格式为:

ds(es):[idata(bx,bp,si,di)]

p.s.接下来用sa代表段地址,表示ds或者es均可

上面代表的是:段地址为ds中的内容,偏移地址为idata 的内存单元中的数据。

而且还有几点必须注意:

1.只有这4个寄存器可以作为偏移地址放进[]中,其余的寄存器如ax,cx…放进

去就是错误的指令

2.在[]中,这4个寄存器可以单个出现,或只能以4种组合出现:

sa:[bx]

sa:[bp]

sa:[si]

sa:[di]

sa:[bx+si]

sa:[bx+di]

sa:[bp+si]

sa:[bp+di]

3.两个内存单元之间不可以直接使用mov进行数据传输 最后来总结一下代码段

的合法寻址方式,也可以说是偏移地址中寄存器的组合方式:

寻址方式名称

sa:[idata]直接寻址

sa:[bx]寄存器间接寻址

sa:[bp]寄存器间接寻址

sa:[si]寄存器间接寻址

sa:[di]寄存器间接寻址

sa:[bx+idata]寄存器相对寻址

sa:[bp+idata] 寄存器相对寻址

sa:[si+idata] 寄存器相对寻址

sa:[di+idata] 寄存器相对寻址

sa:[bx+si]基址变址寻址

sa:[bx+di] 基址变址寻址

sa:[bp+si] 基址变址寻址

sa:[bp+di] 基址变址寻址

sa:[bx+si+idata]相对基址变址寻址

sa:[bx+di+idata] 相对基址变址寻址

sa:[bp+si+idata] 相对基址变址寻址

sa:[bp+di+idata] 相对基址变址寻址

循环(loop)相关寄存器(cx)

cx表示的是循环的次数,设cx中的内容为N,每执行一次loop指令后,N=N-1,当N>0时,执行跳转(继续循环),否则跳出循环,执行下一条指令(内存上向邻的下一条)。

除法(div)相关寄存器(ax,dx)

除法指令:
div 寄存器 div 内存单元

div后面跟着的是除数,如果除数为8位,则被除数为16位,如果除数为16位,则被除数为32位;如果被除数为16位,则默认存放在ax,结果的商存放在al,余数存放ah;如果被除数为32位,则高16位存放在dx,低16位存放在ax;除得的商存放在ax,余数存放在dx

乘法(mul)相关寄存器(ax,dx)

乘法指令:
mul 寄存器 mul 内存单元 两个相乘的数必须位数一致,如果都为8位,一个默认放在al中,结果存放在ax中;如果都为16位,一个默认存放在ax中,结果的高位存放在dx中,低位存放在ax中。

转移指令(jcxz)相关寄存器(cx)

格式:jcxz label 如果cx中的内容为0,则转移到label处执行,否则执行下一条指令

复制指令(movsb,movsw)相关寄存器(ds,si,es,di)

格式:movsb 功能:把源地址的单元内容复制给目的地址的单元,在每次操作完后,根据df的值控制si、di的增减 源地址:ds:[si] 目的地址:es:[di] df = 1:si、di递增 df = 0: si、di递减

标志寄存器(flag)

首先,flag和其它寄存器不一样,其它寄存器是整个寄存器具有一个含义(寄存器的16个位作为一个整体)。而flag是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。

使用标志寄存器的相关指令 cmp 分类指令转移条件说明 (Ⅰ) JZ/JEZF=1为零/相等, 则转移 JNZ/JNEZF=0不为零/不相等, 则转移 JSSF=1为负, 则转移 JNSSF=0为正, 则转移 JOOF=1溢出, 则转移 JNOOF=0不溢出, 则转移 JPPF=1奇偶位为1, 则转移 JNPPF=0奇偶位为0, 则转移 JCCF=1进位位为1, 则转移 JNCCF=0进位位为0, 则转移 (Ⅱ) JB/JNAE/JCCF=1低于/不高于等于, 则转移 JNB/JAE/JNCCF=0不低于/高于等于, 则转移 JBE/JNA(CF * ZF)=1低于等于/不高于, 则转移 JNBE/JA(CF * ZF)=0不低于等于/高于, 则转移 (Ⅲ) JL/JNGE(SF * OF)=1小于/不大于等于, 则转移 JNL/JGE(SF * OF)=0不小于/大于等于, 则转移 JLE/JNG((SF * OF) * ZF)=1小于等于/不大于, 则转移 JNLE/JG((SF * OF) * ZF)=0不小于等于/大于, 则转移 上表格转自条件转移指令表格经典收藏(汇编)

寄存器功能总结:

待补充

云昴