《汇编语言程序设计》实验报告

  • 实验八 BIOS/DOS功能调用与宏指令程序设计
  • 1. 实验目的
  • 2. 实验任务
  • 3.1 BIOS/DOS及宏汇编程序题目设计
  • 3.2 编写代码
  • 3.3 代码分析
  • 3.4 运行测试
  • 4. 实验总结


实验八 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),显示不同的输出内容。
  2. 利用DOS相关功能,在屏幕上输入10个字符存入S1开始的存储单元,将内容逆序输出到屏幕上。
  3. 利用宏功能,实现两个字节单元的内容互换。
  4. 从键盘输入一个字符串(只含英文字母),先将它原样显示一遍,然后将其中的小写字母转为大写字母后再显示一遍。要求使用宏汇编功能实现,观察汇编时宏调用被展开的情况。

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

代码二

;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

代码三

;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

代码四

;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

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 运行测试

dos刷新bios 命令 dos刷bios方法_汇编语言


dos刷新bios 命令 dos刷bios方法_服务器_02

图表 1 代码一测试


dos刷新bios 命令 dos刷bios方法_服务器_03

图表 2 代码二测试


dos刷新bios 命令 dos刷bios方法_宏汇编_04


dos刷新bios 命令 dos刷bios方法_汇编语言_05

图表 3 代码三测试


dos刷新bios 命令 dos刷bios方法_dos刷新bios 命令_06

图表 4 代码四测试


4. 实验总结

  1. 成功运行了汇编语言代码测试,熟悉了汇编语言运行环境
  2. 掌握了汇编语言程序设计数据串操作的基本方法和技能
  3. 学习了很多汇编语言中进行数据串操作的指令,包括MOVS串传送指令,LODS串装入指令,STOS串存储指令,CMPS串比较指令,SCAS串扫描指令等, 并通过本次实验对其进行了相关实践,在课下还是需要对相关的内容不断的复习和不断的练习。
  4. 通过本次BIOS/DOS调用及宏指令程序设计的实验,对汇编语言中的利用宏汇编操作有了新的认识,学习到了在8086系统中汇编语言的相关DOS指令功能,了解并掌握了DOS的简单使用和基本操作,会利用汇编代码实现DOS功能的调用。