标志位
ZF 标志
add``sub``mul``div``inc``or``and
的运算结果为0
,则zf=1
反之zf=0
PF 标志
运算结果的1
的个数是偶数,则pf=1
,是奇数,则pf=0
0
个1
也是偶数
mov al,1
add al,10; al=00001011B pf=3
SF 标志
计算机的二进制通常使用补码
表示,即无符号129
的补码为10000001B
,这也是有符号-127
的补码
因此129+1=130(10000010B)``-127+1=-126(10000010B)
都是正确的sf
用于记录结果是否为负
,是负则sf=1
,当我们需要数据是有符号的时候,sf
就有意义,不需要的时候就没有意义
CF 标志
无符号运算,进位标志位,记录最高有效位的借位、进位情况
无符号运算,只有正数
mov al,98H
add al,al ; 10011000B(98h)+10011000B(98h)=(1)00110000B(130h) 向高位进位 1, cf=1
; 结果 al=30h
mov al,97H
sub al,98H ; 10010111B-10011000B=(1)10010111B-10011000B=11111111B(ffH) 向高位借位, cf=1
; 也等于加上 98H 的补码
OF 标志
有符号运算,溢出标志位
mov al,62H ; 十进制 98
add al,63H ; 十进制 99
; 结果 c5H, 即无符号十进制 197(正确结果), 有符号的 -59 的补码(错误结果), 此时发生溢出, of=1
mov al,0f0H ; -16 的补码
add al,088H ; -120 的补码
; 结果 78H, 有符号 120 的补码(错误结果)
DF 标志
df=0
每次操作后si``di
增加df=1
每次操作后si``di
减小
指令
adc 指令
带进位的加法,adc ax,1
等价于(ax)+1+cf
,有利于进行更高位数的加法
; 计算 1EF000H + 201000H
mov ax,001EH ; 保存高位
mov bx,F000H ; 保存低位
add bx,1000H ; 低16位相加
adc ax,0020H ; 高16位相加, 并加上低位的进位
128 位数相加
add128:push ax
push cx
push si
push di
sub ax,ax ; cf 置 0
mov cx,8 ; 循环 8 次(128位有8个字,16个字节)
s:mov ax,[si] ; 128位数据由低→高排, 循环取出
adc ax,[di]
mov [si],ax ; 结果保存在 [si] 上
inc si ; 不能使用 add si,2 因为会改变 cf
inc si
inc di
inc di
loop s
pop di
pop si
pop cx
pop ax
ret
sbb 指令
带借位的减法,sbb ax,1
等价于ax-1-cf
; 计算 003E1000H - 00202000H
mov bx,1000H
mov ax,003EH
sub bx,2000H
sbb ax,0020H
cmp 指令
进行sub
操作,但不进行保存
cmp ax,bx
仅进行ax-bx
从而改变cf``of``sf``zf``pf
,但不会把结果保存在ax
上
无符号
zf=1
:(ax)=(bx)
zf=0
:(ax)≠(bx)
cf=1
:(ax)<(bx)
cf=0
:(ax)≥(bx)
cf=0
且zf=0
:(ax)>(bx)
-
有符号
sf=1``of=0
:(ax)<(bx)
sf=1``of=1
:(ax)>(bx)
sf=0``of=0
:(ax)≥(bx)
sf=0``of=1
:(ax)<(bx)
检测结果条件转移
无符号
|je
| 相等跳转 |zf=1
| | —- | —- | —- | |jne
| 不相等跳转 |zf=0
| |jb
| 小于跳转 |cf=1
| |jnb
| 不小于跳转 |cf=0
| |ja
| 大于跳转 |cf=0
且zf=0
| |jna
| 不大于跳转 |cf=1
或zf=1
|
start:cmp ah,bh
je s
add ah,bh
s:add ah,ah
; ah=bh, 则 ah=ah+ah, 否则 ah=ah+bh
注意检测的是标志位,而不是相不相等,即
mov ax,0``add ax,0
的zf=1
也会跳转
串传送
movsb
相当于((es)×16+(di))=((ds)×16+(si))
并且根据df
进行di``si
的增减1
个字节
rep movsb
上面代码等价于
s:movsb
loop s
movsw
cld
将df
设置成0
; 将字符串复制到另一个字符串中
assume cs:code,ds:data
data segment
db 'welcome to masm!'
db 16 dup (0)
data ends
code segment
mov ax,data
mov ds,ax
mov si,0 ; ds:si=data:0
mov es,ax
mov di,16 ; es:di=data:0010
mov cx,16
cld
rep movsb
code ends
end
std
pushf/popf
将标志寄存器入栈和出栈
assume cs:code
code segment
start:mov ax,0
push ax
popf ; flag=0000h
mov ax,0fff0h
add ax,0010h ; ax=(1)0000h
pushf ; flag=0047h
pop ax ; ax=0047
and al,11000101B ; al=45h
and ah,00001000B ; ah=00h
mov ax,4c00h
int 21h
code ends
end start
debug 中的表示
1 |
0 |
|
---|---|---|
OF |
OV |
NV |
SF |
NG |
PL |
ZF |
ZR |
NZ |
PF |
PE |
PO |
CF |
CY |
NC |
DF |
DN |
UP |