当前位置:文档之家› 汇编语言-DOS功能调用

汇编语言-DOS功能调用

福建农林大学计算机与信息学院
(程序设计类课程)
实验报告
课程名称:汇编语言
姓名:
系:计算机系
专业:计算机专业
年级:09级
学号:
指导教师:
职称:
2011年12 月30 日
实验项目列表
福建农林大学计算机与信息学院实验报告
系:计算机专业:计算机科学与技术年级: 2009 姓名:学号:实验室号田507 计算机号 79
实验时间:11.11.22 指导教师签字:成绩:
实验四 DOS功能调用
一、实验目的
(1)学会DOS中关于显示功能调用指令的用法;
(2)领会修改显存方法显示字符。

二、实验内容
1)输入一个字符,显示出来。

2)输入一个字符串,显示出来。

3)BUF开始的3个16位二进制数用十六进制数的形式显示出来。

(1)理解程序
(2)输入程序,汇编,运行(在DOS状态下输入:文件名.EXE),观察结果。

(3)如果要分行显示,程序要如何修改?
DATA SEGMENT
BUF DW 4F59H, 56A8H, 0FF90H
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DA TA
START: MOV AX, DA TA
MOV DS, AX
MOV SI, 0
P: MOV BX, BUF[SI]
MOV CH, 4
L: MOV CL, 4
ROL BX, CL
MOV DL, BL
AND DL, 0FH
CMP DL, 10
JB NEXT
ADD DL, 7
NEXT: ADD DL, 30H
MOV AH, 2
INT 21H
DEC CH
JNZ L
INC SI
INC SI
CMP SI, 4
JNA P
MOV AH, 4CH
INT 21H
CODE ENDS
END START
4)直接改变显存内容显示。

(1)显存空间分配:
内存地址空间中,B8000H-BFFFFH共32KB的空间,为80×25彩色字符模式显示缓冲区。

向这个地址空间写入数据,写入的内容将立即出现在显示器上。

80×25=2000个字符,每个字符在缓冲区中占2个字节,一个字节存放ASCII码,一个字节存放字符属性(字符颜色、字符背景颜色、闪烁、高亮度)
(2)偏移地址计算:
如第2行,第40列:(2-1)×160+40×2 这个偏移地址中存放字符的ASCII码,
(2-1)×160+40×2+1这个偏移地址中存放字符的属性。

第M行,第N列的一般计算公式为:
(M-1)×160+N*2 存放ASCII码
(M-1)×160+N*2+1 存放属性
(3)运行下列程序,在屏幕的第1行,会显示一个字符X。

根据上面(1)、(2)点理解程序段。

STACK SEGMENT
DB 128 DUP (0)
STACK ENDS
CSEG SEGMENT
ASSUME CS: CSEG, SS: STACK
START: MOV AX, STACK
MOV SS, AX
MOV SP, 128
MOV AX, 0B800H
MOV ES, AX
MOV AH, ‘X’
S: MOV ES: [160*1+40*2], AH
MOV AL, 0
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
5)编程显示以下图案。

*********
*******
*****
***
*
6)编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。

三、实验环境
计算机
四、实验步骤及运行结果
1)编写程序:
DATA SEGMENT
BUF DB ?
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
START:
MOV AX,CSEG
MOV DS,AX
MOV AH,1
INT 21H
MOV AL,0
MOV AH,4CH
INT 21H
CSEG ENDS
END START
运行输出:
2)编写程序如下:
DATA SEGMENT
BUF DB 20
DB ?
DB 20 DUP(?)
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA START:
MOV AX,DATA
MOV DS,AX
MOV AH,10
MOV DX,OFFSET BUF
INT 21H
MOV BH,0
MOV BL,BUF[1]
INC BL
INC BL
MOV BUF[BX],'$'
MOV AH,9
MOV DX,OFFSET BUF[2]
INT 21H
CSEG ENDS
END START
运行输出:
3)运行程序(程序修改之前的运行情况):
使用分行显示,编写程序:
DATA SEGMENT
MSG DB 0DH,0AH,'$'
BUF DW 4F59H, 56A8H, 0FF90H
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV SI, 0
P: MOV BX, BUF[SI]
MOV CH, 4
L: MOV CL, 4
ROL BX, CL
MOV DL, BL
AND DL, 0FH
CMP DL, 10
JB NEXT
ADD DL, 7
NEXT: ADD DL, 30H
MOV AH, 2
INT 21H
DEC CH
JNZ L
INC SI
INC SI
LEA DX,MSG
MOV AH,09H
INT 21H
CMP SI, 4
JNA P
MOV AH, 4CH
INT 21H
CODE ENDS
END START
运行输出(修改之后的运行结果):
4)运行程序输出:
5)编写程序如下:
data segment
buf1 db "*********",0ah,0dh,"$"
buf2 db "*******",0ah,0dh,"$"
buf3 db "*****",0ah,0dh,"$"
buf4 db "***",0ah,0dh,"$"
buf5 db "*",0ah,0dh,"$"
data ends
assume cs:code,ds:data
code segment
start:mov ax,data
mov ds,ax
lea dx,buf1
mov ax,0900h
int 21h
lea dx,buf2
mov ax,0900h
int 21h
lea dx,buf3
mov ax,0900h
int 21h
lea dx,buf4
mov ax,0900h
int 21h
lea dx,buf5
mov ax,0900h
int 21h
mov ax,4c00h
int 21h
code ends
end start
运行结果输出如下:
五、总结
通过本次上机实验,我学会了DOS中关于显示功能调用指令的用法,通过实验,更好的领会了修改显存方法来显示字符,这让我更一步的了解了汇编,对以后的学习有很好的帮助。

相关主题