汇编学习(六)8086汇编拾遗 (5)
8086 标志寄存器
8086 的最后一个比较重要的寄存器 标志寄存器
状态寄存器的三种作用:
@用来存储相关指令的某些执行结果
@用来为CPU执行相关指令提供行为依据
@用来控制CPU的相关工作方式
ZF标志:
记录相关指令执行后,其结果是否为0,结果为0,zf = 1,不为0 ,zf = 0.
PF标志:
奇偶效验寄存器,记录相关指令执行后,其中所有位中1 的个数是否为偶数,如果1是偶数,pf = 1,如果为奇数pf = 0.
SF标志:
记录相关指令执行后,其结果是否为负,如果为负,sf = 1,否则 sf = 0.在计算机看来,是不分数字的正负的,完全就是靠标志寄存器的SF 的标志的,决定正负数的运算。
CF标志:
进位标志:一般情况下,再进行无符号运算的时候,它记录了,运算结果的最高有效位,向更高有效位的进位或者借位。
OF标志:
溢出指令,再进行有符号数运算的时候,如果超过了机器所能表示的范围称为溢出。
adc 指令:
adc是带进位加法指令,它利用了CF位上记录的进位值。
指令格式:adc 操作对象1,操作对象2
实现功能:(ax) = (ax) + (bx) +CF
这条指令其实就是为了大数相而确定的,例如1EF000H + 201000H,结果高16位ax,低16位bx 中。
mov ax,001EH mov bx,F000H add bx,1000H adc ax,0020H
128位数字加法:
add128:
push ax
push cx
push si
push di
sub ax,ax
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
sbb 指令 带借位减法指令,它利用了CF位上记录的借位值 指令格式: sbb 操作对象1,操作对象2 实现功能:(ax) = (ax) - (bx) -CF cmp 比较指令 比较指令,其实采用的是减法原理比较的。 首先无符号比较: 很简单,参考是否借位就能比较了。 cmp ax,bx zf = 1,ax = bx zf = 0,ax != bx cf = 1,ax < bx cf = 0,ax >= bx cf = 0 and zf = 0,ax > bx cf = 1 or zf = 1 ax <= bx 对于有符号数的比较: cmp ah,bh sf = 1 而 of = 0 ah < bh sf = 1 而 of = 1 ah > bh sf = 0 而 of = 1 ah < bh sf = 0 而 of = 0 ah > bh 检测比较结果的条件转移指令 转移指令根据无符号的比较结果进行转移的条件转移指令 je 等与则转移 zf == 1 jne 不等与则转移 zf = 0 jb 低于则转移 cf = 0 jnb 不低于则转移 cf = 0 ja 高与则转移 cf = 0 zf = 0 jna 不高于则转移 cf = 1 或 zf = 1 DF 标志 向量标志位:在串指令中,控制每次操作后si,di的增减。 df = 0 每次操作后 si di 递增 df = 1 每次操作后si di 递减 movsb movsw 指令相当于以下的几步操作: movsb : ((es)*16 + (di)) = ((ds)*16 + (si)) if(df == 0) (si) = (si) +1 (di) = (di)+1 if(df == 1) (si) = (si)-1 (di) = (di)-1 rep :循环指令 ,一般和movsb movsw 连用 如何决定df 的值,8086又有两个新的专门指令 cld : 设置df = 0 std: 设置df = 1 两个小例子: 将data段中的第一个字符串复制到它后面的空间中
mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb
使用传送指令,将F000H段中的最后16个字符复制到data 段中。
mov ax,0f000h
mov ds,ax
mov si,0ffffh
mov ax,data
mov es,ax
mov di,15
mov cx,16
std
rep movsb
终于最后两个指令了,好累 pushf 和 popf 着两个命令是将标志寄存器压栈,弹栈送入寄存器标志中的命令。只有这两种放方法我们能访问寄存器。 debug 中寄存器的标志位: 标志 1 0 OF OV NF DF DN UP SF NG PL ZF ZR NZ PF PE PO CF CY NC 编写一个程序将以0结尾的字符串小写变大写
assume cs:code
data segment
db "Bejing Tian An Men",0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:
push ax
push bx
push cx
push dx
S:mov ax,ds:[si]
cmp ax,0
je f
inc si
cmp al,'a'
jb S
cmp al.'z'
ja S
add al,'A'-'a'
mov ds:[si-1],al
jmp S
f:
pop dx
pop cx
pop bx
pop ax
code ends
end start
还没有评论,来说两句吧...