zoukankan      html  css  js  c++  java
  • 汇编学习--第十三天

    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

    实验 11 编写子程序

    assume cs:codesg
    datasg segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
    datasg ends
    codesg segment
    start:
        mov ax,datasg
        mov ds,ax
        mov si,0
        call letterc
    
        mov ax,4c00h
        int 21h
    letterc:
        cmp byte ptr [si],97
        jb next
        cmp byte ptr [si],122
        ja next
        and byte ptr [si],11011111b
    next:
        mov cl,[si]
        mov ch,0
        jcxz ok
        inc si
        jmp short letterc
    ok:
        ret
    codesg ends
    end start

     

  • 相关阅读:
    统一前后台数据交互格式
    volatile关键字 学习记录2
    利用AOP与ToStringBuilder简化日志记录
    JAVA的那些数据结构实现总结,实现,扩容说明
    JAVA中的数据结构
    对把JDK源码的一些注解,笔记
    分析下为什么spring 整合mybatis后为啥用不上session缓存
    JAVA内存关注总结,作为个程序员需要对自己系统的每块内存做到了如指掌
    写颗搜索二叉树动动脑,开启今年的旅程,新年快乐
    内存快照排查OOM,加密时错误方法指定provider方式错误引起的OOM
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11204361.html
Copyright © 2011-2022 走看看