程序员代码的最终实现是操作寄存器和内存,了解CPU中每个寄存器的作用,从而更深入地理解代码。
文章目录CPU各寄存器的作用(8086 ):CS、ipbx、si、di、bpss、spcx:div指令: mul指令: ax、bx、CX、dx汇总: cs、IP; ss,sp; ds,bx; es总结:分支指令(1) offset) jmp )2-1移位分支的jmp指令2-2分支目标地址指令中的jmp指令2-3分支目标地址寄存器中的jmp指令2-4分支目标地址存储器中的jmp指令)3) jcxz 4-2呼叫指令,cpu执行呼叫指令,进行两级操作。 4-3呼叫和ret并用:两者合作实现子程序的机制标志寄存器: adc指令sbb指令cmp指令检测比较结果的条件分支指令串传输指令pushf和popfrep stos CPU的各寄存器作用(8086 ) : CS,IP
要当前读取指定地址,**在任意时间点,CPU将CS:IP指向的内容作为命令执行。 *在内存中,指令和数据没有任何区别,CPU如何区分指令和数据?CPU将CS:IP指向的内存单元的内容看做指令
CPU执行指令的过程:
bx、si、di和bp可在[…]中用于寻址内存单元。 在[]中,这四个寄存器可以单独显示,也可以组合显示。 http://www.Sina.com/3358 www.Sina.com /但是,除非在[]中使用bx和si,bx和di,bp和si,bp和di,否则指令没有明确赋予段地址。一般[]的段地址默认在ds中。 可以像es:[bx]那样显示段地址。
执行ss、sp push、pop指令时,bp(堆栈区域的低位地址为堆栈顶部,高位地址为堆栈底部)
推送ax的执行由两个阶段构成
(1) sp=sp-2
)2)将ax内容发送到ss:sp指定的存储器单元,ss3360sp此时指向新的堆栈顶部
CX :判断CPU执行loop命令进行两级操作的(1) cx=cx-1(2)2) CX的值,如果不为零则移动到标签处执行程序,如果为零则向下执行。
div指令: (1)除数:在1个reg或存储器单元中
)2)被除数)默认值存储在ax或dx和ax中。 如果除数为8位,则被除数为16位,默认值存储在ax中。 如果除数为16位,被除数为32位,存储在dx和ax中。 dx存储高16位,ax存储低16位。
(3)结果)除数为8位时,al存储出发操作的商,ah存储除法操作的馀数。 在除数为16位的情况下,ax存储除法操作的商,dx存储除法操作的馀数。
mul命令:
ax、bx、cx、dx总结: ax、dx寄存器和div、mul指令的默认存储被除数和乘数以及最终存储结果;
bx与存储单元的寻址有关,可在[…]中使用;
cx与循环和判断句相关;
cs、ip; ss,sp; ds,bx; es总结: cs存储指令的段地址,ip存储偏移地址;
ss存储栈的段地址、sp存储区偏移地址;
在ds中可以存储存储存储器空间的段地址,在bx中可以存储偏移地址以及在si、di中可以存储偏移地址(虽然也可以使用bp,但是在这种情况下段地址默认在ss中) ) )
es与串行传输命令相关联
转移指令将更改IP或同时更改CS和IP的指令统称为转移指令。
(1) offset :汇编语言中是编译器处理的符号,功能是获取标签的偏移地址。
) jmp )无条件转移命令可以仅修改IP,也可以同时修改CS和IP。
2-1根据位移迁移的jmp指令
jmp short标记(移动到标记并执行指令) ) ) ) )。
这种形式的jmp指令实现了段内的短迁移,对IP的修改范围为-128~127
2-2迁移目标地址由指令中的jmp指令jmp far ptr标记实现的是段间迁移,也称为远程迁移,作用如下。 cs=标记所在段的段地址; ip=段中标签的偏移地址。
2-3传送寄存器内地址的jmp指令
2-4传送存储器内地址的jmp指令
)3) jcxz指令:是条件分支指令,所有条件分支指令都是短分支,在相应的机器码中包含分支的位,而不是目的地址。 对IP的修改范围均为-128~127。
命令格式: jcxz标签(cx=0时,转移到标签并执行。 cx不是0,什么也不做)
操作: cx=0时。 ip=ip 8位移位
)4)使用呼叫命令和ret命令4-1 ret命令堆栈中的数据修改IP内容,实现近切换; retf利用堆栈中的数据,修改CS和IP的内容,实现远程转移。
4-2呼叫指令、cpu执行
call指令进行两步操作:(1)将当前的IP或CS和IP压入栈中
(2)转移
根据位移进行转移的call指令:
根据目的地址进行转移的call指令
转移地址在寄存器中的call指令
从上面的讨论我们发现,可以写一个子程序,在需要的时候,用call指令转去执行。当执行完子程序后,可以在子程序后面使用ret指令,利用栈中的数据设置IP的值,从而转到call指令后面的代码处继续执行。
一种特殊的寄存器,具有3种作用:
ZF标志:记录相关指令执行后,其结果是否为0,如果为0,zf=1,否则zf=0。
PF标志:记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,pf=1,如果为奇数,那么pf=0。
SF标志:记录相关指令执行后,其结果是否为负,如果为负,sf=1,否则sf=0。
CF标志:在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
OF标志:记录了有符号数运算的结果是否发生了溢出,如果发生溢出,of=1,否则of=0。
DF标志:在串处理指令中,控制每次操作后si、di的增减。df=0,每次操作后si、di递增;df=1,每次操作后si、di递减。
adc指令可以对任意大的数据进行加法运算。
利用sbb指令可以对任意大的数据进行减法运算。
rep指令的目的是重复其上面的指令.ECX的值是重复的次数.
STOS指令的作用是将eax中的值拷贝到ES:EDI指向的地址