《汇编语言程序设计》实验报告
- 实验八 BIOS/DOS功能调用与宏指令程序设计
- 1. 实验目的
- 2. 实验任务
- 3.1 BIOS/DOS及宏汇编程序题目设计
- 3.2 编写代码
- 3.3 代码分析
- 3.4 运行测试
- 4. 实验总结
实验八 BIOS/DOS功能调用与宏指令程序设计
1. 实验目的
- 掌握汇编语言程序设计的基本方法和技能
- 掌握汇编语言源程序的编辑汇编连接和执行的完整过程
- 通过上机操作理解宏定义、宏调用、宏展开的概念,熟练运用宏功能编写程序
- 掌握BIOS/DOS基础功能的实现调用方法
- 理解常用的DOS功能调用的基本使用,能熟练运用1号,2号,9号,10号DOS功能调用编写字符的输入输出程序,掌握上机调试的方法
2. 实验任务
- 熟悉汇编语言环境,熟练汇编语言的编写
- 学习BIOS/DOS功能和宏汇编的汇编语言程序的设计和调试
- 加深对汇编语言宏汇编操作和宏汇编指令的理解
- 加深对汇编语言整体的认识和把握
- 掌握在汇编语言中BIOS/DOS功能调用及宏汇编的实现方法和流程
- 实验步骤
3.1 BIOS/DOS及宏汇编程序题目设计
- 利用DOS相关功能,先显示一行输出信息,然后根据输入的不同(Y/N),显示不同的输出内容。
- 利用DOS相关功能,在屏幕上输入10个字符存入S1开始的存储单元,将内容逆序输出到屏幕上。
- 利用宏功能,实现两个字节单元的内容互换。
- 从键盘输入一个字符串(只含英文字母),先将它原样显示一遍,然后将其中的小写字母转为大写字母后再显示一遍。要求使用宏汇编功能实现,观察汇编时宏调用被展开的情况。
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 运行测试
图表 1 代码一测试
图表 2 代码二测试
图表 3 代码三测试
图表 4 代码四测试
4. 实验总结
- 成功运行了汇编语言代码测试,熟悉了汇编语言运行环境
- 掌握了汇编语言程序设计数据串操作的基本方法和技能
- 学习了很多汇编语言中进行数据串操作的指令,包括MOVS串传送指令,LODS串装入指令,STOS串存储指令,CMPS串比较指令,SCAS串扫描指令等, 并通过本次实验对其进行了相关实践,在课下还是需要对相关的内容不断的复习和不断的练习。
- 通过本次BIOS/DOS调用及宏指令程序设计的实验,对汇编语言中的利用宏汇编操作有了新的认识,学习到了在8086系统中汇编语言的相关DOS指令功能,了解并掌握了DOS的简单使用和基本操作,会利用汇编代码实现DOS功能的调用。