标志位
ZF 标志
add``sub``mul``div``inc``or``and的运算结果为0,则zf=1反之zf=0
PF 标志
运算结果的1的个数是偶数,则pf=1,是奇数,则pf=0
0个1也是偶数
mov al,1add 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,98Hadd al,al ; 10011000B(98h)+10011000B(98h)=(1)00110000B(130h) 向高位进位 1, cf=1; 结果 al=30h
mov al,97Hsub al,98H ; 10010111B-10011000B=(1)10010111B-10011000B=11111111B(ffH) 向高位借位, cf=1; 也等于加上 98H 的补码
OF 标志
有符号运算,溢出标志位
mov al,62H ; 十进制 98add 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 + 201000Hmov ax,001EH ; 保存高位mov bx,F000H ; 保存低位add bx,1000H ; 低16位相加adc ax,0020H ; 高16位相加, 并加上低位的进位
128 位数相加
add128:push axpush cxpush sipush disub ax,ax ; cf 置 0mov cx,8 ; 循环 8 次(128位有8个字,16个字节)s:mov ax,[si] ; 128位数据由低→高排, 循环取出adc ax,[di]mov [si],ax ; 结果保存在 [si] 上inc si ; 不能使用 add si,2 因为会改变 cfinc siinc diinc diloop spop dipop sipop cxpop axret
sbb 指令
带借位的减法,sbb ax,1等价于ax-1-cf
; 计算 003E1000H - 00202000Hmov bx,1000Hmov ax,003EHsub bx,2000Hsbb 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,bhje sadd ah,bhs: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:movsbloop s
movsw
cld
将df设置成0
; 将字符串复制到另一个字符串中assume cs:code,ds:datadata segmentdb 'welcome to masm!'db 16 dup (0)data endscode segmentmov ax,datamov ds,axmov si,0 ; ds:si=data:0mov es,axmov di,16 ; es:di=data:0010mov cx,16cldrep movsbcode endsend
std
pushf/popf
将标志寄存器入栈和出栈
assume cs:codecode segmentstart:mov ax,0push axpopf ; flag=0000hmov ax,0fff0hadd ax,0010h ; ax=(1)0000hpushf ; flag=0047hpop ax ; ax=0047and al,11000101B ; al=45hand ah,00001000B ; ah=00hmov ax,4c00hint 21hcode endsend start
debug 中的表示

1 |
0 |
|
|---|---|---|
OF |
OV |
NV |
SF |
NG |
PL |
ZF |
ZR |
NZ |
PF |
PE |
PO |
CF |
CY |
NC |
DF |
DN |
UP |
