汇编语言实验指导书

时间:2024.5.8

汇编语言实验指导书

前  言

汇编语言是计算机专业的一门重要的专业基础课,主要介绍汇编语言程序设计的基本原理和方法。汇编语言是一门理论性和实践性较强的课程,辅助课堂教学的实验有助于帮助学生理解汇编语言的基本原理,锻炼学生的动手能力,提高学生的综合应用知识的能力。

本实验指导书按照汇编语言程序设计的教学大纲要求编写。依据循序渐进、由浅入深的规律,通过实例复习巩固所学知识,借助实例开展汇编语言程序设计。通过这种既具有构造性又具有创造性的学习活动,更便于初学者的理解和掌握,通过上机实验,并在实验后完成实验报告,又能进一步加深和拓宽所学知识。为了帮助老师和学生开展实验,我们特编了这本实验指导书,希望能对我校的《汇编语言》教学工作有所帮助。

本实验指导书所有实例均在PC机上调试通过。

目    录

实验1  利用DEBUG调试汇编语言程序段………………………………………54

实验4 汇编语言程序上机过程    63

实验5  分支程序实验……………………………………………………………...65

实验6  循环程序实验……………………………………………………………...68

实验7  子程序实验…………………………………………………………… ….69

实验8  字符处理程序实验…………………………………………………………73

实验9  排序程序设计    77

实验利用DEBUG调试汇编语言程序段

一.实验目的

1.熟悉DEBUG有关命令的使用方法;

2.利用DEBUG掌握有关指令的功能;

3.利用DEBUG运行简单的程序段。

二.实验内容

1.进入和退出DEBUG程序;

2.学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应该试用一下;

3.用DEBUG,验证乘法、除法、加法、减法、带进位加、带借位减、堆栈操作指令、串操作指令的功能。

三.实验要求

1.仔细阅读有关DEBUG命令的内容,对有关命令,要求事先准备好使用的例子;

2.作为例子,准备用A命令,输入在显示器上显示字符“$”的系统调用程序段;

3.编写将AX左移9位的程序段。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.在DOS提示符下,进入DEBUG程序;

2.在DOS目录下启动DEBUG;

3.详细记录每一步所用的命令,以及查看结果的方法和具体结果。

六.实验报告要求

1.如何启动和退出DEBUG程序;

2.整理每个DEBUG命令使用的方法,实际示例及执行结果。

七.思考题

启动DEBUG后,要装入某一个.EXE文件,应通过什么方法实现?

实验2  初级程序的编写与调试实验(一)

一.实验目的

1.进一步熟悉DEBUG命令;

2.掌握数据在内存中的存放方式和内存操作数的几种寻址方式,段寄存器和物理地址计算;

3.熟悉数据传送指令、算术运算指令、逻辑指令、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP;

4.掌握简单的汇编语言程序编写与调试。

二.实验内容

1.内存操作数及各种寻址方式使用;

2.求累加和程序;

3.多字节加法程序;

4.数据串搬家程序;

5.段寄存器概念及字符串传送指令练习。

三.实验要求

1.仔细阅读有关DEBUG命令的内容,对有关命令,要求事先准备好使用的例子;

2.阅读数据传送指令、算术运算指令、逻辑指令、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP的内容;

3.用DEBUG的有关命令调试本实验中的求累加和程序、多字节加法程序、数据串搬家程序段。

四.实验环境

PC微机;

DOS操作系统或 Windows 操作系统;

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境。

五.实验步骤

1内存操作数及各种寻址方式使用

MOV    AX,1234

MOV    [1000],AX

MOV    BX,1002

MOV    BYTE PTR[BX],20

MOV    DL,39

INC      BX

MOV    [BX],DL

DEC     DL

MOV    SI,3

MOV    [BX+SI],DL

MOV    [BX+SI+1],DL

MOV    WORD PTR[BX+SI+2],2846

步骤:

(1) 用A命令键入上述程序,并用T命令逐条运行。

(2) 每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。

注意D命令显示结果中右边的ASCII字符及双字节数存放法。

2.求累加和程序:

程序

MOV       BX,1000

MOV       CX,10

SUB        AX,AX

LOP: ADD     AL,[BX]

ADC    AH,0

INC         BX

J:    LOOP      LOP

INT3

步骤

(1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替;

(2)用命令N  AA 将此程序命名为文件AA(文件名可任取);

(3)用R命令将BX:CX改为程序长度值(即最后一条指令后面的地址减去开始地址;

(4)用命令W 100将此程序存到AA命名的磁盘文件中;

(5)用命令Q退出DEBUG;

(6)用命令DEBUG AA再次调入DEBUG和文件AA,可用U命令检查调入程序;

若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入;

(7)用E命令在内存地址1000H处键入16个数字;

(8)用命令G=100 J(J用实际地址代替),使程序运行并停在断点J上,检查AX,BX的值是否符合你的预计值;

(9)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样,若不一样,检查程序是否有错;

(10)重复G、J与T,再检查AX是否正确;

(11)用G命令使程序运行到结束,检查AX值是否正确。

3.多字节加法程序

程序

MOV   DI,1000

MOV   CX,8

MOV   SI,2000

CLC

LOP:   MOV   AL,[SI]

ADC    [DI],AL

INC     SI

INC     DI

LOOP  LOP

INT     20

步骤

(1) 用命令键入此程序

(2) 用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。

4.数据串搬家程序

(1)用A命令键入下列程序:

MOV  SI,1000

MOV  DI,1500

MOV  CX,0FH

LOP:MOV AL,[SI]

MOV  [DI],AL

INC    SI

INC    DI

LOOP LOP

INT    20

(2)用A命令DB伪指令在1000H键入下列字符串:

‘IBM_PC COMPUTER'

(3)用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。

5.段寄存器概念及字符串传送指令练习

(1) 用A命令键入下列程序:

MOV  SI,0

MOV  DI,0

MOV  AX,1000

MOV  DS,AX

MOV  AX,1500

MOV  ES,AX

MOV  CX,0F

CLD

REP    MOVSB

INT    20

(2) 用A命令DB伪指令在1000:0000处键入字符串'IBM_PC COMPUTER',并用D命检查之

(3) 用D命令检查0F00:1000处内容,看是否一样。为什么?

(4) 用G命令运行此程序,检查目的地址1500:0000处内容。并记下DS与ES值。

(5) 修改此程序,使ES与DS为同一值,以减少一条指令,而源物理地址和目的物理地址(是多少?)仍和原来一样。

6.自编程序

用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同多字节加法程序,调试并做记录。

六.实验报告要求

1.各项实验记录;

2.要求你修改的程序的清单(修改后)和调试记录;

3.自编程序原稿及调试后修正稿,写出原稿错在那里。

七.思考题

1.MOV BYTE PTR[BX],20

 MOV WORD PTR[BX+SI+2],2846

上述指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。

2.用G命令运行多字节加法程序,并用D命令检查其结果(存放在哪里?),是否正确?

3.将多字节加法程序中的INT 20H指令改为INT 3,有何区别?若这条指令不加,行不行?试一试。

4.数据串搬家程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的字符串搬到1002H开始的地方去?修改程序以做到这一点。
        实验初级程序的编写与调试实验(二)

一.实验目的

1.掌握无条件转移指令、条件转移指令;

2.掌握利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法;

3.掌握直接向视频RAM送ASCII码进行屏幕显示的方法;

4.掌握屏幕字符显示程序编写与调试。

二.实验内容

1.  字符、字符串的屏幕显示;

2.  直接向VRAM送ASCII码显示字符;

3.  用字符搜索法确定字符串长度;

4.  16进制数化ASCII码的一般方法(显示内存内容)。

三.实验要求

1.  仔细阅读有关无条件转移指令、条件转移指令的内容;

2.  阅读利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的内容;

3.阅读实验指导书中的字符串屏幕显示程序、字符屏幕显示程序、直接向VRAM送ASCII码显示字符程序、用字符搜索法确定字符串长度程序、16进制数化ASCII码的一般方法的程序段,调试上述程序。

四.实验环境

PC微机;

DOS操作系统或 Windows 操作系统;

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境。

五.实验步骤

1.利用INT 21  0AH号功能调用显示字符串。

(1)用A命令在100H处键入下列程序:

MOV  AH, 9

MOV  DX,110

INT    21

INT    20

(2)用A命令在110H处键入下列字符串的ASCII码:

DB     'This is a sample!$'

(3)用N命令和W命令将此程序(包括数据区)存入文件名为AA.OM的磁盘文件中。(存入前BX:CX必须置为文件长度值)。

(4)用Q命令退出DEBUG。

(5)在DOS命令下打AA,运行此程序,即在屏幕上显示'This is a sample!'字符串,若不出现,用DEBUG检查程序有无错误。

2.利用INT 21H 2号功能显示字符

(1)用A命令在100H处键入下列程序:

XOR   DL,DL

MOV  CX,100

LOP:   MOV AH,2

INT    21

INC    DL

PUSH CX

MOV  CX,8

DELY: PUSH CX

MOV  CX,0

J:     LOOP  J

POP    CX

LOOP DELY

POP    CX

LOOP  LOP

INT    20

(2)用G命令运行程序,即在屏幕上依次缓慢的显示256个ASCII字符。仔细观察每个字符,和IBM-PC ASCII码表对照,看07H-0DH处控制字符显示结果与表上有何不同?

(3)按CTRL+BREAK退出此程序,若一次不行可多做几次。

3.直接向VRAMASCII码显示字符

(1)用A命令在100H处键入下列程序

MOV  AX,B000

MOV  DS,AX

XOR   AL,AL

XOR   BX,BX

MOV  CX,100

LOP:MOV [BX],AL

INC    BX

INC    AL

PUSH CX

MOV  CX,8

DELY:PUSH    CX

MOV  CX,0

J:   LOOP       J

POP    CX

LOOP DELY

POP    CX

LOOP LOP

INT    20

(2)用N命令和W命令将此程序存入BB.COM文件中。(一定要先存入!)

(3)用G命令运行此程序,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT 21H 2号功能调用有何不同?

4.用字符搜索法确定字符串长度

(1)用A命令在100H开始的内存处键入下列程序

JMP    START

DB     'This is the program to measure'

DB     'the length of a string!$'

START: MOV     BX,102

MOV  AL,24

XOR   CL,CL

LOP: CMP   AL,[BX]

JZ       EXIT

INC    BX

INC    CL

JMP    LOP

EXIT:  INT3

(2)用G命令运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样?

5.用字符搜索法确定字符串长度

(1)用A命令在100H处键入下列程序:

MOVSI,0

MOVBL,10

LOP: MOVDL,[SI]

MOVCL,4

SHRDL,CL

CMPDL,0A

JC      J1

ADD   DL,7

J1:  ADD DL,30

MOV  AH,2

INT    21

MOV  DL,[SI]

AND   DL,0F

CMP   DL,0A

JC      J2

ADD   DL,7

J2:  ADD DL,30

MOV  AH,2

INT    21

MOV  DL,20

MOV  AH,2

INT    21

INC    SI

DEC   BL

JNZ    LOP

INT    20

(2)用N,W命令将此程序用CC.COM文件名存入磁盘。

(3)用Q命令退出DEBUG。

(4)在DOS命令状态下直接运行CC.COM命令文件,应在屏幕上显示出内存从0000H开始的16个字节的内容,若有错误,用DEBUG检查之。

(5)自编程序:修改上面程序,使除以16进制数形式显示内存内容外,还能在其右边显示该16进制码所对应的ASCII字符,07-0D的控制字符用'.'代替。

六.实验报告要求

   1、各项实验记录及观察体会。

2、自编程序草稿及调试结果。

七.思考题

利用INT 21H 显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?

实验4 汇编语言程序上机过程

一.实验目的

熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。了解汇编语言程序的汇编、运行环境。

二.实验内容

1.掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;

2.伪指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;

3.利用的INT 21H的1号功能实现键盘输入的方法;

三.实验要求

1.仔细阅读有关伪指令SEGMENT,ENDS,ASSUME,END,OFFSET,DUP的内容;

2.了解利用的INT 21H的1号功能实现键盘输入的方法,了解.EXE文件和.COM文件的区别及用INT 21H 4C号功能返回系统的方法;

3.阅读下面程序段。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM。EXE,LINK。EXE,DEBUG。COM或宏汇编集成环境

五.实验步骤

程序

data         segment

message    db            'This is a sample program of keyboard and disply'

db            0dh,0ah,'Please strike the key!',0dh,0ah,'$'

data         ends

stack        segment    para stack 'stack'

db            50 dup(?)

stack        ends

code         segment

assume     cs:code,ds:data,ss:stack

start:      mov         ax,data

mov         ds,ax

mov         dx,offset message

mov         ah,9

int           21h

again:    mov         ah,1

int           21h

cmp         al,1bh

je             exit

cmp         al,61h

jc             nd

cmp         al,7ah

ja             nd

and          al,11011111b

nd:        mov         dl,al

mov         ah,2

int           21h

jmp          again

exit:      mov         ah,4ch

int           21h

code         ends

end          start

实验步骤

1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。

2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。

3.用TYPE命令显示1产生的.LST文件。

4.用LINK将.OBJ文件连接成可执行的.EXE文件。

5.在DOS状态下运行LINK产生的.EXE文件。即在屏幕上显示标题并提示你按键。每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。按ESC键可返回DOS。若未出现预期结果,用DEBUG检查程序。

六.实验报告要求

汇编,连接及调试时产生的错误,其原因及解决办法。

七.思考题

1.若在源程序中把INT 21H的'H'省去,会产生什么现象?

2.把 INT 21H  4CH号功能改为 INT 20H,行不行?

实验5  分支程序实验

一.实验目的

1.  掌握分支程序的设计方法;

2.  掌握利用DEBUG修改参数、检查结果的方法;

3.  熟悉汇编语言源程序的编辑、汇编、连接及调试过程。

二.实验内容

1.编写一个程序,显示AL寄存器中的两位十六进制数

2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

三.实验要求

1.编写实验内容要求的两个程序;

2.写出调试以上程序,即修改程序参数,检查结果的操作方法;

3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1. 用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。

2.对其进行汇编及连接,产生.EXE文件。

3.对.EXE文件进行调试运行。

(1)用DEBUG调试运行,学会修改AL内容的方法;

(2)对DSPKEY.EXE键入不同的字符,分别进行调试;

(3)在MS-DOS下运行这两个.EXE文件。

六.实验报告要求

1.画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。

2.说明本实验是如何利用DEBUG进行调试的。

七.思考题

    编写显示AX中四位十六进制数程序,画出程序的流程图。

 

实验参考程序清单

(1)      显示AL中两位十六进制数程序:

;DISPHEX.ASM

CODE SEGMENT

      ASSUME CS:CODE

START:MOV AL,3EH

       MOV BL,AL

       MOV DL,AL

       MOV CL,4

       SHR DL,CL

       CMP DL,9

       JBE NEXT1

       ADD DL,7

NEXT1:ADD DL,30H

       MOV AH,2

       INT 21H                  ;显示高位ASCII码

       MOV DL,BL

       AND DL,0FH

       CMP DL,9

       JBE NEXT2

       ADD DL,7

NEXT2:ADD DL,30H

       MOV AH,2

           INT 21H                  ;显示低位ASCII码

           MOV AH,4CH

           INT 21H

CODE  ENDS                   ;返回DOS

       END START

(2)      显示键入字符程序

;DISPKEY.ASM

CODE   SEGEMENT

         ASSUME CS:CODE

START: MOV AH,1

         INT 21H                     ;等待键入字符,送AL

         CMP AL,0DH                 ;是否是回车符?

         JZ  DONE                   ;是则转DONE退出程序

         CMP AL,’0’

         JB NEXT

         CMP AL,’9’

         JA CHARUP

         MOV DL,AL

         MOV AH,2

         INT 21H

         JMP START

CHARUP:CMP AL,41H

         JB NEXT

         CMP AL,5AH

         JA CHRDN

DISPC: MOV DL,’C’

         MOV AH,2

         INT 21H

NEXT: JMP START

CHRDN:CMP AL,61H

         JB NEXT

         CMP AL,7AH

         JA NEXT

         JMP DISPC

DONE: MOV AH,4CH

        INT 21H

CODE: ENDS

        END START

实验6  循环程序实验

一.实验目的

1.掌握循环程序的设计方法;

2.学会针对不同的问题,选用不同的组织循环的方法;

3.进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

二.实验内容

1.编写一个程序,显示BX寄存器中的两位十六进制数;

2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

三.实验要求

1.编写实验内容要求的两个程序;

2.写出调试以上程序,即修改程序参数,检查结果的操作方法;

3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM;

2.对其进行汇编及连接,产生.EXE文件;

3.对.EXE文件进行调试运行。

(1)用DEBUG调试运行,学会修改AL内容的方法;

(2)对DSPKEY.EXE键入不同的字符,分别进行调试;

(3)在MS-DOS下运行这两个.EXE文件。

六.实验报告要求

画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。

七.思考题

编写一循环程序,测量一字符串长度,并用16进制数显示之。

实验子程序实验

一.实验目的

1.掌握主程序与子程序之间的调用关系及调用方法;

2.掌握子程序调用过程中近程调用与远程调用的区别;

3.掌握通过堆栈转送参数的方法。

二.实验内容

1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。

2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

三.实验要求

1.第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。

2.第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。

3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。

4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图; 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)

2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。

3.检查程序执行的结果是否正确。

六.实验报告要求

1.说明用堆栈传送参数的过程及其具体方法。

2.分析实验结果及所遇到问题,并说明解决的方法。

七.思考题

分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。

参考程序清单

 1.码型转换程序清单:

;CONV.ASN

DATA   SEGMENT

BUF     DB 0ABH,0CDH,0DEH,01H,02H,03H

DB 3AH,4BH,5CH,6FH

DATA   ENDS

CODE   SEGMENT

         ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

         MOV DS,AX

         MOV CX,10

         LEA   BX,BUF

AGAIN: MOV  AL,[BX]

         CALL   HEXASC

         INC   BX

         LOOP   AGAIN

         MOV  AH,4CH

         INT 21H

HEXASC PROC NEAR

MOV DL,AL

PUSH   CX

MOV   CL,4

SHR    DL,CL

POP    CX

CALL   DISP   ;显示高位HEX数

MOV    DL,AL

AND    DL,0FH

CALL   DISP

RET

HEXASC ENDP

DISP    PROP

        CMP   DL,9

        JBE    NEXT

        ADD   DL,7

NEXT: ADD  DL,30H

        MOV  AH,2

        INT  21H     ;显示

        RET

DISP    ENDP

CODE   ENDS

        END START

2.统计并显示某键入字符的个数的程序:

         ;COUNTER.ASM

DATA   SEGMENT

CHAR   DB  ‘b’

BUF     DB  50H,? ,50H DUP(?)

DATA   ENDS

MCODE  SEGMENT

         ASSUME CS: MCODE, DS: DATA

START: MOV  AX,DATA

         MOV  DS,AX

         LEA   DX,BUF

         MOV  AH,9

       INT   21H

         LEA   SI  BUF

         MOV  CL, [SI+1]

         MOV  CH, 0   ;CX中为字符串长度

         INC    SI

         INC    SI      ;SI指向串首址TABLE

         MOV  AL,CHAR

         MOV  AH,0     ;AX中为待查字符

         PUSH  SI

         PUSH  CX

PUSH   AX        ; 参数送堆栈

CALL   CHECK

POP    AX   :统计个数在AL中

        MOV   DL,CHAR

        MOV   AH,2

        INT    21H

        MOV   DL,AL

        AND   DL, 0FH

        CMP   DL,9

        JBE    NEXT

        ADD   DL,7

NEXT: ADD  DL,30H

        MOV  AH,2

        INT   21H        ;显示统计个数

        MOV  AH,4CH

        INT  21H

M CODE  ENDS

SCODE   SEGMENT

        ASSUME  CS:SCODE

CHECK  PROC  FAR

         PUSH  BP

         MOV   BP,SP

         MOV   SI,[BP+10]

         MOV   CX, [BP+8]

         MOV   AX, [BP+6]

         XOR   AH, AH

AGAIN: CMP   AL.[SI]

         JNE    NEXT1

         INC    AH

NEXT1: INC    SI

         LOOP  AGAIN

         MOV  AL, AH

         MOV  [BP+10],AX

         POP  BP

         RET  4

CHECK  ENDP

         END  START

实验字符处理程序实验

. 实验目的

1.熟悉串操作指令的功能与应用;

2.掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。

二.实验内容

1.字符串统计。自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。

2.在给定的字符串中,删除重复的字符,其余的字符向前递补。

. 实验要求

1.认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。

2.按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。程序每次执行,都能得到不同的结果。

2.删除字符串中重复字符,要求编写一个在同一个字符串中删除字符,并将其余字符向前递补的程序。

六.实验报告要求

1、对照参考程序,画出程序流程图。

2、总结字符串处理的编程方法,提出改进和完善此类程序的设计方案。

七.思考题

编写程序,在一个字符串中查找匹配字符。

参考程序清单

1.统计小写字母个数的程序清单:

;COUNTDC.ASM

DATA   SEGMENT

STRN   DB 80 DUP(?)

DATA   ENDS

CODE   SEGMENT

           ASSUME CS:CODE, DS:DATA

START: MOV  AX, DATA

MOV  DS, AX

LEA   DI, STAN

MOV  CL, 0

AGAIN: MOV  AH, 1

            INT  21H

CMP  AL,0DH

JZ   DONE

MOV  [DI],AL

INC  DI

INC  DL

JMP  AGAIN

DONE: LEA  SI,STRN

MOV  CH,0

MOV  BL,0

CLD

CYCLE:LODSB

           CMP  AL,61H

CMP  AL,7AH

JA  NEXT

INC  BL

NEXT: LOOP  CYCLE

MOV  AL,BL

MOV  AH,0

MOV  CL,10

DIV  CL                    ;十位数在AL中,个位数在AH中

XCHG  AH,AL         ;以下显示两位十进制数
MOV  DL,AH

OR  DL,30H

INT  21H

MOV  DL,AL

OR  DL,30H

MOV  AH,2

INT  21H

MOV  DL,AL

OR  DL,30H

INT  21H

MOV  DL,AL

OR  DL,30H

INT  21H

MOV  AH,4CH

INT  21H

CODE    ENDS

END START

2.删除字符串中重复字符的源程序清单:

;DELD.ASM

DATA     SEGMENT

STAN     DB 80 DUP(?)

LEN       DB ?

DATA     ENDS

CODE     SEGMENT

ASSUME CS: CODE,DS: DATA,ES: DATA
ATART: MOV  AX, DATA

MOV  DS,AX

MOV  ES,AX

LEA   SI,STRN

MOV  CL,0

AGAIN: MOV  AH,1

INT 21H

CMP  AL,0DH

JZ   DONE

MOV  [SI],AL

INC   SI

INC   CL

JMP   AGAIN

DONE:  MOV  CH,0

MOV  LEN,[CL]

REPEAT: PUSH SI

PUSH CX                   ;CX为内循环记数

PUSH CX                   ;DX为外循环记数

POP  DX

DEC  CX             

JE  NEXT1                 ;是最后一个字符,不再查找重复字符

MOV AL,[SI]

CMP AL,0

JE  NEXT1

COMP:   INC SI

           CMP AL,[SI]

JNE GOON                 ;为非重复字符

MOV BUTE PTR[SI],0

GOON:   LOOP COMP                ;查出与该字符重复的所有字符,并用0替换

NEXT1:  POP DX

POP SI

DEC DX`

JNZ REPEAT                ;对所有重复字符都进行查找

LEA SI,STRN                ;删除重复字符

MOV CL,LEN

MOV CH,0

CYCLE: MOV  AL,[SI] 

CMP  AL,0                    ;是重复字符吗?
JNZ  NEXT                    ;不是,查找下一个字符
DEC  CX                       ;递补字串长度送CX
JZ   DONE                     ;若是最后字符不递补
CALL  DELE                 ;删除该空字符并递补
DEC  SI                        ;对递补子串从头处理
NEXT: INC  SI
LOOP  CYCLE
MOV  AH,4CH
INT  21H
DELE  PROC
PUSH  SI
PUSH  CX
CLD
MOV  DI,SI              ;空字符处为目的首址
INC  SI                    ;下一个地址为源串首址
REP  MOVSB
POP  CX
POP  SI
RET

DELE     ENDP
CODE     ENDS

           END  START

实验9  排序程序设计

一.实验目的

掌握数据排序的一些常用算法,了解数列的有序、无序、升序和降序的概念。

二.实验内容

使用“冒泡排序”法,将内存中10个数据由小到大排序(每个数为16位二进制);

三.实验要求

1.复习排序的几个基本算法;

2.准备数据,按选择好的算法编写源程序。数据以DW定义和键盘输入两种方法提供。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.将编写好的源程序输入,建立源程序文件且存盘;

2.汇编、连接和运行此程序;

3.运行成功后,将程序的数据区建立方式改为键盘输入,由小到大排序改为由大到小排序,修改后重新调试、运行;

4.记录并分析排序的效率。

六.实验报告要求

1.对照参考程序,画出程序流程图。

2.说明所使用算法,是否为最优算法,与你知道的其它算法比较,指出它们的差别。

七.思考题

如果要求显示排序结果,程序应如何修改?

参考程序清单

   code       segment

org       100h

assume  cs:code,ds:code

main:          jmp       start

array           dw        1234h,5673h,7fffh,8000h,0dffh

dw        0ab5h,0369h,005fh,5634h,9069h

count          equ       $-array

start:           mov      cx,count

shr        cx,1

dec       cx

mov      bl,-1

again:          mov      dx,cx

and       bl,bl

je          exit

xor       bl,bl

xor       si,si

again1:        mov      ax,array[si]

cmp      ax,array[si+2]

jle         nchg

xchg     array[si+2],ax

mov      array[si],ax

mov      bl,-1

nchg:          inc        si

inc        si

dec       dx

jnz        again1

loop      again

exit:            int        20h

code            ends

end       main

实验10  计算机钢琴程序

一.实验目的

1.掌握利用PC机扬声器发出不同频率声音的方法;

2.学习利用系统功能调用从键盘上读取字符的方法。

二.实验内容

编写程序,使PC机成为一架可弹奏的“钢琴”。当按下数字键1-8时,依次发出1,2,3,4,5,6,7,I八个音调。当按下CTRL-C,则退出“钢琴”状态。

三.实验要求

1.了解PC机发音的原理;

2.编写发音程序。

PC机扬声器电路图如下:

汇编语言实验指导书

通过给8253定时器装入不同的计数值,可以使其输出不同频率的波形。当与门打开后,经过放大器的放大作用,便可驱动扬声器发出不同频率的音调。要使音调的声音持续一端时间,只要插入一端延时程序之后,再将扬声器切断(关闭与门)。

另外,要使计算机成为可弹奏的钢琴,需要使用系统调用的01H功能以接收键入字符,并且要建立一张表,使键入字符与频率构成一个对应关系。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.将编写好的源程序输入,建立源程序文件且存盘;

2.汇编、连接和运行此程序;

3.运行成功后,改变常数或频率值,看看声音的变化。

六.实验报告要求

1.实验记录和体会。

2.自编程序。

七.思考题

如果要演奏高音、低音,程序应如何修改?

程序框图如下

 

实验11  键盘和窗口程序

一.实验目的

1.掌握利用INT 16H 2号功能调用实行键盘输入的方法;

2.熟悉键盘的扫描码和ASCII码的关系;

3.掌握利用INT 10H功能调用实现窗口功能的方法。

二.实验内容

1.编写键盘输入程序;

2.编写设置屏幕窗口程序。

三.实验要求

1.复习INT 16H  2号功能调用;

2.阅读键盘的扫描码和ASCII码的关系的内容;

3.复习INT 10H功能。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.将键盘输入程序输入,建立源程序文件且存盘;

2.汇编、连接、运行此程序,观察并记录各个键的扫描码,ASCII码及对应字符。汇编、连接和运行此程序;

3.将窗口程序输入,建立源程序文件且存盘;

4.汇编、连接、运行此程序,观察按不同键所产生的效果。

六.实验报告要求

1.对照参考程序,画出程序流程图。

2.记录程序运行结果。

七.思考题

窗口程序所产生的窗口效果有何缺陷?试修改之。

参考程序清单

1.键盘输入程序

PRO_NAM  SEGMENT

ASSUME    CS:PRO_NAM

ORG     100H

AGAIN:      MOV    AH,0

INT      16H

MOV    BX,AX

CALL   BINIHEX

MOV    AH,2

MOV    dl,20h

INT      21H

MOV    DL,BL

MOV    AH,2

INT      21H

MOV    DL,0DH

MOV    AH,2

INT      21H

MOV    DL,0AH

MOV    AH,2

INT      21H

JMP      AGAIN

INT      20H

BINIHEX    PROC   NEAR

MOV    CH,4

ROTATE:    MOV    CL,4

ROL     BX,CL

MOV    AL,BL

AND     AL,0FH

ADD     AL,30H

CMP     AL,3AH

JL         PRINT

ADD     AL,7

PRINT:       MOV    DL,AL

MOV    AH,2

INT      21H

DEC     CH

JNZ      ROTATE

RET

BINIHEX    ENDP

PRO_NAM  ENDS

END     AGAIN

2窗口程序

code            segment

assume  cs:code,ss:code

org       100h

start:           mov      ax,600h

mov      cx,0

mov      dx,184fh

mov      bh,7

int        10h

pos:            mov      ah,2

mov      dx,101eh

mov      bh,0

int        10h

mov      cx,20

get:             mov      ah,1

int        21h

cmp      al,1bh

jz          exit

loop      get

mov      ax,601h

mov      cx,81eh

mov      dx,1031h

mov      bh,7

int        10h

jmp       pos

exit:            int        20h

code            ends

end       start

实验12  磁盘文件操作程序

一.实验目的

1.掌握利用FCB进行磁盘文件读写的方法;

2.掌握利用HANDLE进行磁盘文件读写的方法;

3.INT 21H的0FH、10H、14H、15H、16H、1AH号功能调用;

4.INT 21H的3CH、3DH、3FH、40H号功能调用。

二.实验内容

1.编写文本文件内容显示程序;

2.编写磁盘文件拷贝程序。

三.实验要求

1.复习INT 21H  0FH、10H、14H、15H、16H、1AH、3CH、3DH、3FH、40H号功能调用

2.阅读有关磁盘文件的FCB、HANDLE的内容。

四.实验环境

PC微机

DOS操作系统或 Windows 操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.将文本文件内容显示程序输入,建立源程序文件且存盘;

2.输入,汇编,连接此程序,用DEBUG将目的程序带参数调入,用D命令观看并记录PSP中的FCB内容。

3.将磁盘文件拷贝程序输入,建立源程序文件且存盘;

4.汇编、连接、运行此程序,观察按不同键所产生的效果。

六.实验报告要求

1.对照参考程序,画出程序流程图;

2.实验中产生的问题及体会;

3.实验记录。

七.思考题

按COPY AAA BBB 格式要求改写此程序,取消人机对话,源文件和目的文件名由命令行输入。

 参考程序清单

1.文本文件内容显示程序:

stack           segment stack

db         100h dup(?)

stack           ends

data            segment

fcb              db         36 dup(0)

count          db         0

char            db         0

dta              db         0

errmsg        db         'file access error'

data            ends

code            segment

main           proc      far

assume  cs:code,ss:stack

start:         push      ds

sub       ax,ax

push      ax

mov      ax,data

mov      es,ax

assume  es:data

mov      si,5ch

mov      di,offset fcb

mov      cx,12

cld

rep        movsb

mov      ds,ax

assume  ds:data

mov      dx,offset dta

mov      ah,1ah

int        21h

mov      dx,offset fcb

mov      ah,0fh

int        21h

cmp      al,0

jnz        error

mov      word ptr fcb+0ch,0

mov      word ptr fcb+0eh,1

mov      fcb+20h,0

again:       lea        dx,fcb

mov      ah,14h

int        21h

cmp      al,0

jnz        error

mov      al,dta

cmp      al,1ah

jz          eof

cmp      al,9

jz          tab

call       dispchar

inc        char

cmp      dta,0ah

jnz        again

mov      char,0

inc        count

cmp      count,24

jnz        again

mov      ah,0

int        16h

mov      count,0

jmp       again

tab:          mov      al,' '

call       dispchar

inc        char

test       char,7

jz          again

jmp       tab

eof:          lea        dx,fcb

mov      ah,10h

int        21h

ret

error:        lea        bx,errmsg

call       display

ret

display        proc

mov      cx,30

disp1:       mov      al,[bx]

call       dispchar

inc        bx

loop      disp1

mov      al,0dh

call       dispchar

mov      al,0ah

call       dispchar

ret

display        endp

dispchar      proc

push      bx

mov      bx,0

mov      ah,14

int        10h

pop       bx

ret

dispchar      endp

main           endp

code            ends

end       start

2、磁盘文件拷贝程序(参考)

stack           segment stack

db         100h dup(9)

stack           ends

;

data            segment

sfile            db         64

db         ?

db         64 dup(' ')

dfile            db         64

db         ?

db         64 dup(' ')

ask1            db         0ah,0dh,'please input source'

db         'file name:','$'

ask2            db         0ah,0dh,'please input destnation'

db         'file name:','$'

note            db         0ah,0dh,'please insert diskettes'

db         'and strike any when ready ','$'

er1              db         0ah,0dh,'create error $'

er2              db         0ah,0dh,'open error$'

er3              db         0ah,0dh,'read error$'

er4              db         0ah,0dh,'write error$'

er5              db         0ah,0dh,'close source file error'

er6              db         0ah,0dh,'close dest file error'

bufr            dw        ?

data            ends

code            segment

assume  cs:code,ds:data,ss:stack

start            proc      far

push      ds

sub       ax,ax

push      ax

mov      ax,data

mov      ds,ax

mov      es,ax

lea        dx,ask1

call       disp

lea        dx,sfile

call       inpt

mov      cl,sfile+1

xor       ch,ch

mov      si,cx

mov      [si+sfile+2],0

lea        dx,ask2

call       disp

lea        dx,dfile

call       inpt

mov      cl,dfile+1

xor       ch,ch

mov      si,cx

mov      [si+dfile+2],0

lea        dx,note

call       disp

mov      ah,7

int        21h

call       copy

ret

start            endp

disp            proc

mov      ah,9

int        21h

ret

disp            endp

inpt             proc

mov      ah,0ah

int        21h

ret

inpt             endp

copy           proc

mov      ah,3ch

lea        dx,dfile+2

mov      cx,20h

int        21h

lea        dx,er1

mov      bx,ax

jc          err

mov      bufr,ax

mov      ah,3dh

mov      al,0

lea        dx,sfile+2

int        21h

lea        dx,er2

mov      bx,ax

jc          err

r_w:         mov      cx,10h

mov      ah,3fh

lea        dx,sfile+2

int        21h

lea        dx,er3

jc          err

or         ax,ax

je          exit

mov      ah,40h

lea        dx,sfile+2

xchg     bufr,bx

int        21h

lea        dx,er4

jc          err

xchg     bufr,bx

jmp       r_w

exit:         mov      ah,3eh

int        21h

lea        dx,er5

jc          err

xchg     bufr,bx

mov      ah,3eh

int        21h

lea        dx,er6

jc          err

ret

err:           mov      ah,3eh

int        21h

xchg     bufr,bx

mov      ah,3eh

int        21h

call       disp

ret

copy           endp

code            ends

end       start

更多相关推荐:
C语言实验指导及报告模板

语言程序江西理工大学设计1C附件1实验报告模板C语言程序设计实验报告实验一简单的C程序教学班级冶金136学号01姓名张博课程教师胡春安实验教师胡春安完成时间20xx20xx学年第1学期江西理工大学2实验一简单的...

行政案例方法与实例实验指导书

前言行政案例分析课程的首要特点是强调理论联系实际的学习方法要求学生运用已学的行政学基本理论对当前行政管理领域的重特大事件公共政策规范等进行分析剖析该事件或该公共政策的问题成因探讨解决该问题的可能途径丰富对该类社...

VC++实验指导书

VC程序设计实验指导书张位勇湖南工学院前言VisualC实验环境介绍一VisualC简介VisualC是Microsoft公司的VisualStudio开发工具箱中的一个C程序开发包VisualStudio提供...

Web技术实验指导书

Web技术实验指导书内容简介Web技术是计算机专业学生的一门专业课程着重讲述Web编程的技术方法对于学生从事Web系统的研发使用和维护有重要意义本课程概念多内容涉及面广系统性强通过本课程的学习学生应能从软件硬件...

C_sharp实验指导书

实验指导实验一VS20xx集成开发环境一实验目的熟悉VS20xx开发环境掌握如何在此环境下开发简单的NET应用程序以及调试程序的基本操作技巧二实验要求123熟悉VSNET环境按照C规范正确写源程序能得到正确的程...

设计性实验论文范例与书指导

设计性实验论文范例与书指导,内容附图。

设计性实验论文范例与书指导

设计性实验论文范例与书指导,内容附图。

数据结构实验指导书

数据结构实验教学大纲课程编号020xx3040课程学时学分603实验总学时10课程英文名称DataStructure课程类别技术基础课开出学期第四学期第六学期开出单位实验室信息学院教学机房制定人张丽霞讲师一制定...

数据库原理本科实验指导综合

数据库原理实验指导书数据库原理实验指导书实验一建立数据库一实验目的1了解SQLServer20xx2掌握SQLServer20xx数据库的建立和删除二实验内容1查看SQLServer20xx的所有组件2使用服务...

序号8-0914070030-12-20xx-20xx-01程序设计语言Ⅱ实验指导书

辽东学院自编教材程序设计语言实验指导书齐文编计算机科学与技术专业用辽东学院20xx年12月I目录C概论和输入输出1类和对象6派生类与继承12多态性16IO流与异常处理19面向对象程序设计方法与实例23I实验一实...

实验指导书《大型数据库(Oracle)》

大型数据库Oracle实验指导实验一Oracle安装与维护一实验目的1了解并掌握Oracle10的安装方法2了解并掌握测试安装好的Oracle10g的方法二实验内容及步骤1软件下载Oracle公司针对个人学习之...

数据结构实验指导书(广工)

数据结构作业和实验指导书数据结构课程组广东工业大学计算机学院20xx年3月目录第1章概述11课程教材和实验12作业和实验安排第2章算法设计实验和上机21数据结构习题概述22算法设计的上机作业要求23算法设计上机...

实验指导语(22篇)