标志寄存器的作用:
如果是0 zf=1,如果不是0 zf=0
大多运算指令(算术运算,逻辑运算)都是影响标志寄存器的。大多数传送指令是不影响标志寄存器的
运算指令:add sub mul div dec inc or and
传送指令 mov push pop
如果是偶数,则PF为1,否则为0
比如
mov al,1
add al,10
结果为00001011 则pf为0
是负 sf=1
CF是进位标志位。
在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位,或借位。
!!一定要记住CF是对无符号运算的进位或借位。而OF是看有符号运算是否溢出
adc是带进位加法指令
它利用了CF位上记录的进位值
指令格式: adc 操作对象1,操作对象2
功能: 操作对象1=操作对象2+操作对象1+CF
加法分两步:1.低位相加2.高位相加加上低位产生的进位
下面的指令和add ax,bx具有相同的结果
add al,bl
adc ah,bh
adc和add相配合就可以对更大的数据进行加法运算
编写一个子程序,对两个128位数据进行相加,结果存在第一个数的内存空间中
分析一个字节8位,一个字16位,所以128位数据需要8个字的空间
程序如下:
add128:push ax
push cx
push si
push di
sub ax,ax ;将cf置为0
mov cx,8
s:mov ax,[si]
adc ax,[di]
mov [si],ax
inc si
inc si
inc di
inc di
loop s
pop di
pop si
pop cx
pop ax
ret
若把加粗处改为add指令,将影响进位。inc和loop不影响cf的值。
带错位减法指令,利用CF上的借位值
指令格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2-CF
比如计算 003E1000H-00202000H,程序如下
mov bx,1000h
mov ax,003eh
sub bx,2000h
sbb ax,0020h
cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。
同add,sub指令一样,CPU在执行cmp指令的时候,也包含两种含义,进行无符号和进行有符号数运算
当of=0时,逻辑上真正结果的正负=实际结果的正负
当of=1时,实际结果为负,逻辑上真正的结果为正;实际结果为正,逻辑上真正的结果为负。
转移 指的是它能够修改IP,而 条件 指的是它可以根据某种条件,决定是否修改IP
所有条件转移指令的转移位移都是[-128,127]
cmp通常和转移指令,相配合使用。
cmp分两种:
1.有符号 影响sf,of,zf
2.无符号 影响zf,cf
下面是常用的根据无符号数的比较结果进行转移的条件转移指令。
je(zf=1) jne(zf=0) jb(cf=1) jnb(cf=0) ja(cf=0且zf=0) jna(zf=1或cf=1)
e:equal 相等
n:not 不相等
b:below
a:above
这些指令可以不与cmp配合使用
DF:方向标志位。在串处理中,控制每次操作后si和di的递增或递减
df=1 递减
df=0 递增
串传送指令:movsb movsw
一般和rep配合使用
cld 置零 std置1作用
正向传送:
mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb(相当于 mov es:[di],byte ptr ds:[si])
逆向传送:
mov ax,0f000h
mov ds,ax
mov si,0ffffh
mov ax,data
mov es,ax
mov di,15
mov cx,16
std
rep movsb
将标志寄存器压栈和出栈。
在寄存器的后面显示