汇编学习(六)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

       
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值