程序员的代码最终的实现就是对寄存器和内存进行一些操作,知道CPU中各个寄存器的作用,能够对代码有更深刻的了解。
文章目录
CPU各个寄存器作用(8086):
CS,IP
当前要读取指定的地址,**任意时刻CPU将CS:IP指向的内容当做指令执行。**在内存中,指令和数据没有任何区别,CPU如何区分指令和数据?CPU将CS:IP指向的内存单元的内容看做指令。
CPU执行指令的过程:
bx,si,di,bp
可以用在[…]中来进行内存单元的寻址。在[]中这四个寄存器可以单个出现,或者组合:bx和si,bx和di,bp和si,bp和di。
一般[]的段地址默认在ds中,但只要在[]中使用bp,指令中没有显性给出段地址,段地址默认在ss中。[]可以显示给出段地址如:es:[bx]。
ss,sp
push,pop指令执行时,CPU从SS和SP中得到栈顶的地址。(栈区低地址是栈顶,高地址是栈底)
push ax的执行由两步组成
(1)sp=sp-2
(2)将ax中的内容送入ss:sp指向的内存单元处,ss:sp此时指向新栈顶
CX:
CPU执行loop指令进行两步操作(1)cx=cx-1(2)判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
div指令:
(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:
在汇编语言中是有编译器处理的符号,功能是取得标号的偏移地址。
(2)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)call和ret指令
4-1 ret指令用栈中的数据,修改IP的内容,从而实现近转移;retf利用栈中的数据,修改CS和IP的内容,从而实现远转移。
4-2 call指令,cpu执行call指令进行两步操作:
(1)将当前的IP或CS和IP压入栈中
(2)转移
根据位移进行转移的call指令:
根据目的地址进行转移的call指令
转移地址在寄存器中的call指令
4-3 call和ret的配合使用:两者配合实现子程序的机制
从上面的讨论我们发现,可以写一个子程序,在需要的时候,用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指令
adc指令可以对任意大的数据进行加法运算。
sbb指令
利用sbb指令可以对任意大的数据进行减法运算。
cmp指令
检测比较结果的条件转移指令
串传送指令
pushf和popf
rep stos
lea edi,[ebp-0C0h]
mov ecx,30h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
rep指令的目的是重复其上面的指令.ECX的值是重复的次数.
STOS指令的作用是将eax中的值拷贝到ES:EDI指向的地址