汇编学习--第十三天

11.12 标志寄存器在Debug中的表示

OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1. 
SF sign Flag 符号标志 记录运算结果的符号,结果负时为1. 
ZF zero flag 零标志 运算结果等于0时为1,否则为0. 
CF carry flag 进位标志 最高有效位产生进位时为1,否则为0. 
AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0. 
PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0. 
DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大. 
IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断. 
TF trap flag 陷阱标志 用于调试单步操作

 

of

df

if

sf

zf

af

pf

cf

标志位为1

ov

dn

ei

ng

zr

ac

pe

cy

标志位为0

nv

up

di

pl

nz

na

po

nc

与debug右边的八位一一对应。

11.9 检测比较结果的条件转移

即根据条件来判断是否改变IP

例如jcxz,大多数条件转移指令,通过检测标志寄存器(被cmp影响的寄存器)的相关标志位的结果,来判断是否修改IP。

无符号数比较:检测zf,cf

有符号及比较:检测sf,of,zf

指令 含义 检测的相关标志位
je 等于则转移 zf=1
jne 不等于则转移 zf=0
jb 低于则转移 cf=1
jnb 不低于则转移 cf=0
ja 高于则转移 zf=0且cf=0
jna 不高于则转移 cf=1或zf=1

实现如果(ah)=(bh),则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)

assume cs:code
code segment
start:
    cmp ah,bh
    je s
    add ah,bh
    jmp short ok
    
s:
    add ah,ah
    
ok:
    mov ax,4c00h
    int 21h
code ends
end start

je判断的是zf位置,不管之前有什么命令,只要zf=1,则转移。

assume cs:code
code segment
start:
    mov ax,0
    add ax,0
    je s
    inc ax
s:    inc ax
    mov ax,4c00h
    int 21h
code ends
end start

编程统计data段中数值为8的字节个数,ax保存结果。

assume cs:code
data segment
    db 8,11,81,8,6,63,55,8
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov si,0
    mov cx,8
    mov ax,0
    
s:
    cmp byte ptr [si],8
    jne next    
    inc ax
next:
    inc si
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start

2.编程统计大于8的个数,用ax保存结果。

assume cs:code
data segment
    db 8,11,81,8,6,63,55,8
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov si,0
    mov cx,8
    mov ax,0
    
s:
    cmp byte ptr [si],8
    ja ok
    jmp short next
ok:    
    inc ax
next:
    inc si
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start

3.统计小于8的个数,结果保存在ax

assume cs:code
data segment
    db 8,11,81,8,6,63,55,8
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov si,0
    mov cx,8
    mov ax,0
    
s:
    cmp byte ptr [si],8
    jb ok
    jmp short next
ok:    
    inc ax
next:
    inc si
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start

检测点 11.3

(1)

jb s0

ja s0

(2)

jna s0

jnb s0

11.10 DF标志和串传送指令

 在串指令中,控制每次操作之后si,di的增减。

DF=1  每次操作之后,si,di递增

DF=0  每次操作之后,si,di递减

rep作用:根据cx,反复执行后面的串传送指令

rep movsb(repeat move string byte)

rep movsw(repeat mov string word)

对CF位进行操作

cld( Clear Director):将标志寄存器的df位清0

std(Set Director):将标志寄存器的df位设置为1

1.使用串传送指令,将data段中的第一个字符串复制到他后面的空间中

assume cs:code
data segment
    db 'Welcome to masm!'
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov es,ax
    mov si,0
    mov di,10h
    mov cx,16
    cld
    rep movsb
    
    mov ax,4c00h
    int 21h
code ends
end start

2.利用串传送指令,将F000H段中最后16个字符复制到data段中

assume cs:code
data segment
    db 16 dup (0)
data ends
code segment
start:
    mov ax,data
    mov es,ax
    mov ax,0F000H
    mov ds,ax
    mov si,0ffffh
    mov di,15
    mov cx,16
    std
    rep movsb
    
    mov ax,4c00h
    int 21h
code ends
end start

也可以顺序存储

assume cs:code
data segment
    db 16 dup (0)
data ends
code segment
start:
    mov ax,data
    mov es,ax
    mov ax,0F000H
    mov ds,ax
    mov si,0fff0h
    mov di,0
    mov cx,16
    cld
    rep movsb
    
    mov ax,4c00h
    int 21h
code ends
end start

11.11 pushf和popf

pushf 将标志寄存器的值压入栈中

popf 将标志寄存器的值弹出栈中

检测点11.4

对flag寄存器操作

ax=45h

mov ax,0
push ax
popf;将标志寄存器置
mov ax,0fff0h
add ax,0010h
;ax实际结果为0,应得结果:-16+16=0
;flag寄存器值:0000 0000 0100 0101=69
pushf;将标志寄存器值入栈
pop ax;将标志寄存器值出栈给ax
and al,1100 0101b;0100 0101
and ah,0000 1000b;0000 0000
;所以ax=0000 0000 0100 0101=45h

猜你喜欢

转载自www.cnblogs.com/Mayfly-nymph/p/11204361.html