前言
之前高估了自己以前对汇编语言的掌握,经过最近几天的学习以及解题的尝试,发现还需认真学习几天的汇编语言才能开始解题。
标志寄存器
- 标志寄存器flag作用:
-
用来存储相关指令的某些执行结果
-
用来为CPU执行相关指令提供行为依据
-
用来控制CPU的相关工作方式
- 第6位ZF,零标志位。
它记录相关指令执行后,其结果是否为0。如果结果为0,那么ZF=1,不为0,那么ZF=0.影响标志寄存器的指令,如:add,sub,div,inc,mul,or,and等,他们大都是运算指令;有的指令对标志寄存器没有影响,比如:mov,push,pop等,他们大都是传送指令。
- 第2位PF,奇偶标志位。
它记录相关指令执行后,其结果的所有二进制中1的个数是否为偶数。如果1的个数为偶数,PF=1,如果为奇数,那么PF=0.
- 第7位SF,符号标志位。
它记录相关指令执行后,其结果(实际结果(寄存器中存放的结果)并非逻辑结果)是否为负。如果结果为负,SF=1,如果非负,SF=0。CPU在执行ADD等指令的时候,包含了两种含义。将得到用同一种信息记录的两种结果,关键在于我们的程序需要哪一种结果。SF标志就是CPU对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。
- 第0位CF,进位标志位。
一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高位向更高位的进位值,或从更高位的借位值。
- 第11位OF,溢出标志位。
一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1,如果没有,OF=0。CF 是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位。
- adc带进位加法指令,它利用了CF位上记录的进位值。
指令格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
加法:1低位相加;2高位相加再加上低位相加产生的进位值
下面指令和add ax,bx具有相同的结果
Add al,al
Adc ah,ah
- sbb 带借位减法指令,它利用了CF位上记录的借位值。
格式:sbb 操作对象1,操作对象2
功能:操作对象1=程序对象1-程序对象2-CF
Sbb ax,bx实现的功能:(ax)=(ax)-(bx)-CF
- cmp 比较指令,cmp的功能相当于减法指令,只是不保存结果。Cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2 但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。
cmp ax,bx ;无符号数的比较
如果(ax)=(bx)则(ax)-(bx)=0,所以:ZF=1;
如果(ax)≠(bx)则(ax)-(bx)≠0,所以:ZF=0;
如果(ax)<(bx)则(ax)-(bx)将产生借位,所以:CF=1;
如果(ax)≥(bx)则(ax)-(bx)不必借位,所以:CF=0;
如果(ax)>(bx)则(ax)-(bx)既不借位,结果又不为0,所以:CF=0并且ZF=0
如果(ax)≤(bx)则(ax)-(bx)既可能借位,结果可能为0,所以:CF=1或ZF=1。