• 汇编学习(五)——表处理程序


    (一)串操作指令及重复前缀

    一、串操作指令:

    1、串传送指令:

    (1)指令格式:

    MOVS     dst,rsc
    MOVSB   ;ES:[DI]<--DS:[SI],SI<—SI+/-1,DI<—DI+/-1
    MOVSW   ;ES:[DI]<--DS:[SI];SI<—SI+/-2,DI<—DI+/-2

    (2)指令功能:

    A、将源串的一个元素传送到目的串的相应位置。

    B、后面两种主要是按字节或者按字传送

     

    2、串装入指令

    (1)指令格式:

    LODS         src
    LODSB      ;AL<-DS:[SI],SI+/-1
    LODSW      ;AX<DS:[SI],SI+/-2

    (2)指令功能:

    将源串的一个元素传送给累加器

     

    3、串储存指令

    (1)指令格式:

    STOS      dst
    STOSB     ;ES:[DI]<—AL,DI<—DI+/-1
    STOSW     ;ES:[DI]<—AL,DI<—DI+/-2

    (2)指令功能:

    将累加器的值传送到目的串的一个元素位置

     

    4、串比较指令

    (1)指令格式:

    CMPS    src,dst
    CMPSB  ;DS:[SI]-ES:[SI],SI<-SI+/-1,DI<--DI+/-1
    CMPSW  ;DS:[SI]-ES:[DI],SI<--SI+/-2,DI<--DI+/-2

    (2)指令功能

    A、将两个串对应位置上的元素进行比较,即进行减操作,结果不回送,但影响6个标志位

    B、串比较指令的源操作数是被减数,目的操作数是件数。

     

    5、串搜索指令

    (1)指令格式:

    SCAS    src,dst
    SCASB   ;AL—ES: [DI],DI<—DI+/-1
    SCASW   ;AL—ES: [DI],DI<—DI+/-2

    (2)指令功能:

    用累加器AL或着AX作为被减数,与串的一个元素详见,不送回结果,单影响6个标志位

     

    二、串重复前缀

    1、指令格式:

    REP                 ;若CX不等0,则执行串操作,CX<—CX-1
                        ;若CX等于0,则结束串操作
    PEPR或PREZ          ;若CX不等于0且ZF=1,则执行串操作,CX<-CX-1
                        ;若CX=0或者ZF=0,则结束串操作
    REPNE或REPNZ        ;若CX不等于0且ZF=0,则执行串操作,CX<—CX-1
                        ;若CX=0或ZF=1,则结束串操作

     

    2、注意点:

    (1)使用任何一条串操作指令之前,必须根据对串地址修改的方向对方向标志DF进行修改

    CLD    对方向标志DF清0,即串操作为加
    STD    对方向标志DF置1,即串操作为减

    (2)使用MOVS,LODS,CMOS之前,要对DS和SI初始化,使用MOVS,STOS,CMPS,SCAS前要对ES和DI初始化

    (3)若源串和目的串在同一个段中,ES和DS要初始化成相同的数值。

     

    (二)无符号数和带符号数条件跳转指令

    一、无符号数条件跳转指令

    image

     

    二、有符号数跳转指令

    image

    image

     

    (三)沉底排序

    一、程序流图

    image

    二、程序如下:(从小到大排序)

    DATA SEGMENT
    BUF DW 1234H,5678H,9ABCH,0DEF0H           ;声明数组,但是在储存中,低字节在低位,高字节在高位
        DW 2345H,6789H,0ABCDH,0EF01H
    COUNT EQU ($-BUF)/2
    XF EQU DL
    DATA ENDS
    
    CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
    START:
    MOV AX,DATA                               ;初始化
    MOV DS,AX
    MOV BX,COUNT
    MOV XF,0FFH
    
    NEXT:
    CMP XF,0                                  ;没有交换就退出
    JE EXIT
    
    MOV XF,0                                  ;如果BX为0,就退出
    DEC BX
    JZ EXIT
    
    MOV CX,BX
    MOV SI,OFFSET BUF                         ;BX一直减
    CLD
    
    NEXT1:
    LODSW
    CMP AX,[SI]                               ;如果大于就交换
    JLE NEXT2
    XCHG [SI],AX
    XCHG [SI-2],AX
    MOV XF,0FFH
    
    NEXT2:
    LOOP NEXT1
    JMP NEXT
    
    EXIT:
    MOV AH,4CH
    INT 21H
    CODE ENDS
    END START

     

    (四)对分搜索

    一、程序流图:

    image

    二、程序如下:

    DATA SEGMENT
    BUF DB 00,11,15,21,34,57,60,78,90,97
    KEY DB 11
    DATA ENDS
    
    CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
    START:
    MOV AX,DATA
    MOV DS,AX
    MOV SI,OFFSET BUF
    MOV DI,KEY-BUF
    ADD DI,SI
    MOV AL,KEY
    
    CONT1:
    MOV BX,SI
    ADD BX,DI
    SHR BX,1      ;取中值(右移)
    
    CMP AL,[BX]
    JZ FOUND
    
    CMP BX,SI
    JZ NOFID
    
    CMP AL,[BX]
    JC LESS
    
    MOV SI,BX
    JMP CONT1
    
    LESS:
    MOV DI,BX
    JMP CONT1
    
    NOFID:
    MOV BX,-1
    
    FOUND:
    MOV AH,4CH
    INT 21H
    CODE ENDS
    END START
  • 相关阅读:
    Flowable学习笔记(二、BPMN 2.0-基础 )
    Flowable学习笔记(一、入门)
    只有程序员才懂的幽默
    Navicat自动备份数据库
    两个原因导致Spring @Autowired注入的组件为空
    设计模式—— 十二 :代理模式
    设计模式—— 十 一:建造者模式
    SpringBoot学习笔记(十一:使用MongoDB存储文件 )
    Swagger API文档集中化注册管理
    Spring Boot2从入门到实战:集成AOPLog来记录接口访问日志
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/5072161.html
Copyright © 2020-2023  润新知