admin 管理员组

文章数量: 1184232


2024年1月12日发(作者:web开发专家招聘)

实验指导

一.上机实验的一般步骤和要求:

1.上机前对选定的实验题应有所了解,并写好程序。

2.上机过程中对重要方法和步骤、问题和结果应有记录。

3.所有程序原则上都要通过调试手段运行。

4.实验后进行分析和总结,给出实验报告。

二.实验报告的内容一般有:

1.实验题的内容及要求。

2.思路和方法、算法描述及有注释和说明的程序清单。

3.程序调试和运行的重要步骤、问题和结果。

4.分析和总结。

三.实验环境的建立

参看第二章第一节。通常在WINDOWS XP系统下。如果其他操作系统(如WIN 7),不支持汇编程序工作,可安装Masm for Windows集成实验环境asm20125(支持Win2000、WinXP、WinVISTA、WIN7等操作系统)。/

实验1 上机过程及程序调试

实验目的:

1.通过第二章两个简单实例认识汇编语言程序,初步了解程序格式;段定义;标号;DOS系统功能;操作数;指令;说明语句等作用。

2.掌握汇编语言程序从设计到形成可执行程序文件的方法和步骤。即编辑、汇编、连接。了解汇编语言的系统工作文件和工作环境。理解汇编程序和连接程序的作用。理解列表文件内容。

3.初步了解程序的运行和调试方法。学会使用DEBUG主要命令和常用的DOS命令。

实验内容:

【1】编辑第二章两个简单实例,通过汇编、连接。

【2】用DEBUG对hello程序进行调试。

问题:

(1) 该程序在内存中的起始地址是多少?结束地址是多少?共占几个字节?

(2) 0B63:0008表示什么意思?

(3) 程序中定义的串‘HELLO, WORLD !$’在内存中的起始地址是多少?请用DEBUG命令显示该串。

(4) 如果用带有断点的G命令运行该程序,写出命令。

(5) 用 P命令单步执行程序。

(6) 用T命令跟踪程序,在跟踪执行INT 21时出现什么问题?

(7) 用A命令在偏移地址100H处建立该段程序,并运行。

0

(8) 用W命令把该段程序写成文件,再调入。

实验2 算术及位串处理程序

实验目的:

掌握多数位的算术运算、移位操作、字符串操作等程序的设计,学习使用分支与循环等

基本编程方法,熟练使用DEBUG。

实验内容:

【1】 在数据段预先存放16个十六进制数的ASCII码,首地址为ASC。从键盘输入一位十六进制数到BX,用ASC[BX]寻址方式找到对应数位的ASCII码,并取出显示。

【指导提示】

(1) 16个十六进制数的ASCII码的定义:

ASC DB 30H,31H,32H,33H,34,35H,36H,37H,38H,39H

DB 41H,42H,43H,44H,45H,46H

(2) 把从键盘输入的一位十六进制数(例如大写的D减37H),得到序号13,用该值去定位ASC表,即用ASC[BX]寻址可得到D的ASCII码44H,取出显示。

【2】用16位指令编制程序,处理32位的加减乘除算术四则运算题。

要求:

(1) 所有变量均定义成字类型,其中应有负数。部分变量也可以使用寄存器,在DEBUG下临时给出。程序必须在DEBUG下执行,以便验证结果。

(2) 跟踪程序,记录每条指令执行后的ZF,SF,CF,OF标志。回答每条指令执行后ZF,SF,CF,OF标志设置的理由。

【指导提示】

(1) X DW -6 ;定义16位的负数,在DEBUG下注意观察其值,用R命令设置某寄存器值。

【3】用字符串处理指令编制程序,处理字符串的比较和查找,显示结果。

要求:

(1) 字符串的比较程序中,一个字符串在数据段定义,另一个字符串在程序执行时从键盘输入,必须定义键盘缓冲区。并指出不相等的位置。

(2) 在字符串中查找某个字符,字符串在数据段定义,要查找的字符在程序执行时从键盘输入。并指出找到的位置。

【指导提示】

data segment

mess1 DB 9,?,9 DUP(?) ;定义键盘缓冲区

data ends

ext segment

mess2 db ‘computer software $’

ext ends

code segment

assume cs:code,ds:data,es:ext

start:

mov ax, data

mov ds, ax

mov ax, ext

mov es, ax

2

0

lea dx, mess1 ;输入串到键盘缓冲区

mov ah,10

int 21h

mov cx, mess+1 ;实际输入字符的个数

lea si, mess1+2 ;输入串的实际首地址

lea di, mess2

cld

repe cmpsb

。。。。。。

【4】 AL字节内容反向排序。

【指导提示】 循环移位指令即可。

实验3 分支程序设计

实验目的:

掌握分支与循环程序等基本编程方法。熟悉数制转换。用LOOP指令、条件转移指令和向量地址法实现程序转移。

实验内容:

【1】把BX寄存器中的二进制数用十六进制数格式显示输出。在DEBUG下设置BX寄存器的值。十六进制数用大写表示。

【指导提示】参看例6.4

【2】分离字数组ARRAY中的正、负数,把其中的正数复制到PDATA数组;负数复制到NDATA数组,并分别统计正、负数个数。

【指导提示】

data segment

array dw 2,-2,3,-3,4,5,0 ;定义3个等长的数组

org 10h

pdata dw 7 dup (?)

org 20h

ndata dw 7 dup (?)

org 30h

p db 0 ;2个变量统计正负数个数

n db 0

data ends

code segment

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

lea bx,array

lea si,pdata

lea di,ndata

mov cx,7

kk:

03

mov ax,[bx]

test ax,8000h ;测试正负数

jz zs ;转正数处理

。。。。。。

jmp next

zs:

。。。。。。

next:

add bx,2

loop kk

mov dl,p ;显示正数个数

add dl,30h

mov ah,2

int 21h

mov dl,n

add dl,30h

mov ah,2

int 21h

mov ah,4ch

int 21h

code ends

end start

【3】在数据段定义分支地址表,通过键盘输入数字1~8,实现转移。

要求:

(1) 分支表定义如下:

PTABLE DW P1,P2,P3,P4,P5,P6,P7,P8

(2) P1~P8为标号,如果键盘输入数字3,则从分支地址表PTABLE中取出P3的地址,实现间接转移,标号处的指令只是显示一个信息。

【指导提示】参看例6.3

实验4 循环程序设计

实验目的:

1.掌握和提高循环程序编程技巧,熟悉键盘输入、显示输出等基本人机交互。

2.利用循环程序延时,测算机器的速度。

实验内容:

【1】从键盘输入一个单个字符,显示该字符的ASCII码(十六进制),回车键退出循环,终止程序。

【指导提示】参看例6.7

【2】从键盘输入7位二进制数,显示对应的字符,回车键退出循环,终止程序。

【指导提示】

code segment

assume cs:code

start:

04

mov cx,7

mov dl,0

next:

shl dl,1

mov ah,1

int 21h

。。。。。。

loop next

mov ah,2

int 21h

mov ah,4ch

int 21h

code ends

end start

【3】如果MOV指令占1个时钟周期,INC reg16指令占1个时钟周期,JXX指令占1个时钟周期,LOOP指令占5个时钟周期。利用上面的指令,设计一个二重循环程序(目的是为了扩大延时),执行程序,计算出每秒指令条数,评估该台机器的速度。

例如:

;这里是显示程序运行的开始时间

mov di, 100

p2: mov cx, 10000

p1: inc ax

loop p1

dec di

jnz p2

;这里是显示程序运行的结束时间

要求:

(1) 二重循环的计数初值在DEBUG下给出。

(2 程序运行的开始时间和结束时间由DOS功能调用INT 21H(AH=2CH)测出。

【指导提示】

用(AH=2CH)INT 21H 取系统时间看循环耗时,参附录4说明。在DEBUG下运行程序,通过直接看时间,不需用程序显示时间。

mov ah,2ch ;取系统时间

int 21h

mov si, dx ;dx中的系统时间转送si

mov di, 100

p2: mov cx, 10000

p1: inc ax

loop p1

dec di

jnz p2

mov ah,2ch ;取系统时间

int 21h

5

0

;这里的dx是结束时间

实验5 子程序设计

实验目的:

掌握通用子程序的设计方法,学会子程序的功能划分和正确进行子程序的参数传递。

实验内容:

【1】 采用通过地址表传递参数地址的方法,求数组元素累加和的通用子程序。

【指导提示】

data segment

arry db 16 dup(?)

numb db ?

sum db ?

table dw 3 dup(?)

data ends

code segment

assume cs:code,ds:data

main proc far

push ds

sub ax,ax

push ax

mov ax,data

mov ds,ax

mov table,offset arry

mov table+2,offset numb

mov table+4,offset sum

mov bx, offset table

call sumarry

ret

main endp

sumarry proc near

mov si, [bx]

mov di, [bx+2]

mov cx,[di]

mov di,[bx+4]

xor ax, ax

next: add ax, [si]

add si, 2

loop next

mov [di], ax

ret

prosum endp

code ends

end main

;地址表首地址送bx

;调子程序求和

arry的地址送si

cx

di

06

;地址表;;取元素个数的地址;元素个数送;存放和的地址送

【2】从键盘输入一个十六进制数(不超过四位),显示输出该数的十进制形式。

【指导提示】参看例7.12

【3】从键盘输入一个十进制数(小于65536的正数),显示输出该数的十六进制形式。

【指导提示】参看例7.3

实验6 模块化程序设计

实验目的:

熟悉使用结构变量,掌握多模块程序设计方法,正确使用PUBLIC、EXTRN实现参数传递。

实验内容:

【1】设计一个简单计算器程序,实现整数的加减乘除运算。

要求:

(1)以下两种算式结构可供参考:

算式分离结构:操作数和操作符独立定义为:

OPER1 DW ? ;操作数1

OPERATOR DB ? ;操作符

OPER2 DW ? ;操作数2

算式整体结构:操作数和操作符放在键盘缓冲区,缓冲区可定义为:

MAX DB 10 ;缓冲区大小

REAL DB ? ;实际输入的字节数

BUFF DB 10 DUP(?) ;算式

(2) 从键盘输入算式,只接受不超过4位的十进制正整数。运算结果为不超过65535的整数。

(3) 不接受复合算式,如3+5*6。

(4) 计算器使用运算符‘+-*/’、回车键和‘=’ 键、清除键‘C’。回车键或‘=’

键给出计算结果,清除键‘C’为清0。按清除键后,可接受下一算式。

(5) 程序分算式输入模块、计算模块、输出显示模块。输入模块和计算模块在同一程序文件中,输出显示模块为另一程序文件。

【指导提示】

extrn BTOD:far

data segment

x DW ? ;操作数1

y DW ? ;操作数2

ysf DB ? ;运算符

data ends

code segment

assume cs:code,ds:data

main proc far

push ds

xor ax,ax

push ax

mov ax,data

mov ds,ax

07

call DTOB ;输入一个数,DTOB子程序参看例7.3

mov si,bx ;第一个数转移到si

call getysf ;getysf子程序是接收键入的运算符

call DTOB

;完成2个数的运算,结果放BX

。。。。。。

call BTOD ;调外部子程序输出结果, BTOD子程序参看例7.12

ret

main endp

DTOB proc near

......

DTOB endp

getysf proc near

……

getysf endp

code ends

end main

【2】学生成绩表由姓名、A成绩、B成绩、合计总分四项组成,其中合计总分=A成绩+B成绩。从键盘输入6个人的成绩记录后,输出学生成绩表。

要求:成绩表用结构类型;输入、计算、输出分为3个子程序;成绩为百分制无符号数;合计总分由程序计算;用以下两种方法分别实现。

(1) 成绩从键盘输入后转为压缩BCD码格式存放。

(2) 成绩从键盘输入后转为二进制数格式存放。

【指导提示】

;结构类型定义和变量定义

Scor struc

nam db ‘aaaaaa’ ;name是系统敏感的关键字,不能用。

a dw 0

b dw 0

sum dw 0

Scor ends

Std1 scor 6 dup (< >)

……

;输入成绩(2位数)以BCD码格式存放

Mov ah,1

Int 21h

Mov si,ax

And si,0fh

Mov cl,4

Shl si,cl

mov ah,1

Int 21h

and ax,0fh

08

add si,ax

lea bx,std1

mov [bx].a,si

……

;输入成绩以二进制数格式存放,可参例7.3(从键盘输入十进制数)

;显示输出,可参例7.12(显示十进制数)

;对于以BCD码格式存放的数据,可以方便地输出。

实验7 宏汇编程序设计

实验目的:

结合计算器程序掌握宏汇编技术,利用建立的宏库文件进行文件访问,通过和子程序技术的比较,加深对宏汇编技术的理解,提高编程技巧。

实验内容:

【1】用宏指令实现一个简单计算器程序,要求同实验6【1】

【指导提示】参实验6

【2】建立一个宏库文件,其中包含以文件代号方式对文本文件的建立、打开、读、写文件(或设备)等功能的宏定义,参数不限,但文件名必须为参数。编制程序实现对指定文件的建立、打开、读、写文件(或设备)操作。

【指导提示】

(1)以下为关于文件访问的宏库文件内容

;file.h (文件访问宏库文件)

;用rwmode方式打开fname文件

openh macro fname, rwmode

mov dx, seg fname

mov ds, dx

mov dx, offset fname

mov al, rwmode

mov ah,3dh

int 21h

endm

;用atr属性修改(k=1)/校验(k=0)fname文件

modih macro fname, atr,k

mov dx, seg fname

mov ds, dx

mov dx, offset fname

mov al, k

mov cl, atr

mov ch,0

mov ah, 43h

int 21h

endm

;从handle文件读bytes字节到buf

readh macro buf, bytes, handle

mov dx, seg fname

09

mov ds, dx

mov dx, offset buf

mov cx, bytes

mov bx, handle

mov ah, 3fh

int 21h

endm

;以pmode方式移文件指针,字节数由bytes_h和bytes双字长数据联合指定。

movph macro bytes_h,bytes,pmode,handle

mov cx, bytes_h

mov dx, bytes

mov bx, handle

mov al, pmode

mov ah, 42h

int 21h

endm

;用atr属性建立fname文件

createh macro fname, atr

mov dx, seg fname

mov ds, dx

mov dx, offset fname

mov cl, atr

mov ch, 0

mov ah, 3ch

int 21h

endm

;buf 的bytes字节写到handle文件

writeh macro buf, bytes, handle

mov dx, seg fname

mov ds, dx

mov dx, offset buf

mov cx, bytes

mov bx, handle

mov ah, 40h

int 21h

endm

;关闭handle文件

closeh macro handle

mov bx, handle

mov ah, 3eh

int 21h

endm

(2)文件读写的一般流程:

(2.1)读文件的一般流程是:

010

.ASCII串=文件名(带路径),00H

.打开文件(ASCII串的地址作为调用参数)

.如果成功,获得一个文件代号handle

.根据文件代号handle读出文件的指定字节数到内存缓冲区

.关闭文件

(2.2)写文件的一般流程是:

.ASCII串=文件名(带路径),00H

.建立文件(ASCII串的地址作为调用参数)

.如果成功,获得一个文件代号handle

.根据文件代号handle,把指定的内存缓冲区字节数写到文件

.关闭文件

(3)参看例10.15和例10.16。

实验8 中断程序设计

实验目的:

1.利用系统定时器设计中断处理程序,结合具体机器实现定时显示。

2.监视61H(第4位)端口,以便统计61H端口变化的时间间隔规律。

实验内容:

【1】在系统定时器(中断类型号=8)中断处理程序中,有一条INT 1CH指令,时钟每发生一次中断(约每秒中断18次),都要执行一次中断类型为1CH的处理程序。写一个中断类型为1CH的处理程序,利用时钟中断实现每隔4秒显示系统时间。回车键终止程序。

【指导提示】

参看例9.4,为每隔4秒,程序中设count dw 72, 和MOV count,72

显示系统时间可参实验四。

【2】用一个循环程序,目的是监视61H(第4位)端口有无变化,在发生变化时,读取系统时间,以便统计61H端口变化的时间间隔规律。回车键终止循环程序。

【指导提示】

wait015 proc near

begin: mov ah, 1

int 21h

cmp al,13

je exit

mov cx,0

wait15: in al,61h

and al,00010000b ;61H端口的PB4对应1

cmp al,bl

je wait15

mov bl,al

mov ah,2ch ;读系统时间到DX

int 21h

mov dx

loop wait15

jmp begin

exit:

011

ret

wait015 endp

实验9 输入输出程序设计

实验目的:

1.理解键盘硬件中断和键盘缓冲区。

2.熟悉显示器的字符显示方式和图形显示方式,并利用直接写屏方式或BIOS调用编程。

实验内容:

【1】从键盘缓冲区读出键值,并显示该键的字符和ASCII码,如果是‘Esc’键则退出。程序中不含键盘输入部分,键盘输入通过系统硬件中断送入键盘缓冲区。

【指导提示】

参例10.6

【2】用直接写屏方式实现字符串的水平循环左移,从左边移出,再从右边移入。

【指导提示】

参例10.10, 例10.11

【3】图形方式(AL=13H)下从键盘输入一个八位二进制数,在屏幕上画出对应的绿色矩形波。二进制数1为高电平,高度为40个像素,宽度为20个像素。

【指导提示】

参10.4.2和10.4.3节

012


本文标签: 程序 文件 显示