• 汇编语言实验8:BIOS/DOS功能调用与宏指令程序设计


    实验八 BIOS/DOS功能调用与宏指令程序设计

    1. 实验目的

    1. 掌握汇编语言程序设计的基本方法和技能
    2. 掌握汇编语言源程序的编辑汇编连接和执行的完整过程
    3. 通过上机操作理解宏定义、宏调用、宏展开的概念,熟练运用宏功能编写程序
    4. 掌握BIOS/DOS基础功能的实现调用方法
    5. 理解常用的DOS功能调用的基本使用,能熟练运用1号,2号,9号,10号DOS功能调用编写字符的输入输出程序,掌握上机调试的方法

    2. 实验任务

    1. 熟悉汇编语言环境,熟练汇编语言的编写
    2. 学习BIOS/DOS功能和宏汇编的汇编语言程序的设计和调试
    3. 加深对汇编语言宏汇编操作和宏汇编指令的理解
    4. 加深对汇编语言整体的认识和把握
    5. 掌握在汇编语言中BIOS/DOS功能调用及宏汇编的实现方法和流程
    6. 实验步骤

    3.1 BIOS/DOS及宏汇编程序题目设计

    1. 利用DOS相关功能,先显示一行输出信息,然后根据输入的不同(Y/N),显示不同的输出内容。
    1. 利用DOS相关功能,在屏幕上输入10个字符存入S1开始的存储单元,将内容逆序输出到屏幕上。
    1. 利用宏功能,实现两个字节单元的内容互换。
    1. 从键盘输入一个字符串(只含英文字母),先将它原样显示一遍,然后将其中的小写字母转为大写字母后再显示一遍。要求使用宏汇编功能实现,观察汇编时宏调用被展开的情况。

    3.2 编写代码

    代码一

    ;1. 利用DOS相关功能,先显示一行输出信息,然   后根据输入的不同(Y/N),显示不同的输出内容。
    
    DATAS SEGMENT
        ;此处输入数据段代码
        TIP DB 'Please input your choice: $'
        Y DB 0DH,0AH,0DH,0AH,'YOUR CHOICE IS RIGHT!',0DH,0AH,'$'
        N DB 0DH,0AH,0DH,0AH,'YOUR CHOICE IS WRONG!',0DH,0AH,'$'
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        ;此处输入代码段代码
    
        MOV AH,09H
        MOV DX,OFFSET TIP
        INT 21H     ;输出字符串TIP
        MOV AH,01H
        INT 21H     ;接收键盘输入
        CMP AL,'Y'
        JE YES
        CMP AL,'y'
        JE YES
        MOV AH,09H
        MOV DX,OFFSET N
        INT 21H     ;输出字符串N
        JMP NEXT
    YES:
        MOV AH,09H
        MOV DX,OFFSET Y
        INT 21H
    NEXT:
        MOV AH,4CH  ;输出字符串Y
        INT 21H
    CODES ENDS
    END START
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    代码二

    ;2. 利用DOS相关功能,在屏幕上输入10个字符存入S1开始的存储单元,将内容逆序输出到屏幕上。
    
    DATAS SEGMENT
        ;此处输入数据段代码  
        S1 DB 10 DUP(?)
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        ;此处输入代码段代码
        XOR SI,SI
        MOV CX,10
    INPUT:
        MOV AH,1
        INT 21H     ;输入一个字符
        MOV S1[SI],AL
        INC SI
        LOOP INPUT
        MOV AH,02H
        MOV DL,0DH
        INT 21H
        MOV DL,0AH
        INT 21H     ;回车换行
        MOV CX,10
        MOV DI,9    ;DI初值为末单元的偏移量
    DISP:
        MOV DL,S1[DI]
        MOV AH,2
        INT 21H     ;输出一个字符
        DEC DI      ;逆序指向下一个单元
        LOOP DISP
        MOV AH,4CH
        INT 21H
    CODES ENDS
    END START
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    代码三

    ;3. 利用宏功能,实现两个字节单元的内容互换。
    
    SWAP MACRO X,Y    ;宏定义
        PUSH AX
        MOV AL,X
        XCHG AL,Y
        MOV X,AL
        POP AX
        ENDM
    
    DATAS SEGMENT
        ;此处输入数据段代码  
        BLOCK1 DB 45H
        BLOCK2 DB 17H
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        ;此处输入代码段代码
        SWAP BLOCK1,BLOCK2  ;宏调用
        MOV AH,4CH
        INT 21H
    CODES ENDS
    END START
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    代码四

    ;4. 从键盘输入一个字符串(只含英文字母),先将它原样显示一遍,然后将其中的小写字母转为大写字母后再显示一遍。要求使用宏汇编功能实现,观察汇编时宏调用被展开的情况。
    
    ;字符串输出,COUNT为字符串长度,STRING为字符串的起始地址
    DISPSTR MACRO COUNT,STRING
        LOCAL NEXT
        PUSH BX
        PUSH CX
        MOV CL,COUNT    ;CL<--字符串长度
        MOV CH,0
        LEA BX,STRING   ;字符串存储的起始地址
    NEXT:
        MOV AH,02H
        MOV DL,[BX]
        INT 21H         ;输出一个字符
        INC BX
        LOOP NEXT
        POP CX
        POP BX
        ENDM
    
    ;小写字母转大写字母
    CHANGE MACRO BUFFER
        LEA BX,BUFFER
    AGAIN:
        MOV AL,[BX]
        CMP AL,'$'
        JE DONE
        CMP AL,'a'
        JAE NEXT1
        JMP DONE1
    NEXT1:
        CMP AL,'z'
        JA DONE1
        SUB AL,20H
        MOV BYTE PTR [BX],AL
    DONE1:
        INC BX
        JMP AGAIN
    DONE:
        ENDM
    
    ;回车换行
    NEWLINE MACRO
        MOV AH,02H
        MOV DL,0DH
        INT 21H
        MOV DL,0AH
        INT 21H
        ENDM
    
    ;主程序
    DATAS SEGMENT
        ;此处输入数据段代码 
        BUFFER DB 200,?,200 DUP(?) 
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        ;此处输入代码段代码
    
        MOV AH,0AH
        MOV DX,OFFSET BUFFER
        INT 21H                     ;接收用户输入字符串
        NEWLINE
        DISPSTR BUFFER+1,BUFFER+2   ;原样输出
        NEWLINE
        CHANGE BUFFER+2             ;小写转大写
        DISPSTR BUFFER+1,BUFFER+2   ;输出结果
    
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    3.3 代码分析

    代码一
    在定义字符串时,采用9号DOS功能调用都需要每个字符串以’$'结尾,若是采用2号DOS功能调用,每次输出一个字符,则不需要使用-结尾,也可以使用2号DOS功能调用借助循环实现字符串的输出,调用9号DOS功能输出字符串的入口参数:AH<–09H;DS:DX<–字符串起始地址。

    代码二
    采用1号DOS功能和2号DOS功能调用,实现逆序输出:1号DOS功能调用的入口参数:AH<–01H;出口参数:AL<–所输入字符的ASCII。执行1号DOS功能调用时,系统等待用户从键盘输入一个字符,将该字符的ASCII码存入AL寄存器,并同时把输入的字符送到屏幕进行显示。2号DOS功能调用的入口参数:AH<–02H;DL<–待输出字符的ASCII码。执行2号DOS功能调用时,在屏幕上显示DL中存放的字符。

    代码三
    在数据段中有BLOCK1和BLOCK2两个字节单元,汇编程序在主程序中调用宏SWAP,传递两个参数BLOCK1和BLOCK2,在宏SWAP中定义数据的交换的具体实现,最终将两个字节单元的内容实现互换。

    代码四
    定义3个宏,分别为DISPSTR:字符串输出,参数为字符串长度和字符串的起始地址;CHANGE:小写字母转大写字母,参数为字符串的起始地址;NEWLINE:换行宏,无参数。在主程序中首先调用DOS功能实现字符串的输入,然后调用NEWLINE宏,调用CHANGE宏实现小写字母转大写字母,最后调用DISPSTR宏将结果输出到屏幕上。

    3.4 运行测试

    在这里插入图片描述
    在这里插入图片描述

    图表 1 代码一测试


    在这里插入图片描述

    图表 2 代码二测试


    在这里插入图片描述
    在这里插入图片描述

    图表 3 代码三测试


    在这里插入图片描述

    图表 4 代码四测试


    4. 实验总结

    1. 成功运行了汇编语言代码测试,熟悉了汇编语言运行环境
    2. 掌握了汇编语言程序设计数据串操作的基本方法和技能
    3. 学习了很多汇编语言中进行数据串操作的指令,包括MOVS串传送指令,LODS串装入指令,STOS串存储指令,CMPS串比较指令,SCAS串扫描指令等, 并通过本次实验对其进行了相关实践,在课下还是需要对相关的内容不断的复习和不断的练习。
    4. 通过本次BIOS/DOS调用及宏指令程序设计的实验,对汇编语言中的利用宏汇编操作有了新的认识,学习到了在8086系统中汇编语言的相关DOS指令功能,了解并掌握了DOS的简单使用和基本操作,会利用汇编代码实现DOS功能的调用。
  • 相关阅读:
    考研数据结构与算法(八)查找
    记笔记!国内怎么操作好现货白银
    day08_分类品牌管理&商品规格管理&商品管理
    【java基础】有参构造和无参构造详解
    华为云云耀云服务器L实例评测|Elasticsearch的可视化Kibana工具安装 & IK分词器的安装和使用
    潮玩游戏潮玩宇宙大逃杀游戏
    【初识Linux】:常见指令(2)
    Textbooks Are All You Need II: phi-1.5 technical report
    pod 创建自定义库失败后解决方案
    【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用
  • 原文地址:https://blog.csdn.net/weixin_52117223/article/details/127784584