汇编语言上天之路(54-59)(标志寄存器)
第五十四到五十九(标志寄存器)标志寄存器就是一个16位的flag的寄存器,每一位都有含义
1514131211109876543210
OFDFIF TF SF ZF AF PF CF
其他空位无特殊意义
ZF:(zero flag)当运算结果为0时置1,否则为0,当al = 80h时,al+al 进位后al也=0,也会置0
PF:当运算结果的二进制1的个数为偶数置1,否则置0
SF:如果当成补码形式,则负数置1,否则置0
CF:(针对无符号数)如果有进位或者借位,则置1
98+98 = 130H,这就产生了进位
97-98 = 197-98 = FF,这就产生了借位
OF:(针对有符号数)如果超过了有符号的最大范围则会溢出,置1
进行有符号的运算
al的范围是-128~127,ax的范围是-32768~32767
如果al超过了-128或者127就会溢出
DF:DF为0 ,则每次操作后SI,DI递增(配合movsb)
DF为1 ,则每次操作后SI,DI递减
adc命令:
adc x,y = x+y+CF标志位
这个可以用来进位的加法
如1EF000H+201000H
mov ax,001EH
mov bx,0F000H
add bx,1000h
adc ax,0020h
sbb命令:
sbb x,y = x-y-标志位
这个可以用来借位的减法
如003E1000H - 00202000H
mov bx,1000H
mov ax,003EH
sub bx,2000H
sbb ax,0020H
cmp指令(cmp x,y)将x和y相减,只改变flag寄存器的值不改变x,y
1.进行无符号操作时候:
ZF = 0,CF = 0,则x > y
ZF = 0,CF = 1,则x < y
ZF = 1,CF = 0,则x = y
(ZF = 1,一定相等,CF = 1,一定X < Y)
2.进行有符号操作时候:
SF = 0,OF = 1,X < Y
SF = 0,OF = 0,X > Y
SF = 1,OF = 1,X > Y
SF = 1,OF = 0,X < Y
je jmp equal ZF = 1
jne jmp not equal ZF = 0
jb jmp below CF = 1
jnb jmp not below CF = 0
ja jmp above CF = 0,ZF = 0
jna jmp not above CF = 1或者ZF = 1
DF标志位:
DF为0 ,则每次操作后SI,DI递增(配合movsb)
DF为1 ,则每次操作后SI,DI递减
movsb:
相当于mov es: = ds:
如果DF=0 ,si = si+1,di = di+1
如果DF=1 ,si = si-1,di = di-1
movsw:
相当于mov es: = ds:
如果DF=0 ,si = si+2,di = di+2
如果DF=1 ,si = si-2,di = di-2
rep配合movsb和movsw:rep movsb/movsw(使用之前要初始化cx)
相当于s:movsb
loop s
cld指令:将df置为0
std指令:将df置为1
pushf:将标志寄存器值去压栈
popf :将标志寄存器值取出栈
实验11:
**** Hidden Message *****
页:
[1]