• 80X86学习笔记源程序组织


    1.顺序结构

    cpu在顺序执行程序片时,按照指令先后次序执行指令,因此在顺序程序中,指令先后次序至关重要。

    例:将一字节压缩BCD转换为两个ASCII码

    DATA SEGMENT

    BC_BUF DB 96H

    ASC_BUF DB 2 DUP(?)

    DATA ENDS

    CODE SEGEMENT

        ASSUME CS: CODE, DS: DATA

    START:   MOV AX, DATA

                    MOV DS, AX

                    MOV AL, BCD_BUF

                    MOV BL, AL

                    MOV CL, 4

                    SHR AL, CL

                    ADD AL, 30H

                    MOV ASC_BUF, AL

                    AND BL, 0FH

                    ADD BL, 30H

                    MOV ASC_BUF + 1, BL

    CODE ENDS

    END START

    例:把一个16进制数字码转换为对应7段代码程序。

    XLAT:该指令寄存器BX内容作为表(每项一个字节)的首地址,把寄存器AL值作为下标,取出表项内容,内容再送AL寄存器,也就是把寄存器AL中的内容转换为表中对应项的值。表最大为256项。

    DSEG SEGMENT

    TAB DB 1000000B, 1111001B, 0100100B, 0110000B

            DB 0011001B, 0010010B, 0000010B, 1111000B

            DB 0000000B, 0010000B, 0001000B, 0000011B

            DB 1000110B, 0100001B, 0000110B, 0001110B

    XCODE DB 8

    YCODE DB ?

    DSEG ENDS

    CSEG SEGMENT

    ASSUME CS: DSEG, DS: DSEG

    START: MOV AX, DSEG

    MOV DS, AX

    MOV  BX, OFFSET TAB

    MOV AL, XCODE

    AND AL, 0FH

    XLAT

    MOV YCODE, AL

    MOV AH, 4CH

    INT 21H

    CSEG ENDS

    END START

    例:利用直接查表法编程完成将内存单元TAB首地址开始存放0~15的平方数表,求出A单元给定数(<=15)的平方值送B单元保存。

    DATA SEGMENT

    TAB DB 0,1,4,9,16,25,36,49,65,81,100,121,144,169,196,225

    A DB 12

    B DB ?

    DATA ENDS

    CODE SEGMENT

    ASSUME CS: CODE, DS: DATA

    START: MOV AX, DATA

    MOV DS, AX

    MOV BX, OFFSET TAB

    MOV AL, A

    XLAT

    MOV B, AL

    CODE ENDS

    END START

    2.分支结构

    在汇编语言中,一般利用条件测试指令和条件转移指令等实现简单的分支。

    例:比较两个无符号数的大小,把大数存入MAX单元

    DATA SEGMENT

    SOURCE DB X1, X2

    MAX DB ?

    DATA ENDS

    CODE SEGMENT

    ASSUME CS: CODE, DS: DATA

    MOV AX, DATA

    MOV DS, AX

    MOV AL, SOURCE

    CMP AL, SOURCE+1

    JNC ONE   ;若没借位

    MOV AL, SOURCE+1

    ONE: MOV MAX, AL

    CODE ENDS

    END

    例:由大到小排列三个数

    DATAS SEGMENT

    BUFFER DB 87, 234, 123

    DATAS ENDS

    CODES SEGMENT

    ASSUME CS: CODES, DS: DATAS

    START: MOV AX, DATAS

    MOV DS, AX

    MOV SI, OFFSET BUFFER

    MOV AL, [SI]

    MOV BL,  [SI+1]

    MOV CL,, [SI+2]

    CMP AL, BL

    JAE NEXT1

    XCHG AL, BL

    NEXT1: CMP AL, CL

    JAE NEXT2

    XCHG AL, CL

    NEXT2: CMP BL, CL

    JAE NEXT3

    XCHG BL, CL

    NEXT3: MOV [SI], AL

    MOV [SI+1], BL

    MOV [SI+2], CL

    INT 21H

    CODES ENDS

    END START

    3.循环结构

    循环通常由四部分组成:

    (1)初始化部分

    (2)循环体部分

    (3)调整部分

    (4)控制部分

    例:在字符数组里找出第一个非0数据,并显示输出其所在数组的下标

    DATA SEGMENT

    ARRAY DB 0,0,016,0,88,66,0,44,33,99

    COUNT  EQU $-ARRAY

    DATA ENDS

    CODE SEGMENT

          ASSUME CS:CODE, DS:DATA

    START:MOV AX, DATA

                 MOV DS, AX

                 MOV CX, COUNT

                MOV DI, –1

    AGAIN:

                  INC DI

                  CMP ARRAY[DI], 0

                  LOOPZ AGAIN

                  MOV DX, DI

                  OR DL, 30H  ;转换为ascii

    DISPLAY:

                    MOV AH, 02H

                    INT 21H

                    MOV AH, 4CH

                    INT 21H

    CODE ENDS

                END START

    例:把字符串所有大写字母改为小写字母,设字符串以结尾。

    DATA SEGMENT

    STR DB ‘HOW are u !’, 0

    DATA ENDS

    CODE SEGMENT

               ASSUME CS:CODE, DS: DATA

    START:

                 MOV AX, DATA

                 MOV DS, AX

                 MOV SI, OFFSET STR

    AGAIN:

                  MOV AL, [SI]

                  OR AL, AL   ;测试是否为0

                  JZ OK

                  CMP AL, ‘A’

                  JB NEXT

                  CMP AL, ‘Z’

                  JA NEXT

                  OR AL, 20H       ;加20H

    NEXT:

                 INC SI

                 NMP AGAIN

    OK:

                 MOV AX, 4C00H

                  INT 21H

    CODE ENDS

    END START

  • 相关阅读:
    redis的发布订阅模式pubsub
    django集成celery之callback方式link_error和on_failure
    linux命令和awk
    使用beanstalkd实现定制化持续集成过程中pipeline
    JavaScript实现模糊推荐的input框(类似百度搜索框)
    hadoop streaming编程小demo(python版)
    一个scrapy框架的爬虫(爬取京东图书)
    mongodb生产环境(副本集模式)集群搭建配置
    TensorFlow加载图片的方法
    STC15W408AS简单使用教程-简单的光强检测!
  • 原文地址:https://www.cnblogs.com/seebro/p/2437897.html
Copyright © 2020-2023  润新知