您好,欢迎来到花图问答。
搜索
您的当前位置:首页《汇编语言》实验讲义

《汇编语言》实验讲义

来源:花图问答
 汇编语言程序设计实验指导书

《汇编语言程序设计》实验指导书

计算机系 宋勤 2005-5

《汇编语言》实验学时分配表 序号 1 2 3 4 5 6 7 实验项目名称 汇编语言程序上机过程以及调试 顺序程序设计 循环程序设计 分支程序设计 子程序设计 I/O程序设计 实验七 综合程序设计 合计 程序设计 实验学时 课内 2 2 2 2 2 2 2 14 2 14 7 课外 2 2 2 2 2 2 实验报告或作业 1 1 1 1 1 1 1

实验二 汇编语言程序上机过程以及调试

一、预习内容

1. 工具软件MASM、LINK的使用

2. 常用DEBUG命令的使用: G,D,R,T,U,Q 3. 完整程序设计方法的格式。

二、目的要求

1. 掌握常用工具软件MASM、LINK的使用

2. 掌握常用DEBUG命令: G,D,R,T,U,Q 能灵活使用这些命令调试程序 3. 掌握完整程序设计方法的格式,能正确书写数据段,代码段等。

三、实验内容

用两种方法把字符串mess1复制到mess2串中去; (1) 从左到右的方向复制 (2) 从右到左的方向复制

data segment

mess1 db 'my name is songqin $' data ends

EXTRA segment

mess2 db 17 dup(?) EXTRA ends

Page 1 of 25

汇编语言程序设计实验指导书

;************************************************ code segment

assume cs:code, DS:DATA, ES:EXTRA start:

mov ax,DATA MOV ds,ax

mov ax,EXTRA MOV es,ax

leA si,mess1 leA di,mess2

mov cx,017 CLD rep movsB ret

code ends end start

实验步骤:

1)用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:\\masm50下,注意保存时将文件扩展名改为.asm(如P77.asm)。

2)打开桌面的“命令提示符” 程序进入dos命令操作,先用cd masm50 命令改变路经,

接着用 ”masm + 文件名” (如 masm P77,这里文件名可以不带扩展名) 对源文件进行汇编,产生.obj文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。

3)用 ”link + 文件名” (如 link P77;) 将.obj文件连接成可执行的.exe文件(P77.exe)。

4)用debug调试程序,熟悉debug命令的使用:

(1)打 debug P77.exe 进入debug 控制,显示提示符 ‘- ‘。

(2)用命令g执行程序,可得与步骤4相同的结果,也可用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况,并注意标志位有无变化。

(3)用命令u检查键入的程序并记录,特别注意左边的机器码和指令地址。如果一条u命令没有显示完全,可以再次输入u命令,该命令会紧接着上一个命令的输出继续显示。 (4)用命令’g+地址’设置断点,如g06,表示将断点设置在代码段的偏移地址为06h的指令前,并执行到该断点前。其中,命令中的地址项可以从上条命令u的运行结果获得。 (5)用命令r查看各寄存器的情况。 (6)用命令d0查看数据段的情况,0表示从偏移地址0开始,也可以指定其他偏移地址值。 (7)用命令 ‘e+地址’的方式修改数据区的字符串,其中’地址’指需要修改的数据段内存单元偏移地址,可根据上条d0命令获得。如e 09 表示从偏移地址09h开始修改数据。 (8)再次用命令g执行程序,查看执行结果。

Page 2 of 25

汇编语言程序设计实验指导书

(9)用命令q退出debug,如果在上述步骤中碰到异常,可以先用q命令退出后再进入调试。

四、实验报告或作业

1.分析程序,画出程序流程图

2.汇编,连接及调试时产生的错误,其原因及解决办法。 3.思考:

1) 上述实验中用e修改数据段的内容,是否改变原文件P77.asm的内容?

2) 用单步执行命令t运行程序, 运行到mov ax, 4c00h, int 21h指令后,cs和ip寄存器内容前后有何变化,产生变化的原因是什么?

附:DEBUG 使用:

1.打 DEBUG 进入 DEBUG,显示提示符 ‘- ‘。 2.退出DEBUG命令:Q

3.显示内存命令:D 起始地址 结束地址

4.修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。 5.检查寄存器命令:R

标志位显示 1 0

CF CY NC ZF ZR NZ SF NG PL AF AC NA OF OV NV PF PE PO DF DN UP IF EI DI

6.修改寄存器命令:R 寄存器名

7.小汇编命令:A 起始地址,不输入指令打回车键退出A命令。 8.反汇编命令:U 起始地址 结束地址 9.文件命名命令:N 盘号:文件名 10.读文件命令:L 内存地址 11.写文件命令:W 内存地址

10.读扇区命令:L 内存地址 盘号(0--A:,1--B:) 扇区号 扇区数 11.写扇区命令:W 内存地址 盘号 扇区号 扇区数 12.运行命令:G=起始地址 结束(断点)地址

13.单步命令:T=起始地址 运行指令数,进入子程序内部。 14.单步命令:P=起始地址 运行指令数,不进入子程序内部。 15.内存搬家命令:M 起始地址 结束地址 目的地址

标志位显示 1 0

CF CY NC ZF ZR NZ SF NG PL

Page 3 of 25

汇编语言程序设计实验指导书

AF AC NA OF OV NV PF PE PO DF DN UP IF EI DI

6.修改寄存器命令:R 寄存器名

7.小汇编命令:A 起始地址,不输入指令打回车键退出A命令。 8.反汇编命令:U 起始地址 结束地址 9.文件命名命令:N 盘号:文件名 10.读文件命令:L 内存地址 11.写文件命令:W 内存地址

10.读扇区命令:L 内存地址 盘号(0--A:,1--B:) 扇区号 扇区数 11.写扇区命令:W 内存地址 盘号 扇区号 扇区数 12.运行命令:G=起始地址 结束(断点)地址

13.单步命令:T=起始地址 运行指令数,进入子程序内部。 14.单步命令:P=起始地址 运行指令数,不进入子程序内部。 15.内存搬家命令:M 起始地址 结束地址 目的地址

实验二 顺序程序设计

一、预习内容

1.常用工具软件MASM、LINK和DEBUG的使用 2.完整程序设计方法的格式

3.汇编语言顺序结构程序的设计方法

二、目的要求

1.继续熟悉常用工具软件MASM、LINK和DEBUG的使用 2.继续熟悉完整程序设计方法的格式

3.学习与掌握汇编语言顺序结构程序的设计方法

三、实验内容

编程实现datax双字除以字datay(用div),并且把商存入quotient字单元,把余数存入remainder字单元(具体数值可自行确定)。并且用debug查看程序的运行结果,检查程序运行结果的正确性。

DSEG SEGMENT

datax dd 956123h datay dw 123h

quotient dw ? remainder dw ? DSEG ENDS CSEG SEGMENT

assume cs:CSEG, ds:DSEG start:

mov ax, dseg

mov ds, ax

Page 4 of 25

汇编语言程序设计实验指导书

mov ax,datax mov dx,datax[2] div datay mov quotient,ax mov remainder,dx mov ax, 4c00h int 21h

CSEG ENDS end start

实验步骤:

1.用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:\\masm50下,注意保存时将文件扩展名改为.asm(如lab2.asm)。

2.用masm对源文件进行汇编,产生.obj(如lab2.obj)文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。 3.用 link将.obj文件连接成可执行的.exe文件(lab2.exe)。 4.直接运行link产生的.exe文件。

5.用debug调试程序,单步执行程序,并记录黑体部分单步执行后ax,dx,cs,ip寄存器以及标志寄存器的值.

6.在debug状态下,用“a+偏移地址”的方式将程序的div 改为idiv再单步执行黑体部分,对比步骤5的结果,查看有何变化,并记录。 7.修改源程序实现双字datax 与字datay的无符号乘法。

四、实验报告或作业

1.分析程序,画出程序流程图。

2.汇编,连接及调试时产生的错误,其原因及解决办法。 3.步骤5的结果记录。

4.步骤6的结果记录,并分析发生变化的原因。 5.思考:

1) 指令mov dx,datax[2] 改写成 mov dx,[datax+2] 经过汇编后,二者是否相同,为什么?

2) 如何实现双字datax 与字datay的乘法,写出完整的源程序。

实验三 循环程序设计

A---------------------------------------------------A 实验A (必做)

一、 实验目的:

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

2 进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。 3 学会针对不同的问题,选用不同的组织循环的方法。

Page 5 of 25

汇编语言程序设计实验指导书

二、 实验内容

1 编写一个程序,用二进制显示从键盘输入一个字符的ASCII码。

2 编写一个程序,记录某个字存储单元数据中1的个数,以十进制形式显示结果。

三、 实验准备

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

2 写出调试以上程序,即修改程序参数,检查结果的操作方法。 3 熟悉源程序汇编、连接命令的使用方法即要回答的内容。

四、 实验步骤

1 用EDIT或其它编辑软件,编写.ASM源程序,例如Binary.ASM及Statistic.ASM。 2 对其进行汇编及连接,产生.EXE文件。 3 对.EXE文件进行调试运行。

a. 用DEBUG调试运行,学会修改AL内容的方法。 b. 对DSPKEY.EXE键入不同的字符,分别进行调试。 c. 在MS-DOS下运行这两个.EXE文件。

五、 实验报告要求

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

六、 参考程序段清单: ;Binary.asm

mov cx,8 ;CX←8(循环次数)

again: shl bl,1 ;左移进CF,从高位开始显示 mov dl,0 ;MOV指令不改变CF adc dl,30h ;DL←0+30H+CF ;CF若是0,则DL←' 0 ' ;CF若是1,则DL←' 1 ' mov ah,2

int 21h ;显示 loop again

;CX减1,如果CX未减至0,则循环

;Statistic.ASM ;数据段

number dw 1110111111100100B ;代码段

mov bx,number

xor dl,dl ;循环初值:DL←0

again: test bx,0ffffh ;也可以用cmp bx,0 jz done

;全部是0就可以退出循环,减少循环次数 shl bx,1 ;用指令shr bx,1也可以 adc dl,0

Page 6 of 25

汇编语言程序设计实验指导书

;利用ADC指令加CF的特点进行计数 jmp again

done: cmp dl,10 ;判断1的个数是否小于10 jb digit ;1的个数小于10,转移 push dx

mov dl,‘1’ ;1的个数大于或等于10 mov ah,2 ;则要先显示一个1 int 21h pop dx sub dl,10

digit: add dl,‘0’ ;显示个数 mov ah,2 int 21h

A---------------------------------------------------A

B——————————————————————B

实验 B

一、预习内容

1.多重循环程序和排序程序设计方法。 2.带符号数的比较转移指令:JL,JLE,JG,JGE

二、目的要求

1.掌握多重循环程序和排序程序设计方法。 2.掌握带符号数的比较转移指令:JL,JLE,JG,JGE

三、实验内容

建立学生名次表,以grade为首地址的数组中保存了学生的成绩,其中 grade+i 保存学号为i+1的学生的成绩。要求建立一个10个字的rank数组,并根据grade中的学生成绩将学生名次填入rank数组中,其中rank+i的内容是学号为i+1学生的名次(提示:一个学生的名次等于成绩高于该学生的人数加1)

DSEG SEGMENT

grade dw 88,75,95,63,98,78,87,78,90,60 rank dw 10 dup(?) DSEG ENDS CSEG SEGMENT

assume cs:CSEG, ds:DSEG start:

mov ax, dseg mov di,10 mov bx,0

loop:

mov ds, ax

Page 7 of 25

汇编语言程序设计实验指导书

mov dx,1 mov cx,10 ②

next:

cmp ax,[si] jge no_count inc dx

no_count:

add si,2 loop next ③ add bx,2

④ jne loop mov ax, 4c00h int 21h

CSEG ENDS end start

实验步骤:

1.输入,汇编并连接此程序。

2.在DEBUG下运行此程序,记录运行结果。

3.将转移指令JGE改为JG,JL,JLE分别运行记录排序结果,察看结果是否正确不对,并分析原因。

四、实验报告或作业

1.分析程序,画出程序流程图

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

3.记录JGE情况下的排序结果,同时比较将转移指令JGE改为JG,JL,JLE 时的排序结果,并分析结果正确与否,如果不正确,写出原因和解决办法。 4.思考:

如果想外循环也用loop实现,应该怎样修改程序?

B——————————————————————B 实验四 分支程序设计

A---------------------------------------------------A

实验A (必做)

一、 实验目的:

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

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

3 掌握汇编语言源程序的编辑、汇编、连接及调试过程。

Page 8 of 25

汇编语言程序设计实验指导书

二、 实验内容

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

2 编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或

a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

三、 实验准备

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

2 写出调试以上程序,即修改程序参数,检查结果的操作方法。 3 熟悉源程序汇编、连接命令的使用方法即要回答的内容。

四、 实验步骤

1 用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。 2 对其进行汇编及连接,产生.EXE文件。 3 对.EXE文件进行调试运行。

a. 用DEBUG调试运行,学会修改AL内容的方法。 b. 对DSPKEY.EXE键入不同的字符,分别进行调试。 c. 在MS-DOS下运行这两个.EXE文件。

五、 实验报告要求

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

六、 参考程序清单

(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

Page 9 of 25

汇编语言程序设计实验指导书

NEXT2: ADD DL,30H MOV AH,2 V 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

A------------------------------------------A

Page 10 of 25

汇编语言程序设计实验指导书

B—————————————————————B

实验B (选做)

一、预习内容

1.分支程序设计方法。

2.利用转移指令jl、jmp实现多岔分支的方法。

二、目的要求

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

2.掌握利用转移指令jl、jmp实现多岔分支的方法。

三、实验内容

统计学生成绩result。设有10个学生的成绩分别为56、69、84、82、73、88、99、63、100和80分。试编制程序分别统计低于60分、60~69分、70~79分、80~分、90~99分及100分的人数,并分别存放到s5、s6、s7、s8、s9及s10单元中

DSEG SEGMENT

grade dw 56,69,84,82,73,88,99,63,100,80

s5 dw 0 s6 dw 0 s7 dw 0 s8 dw 0 s9 dw 0 s10 dw 0 DSEG ENDS CSEG SEGMENT

assume cs:CSEG, ds:DSEG start:

mov ax, dseg mov cx,10

mov bx,offset grade

compare:

mov ax, [bx] cmp ax,60 jl five cmp ax,70 jl six cmp ax,80 jl seven cmp ax,90 jl eight

mov ds, ax

Page 11 of 25

汇编语言程序设计实验指导书

cmp ax,100 jne nine

① ②

nine:

inc s9

jmp short change_addr

eight:

inc s8

jmp short change_addr

seven:

inc s7

jmp short change_addr

six:

inc s6

jmp short change_addr

five:

inc s5

change_addr:

③ ④ mov ax, 4c00h int 21h

CSEG ENDS

end start

实验步骤:

1.阅读程序,将程序补充完整。 2.输入,汇编并连接此程序。

3.在DEBUG下运行此程序,记录运行结果。

4.单步运行程序,记录前五次执行转移指令后寄存器cs ip的值。

四、实验报告或作业

1.分析程序,画出程序流程图。

2.汇编,连接及调试时产生的错误,其原因及解决办法。 3.每次执行转移指令时寄存器cs ip的值。

4、最终运行结果,即s5、s6、s7、s8、s9及s10的值。 5、思考:

如何修改程序使源程序先统计s10,然后依次统计s9,s8,s7,s6,s5?

B———————————————————————B

实验五 子程序设计

Page 12 of 25

汇编语言程序设计实验指导书

A---------------------------------------------------A 实验A(必做)

本实验的目的在于让读者掌握同一模块调用的方法。 一、 实验目的

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指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。

四、 实验准备

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

1 编辑、汇编两个源程序,生成相应的可执行文件(。EXE) 2 用DEBUG的R 命令,T 命令或G命令和D命令检查远程调用及近程调用时堆栈的

变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。

3 检查程序执行的结果是否正确。 六、 实验报告要求

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

同。

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

3 分析实验结果及所遇到问题,并说明解决的方法。 七、参考程序清单

Page 13 of 25

汇编语言程序设计实验指导书

(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)统计并显示某键入字符的个数的程序:

Page 14 of 25

汇编语言程序设计实验指导书

: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]

Page 15 of 25

汇编语言程序设计实验指导书

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

A---------------------------------------------------A

B——————————————————————B

实验B 子程序设计

一、预习内容

1.子程序调用方法和参数传递方式。 2.过程调用伪指令: PROC,ENDP和NEAR。 3.子程序调用中堆栈的用法。 4.简化格式程序设计方法。

二、目的要求

1.掌握子程序调用方法和参数传递方式。 2.掌握过程调用伪指令: PROC,ENDP和NEAR。 3.理解子程序调用中堆栈的用法。 4.熟悉简化格式程序设计方法。

三、实验内容

显示学生名次表rank。要求接收从键盘输入的一个班的学生成绩,并存放于10字的grade数组中,其中grade+i保存学号为i+1的学生的成绩。然后根据grade中的学生成绩,把学生名次填入10字的rank数组中,其中rank+i的内容是学号为i+1学生的名次。再按学号把名次从终端显示出来。源程序如下,模块层次如图所示,源程序已经完成了mian, input, rankp, output, bindec和dec_div模块的编写,模块decbin和crlf需要自己完成。

Page 16 of 25

.model small .stack .data

grade dw 10 dup(?) rank dw 10 dup(?) count dw ?

mess1 db 'Grade?','$'

mess2 db 13,10,'Iput Error!',13,10,'$' mess3 db 'Rank:','$' .code

main proc far

start : mov ax, @data mov ds, ax call input call rankp call output mov ax, 4c00h int 21h main endp

input proc near

mov dx,offset mess1 mov ah,09 int 21h mov si,0 mov count,0 enter:

call decibin inc count cmp dl,',' je store

cmp dl,13 ;is it 'return'? je exit2 jne error store:

mov grade[si],bx add si,2 jmp enter error:

lea dx,mess2 mov ah,09 int 21h exit2:

mov grade[si],bx call crlf

Page 17 of 25

ret input endp

rankp proc near mov di,count mov bx,0 loop1:

mov ax,grade[bx]

mov word ptr rank[bx],0 mov cx,count lea si,grade next:

cmp ax,[si] jg no_count

inc word ptr rank[bx] no_count: add si,2 loop next add bx,2 dec di jne loop1 ret

rankp endp

output proc near lea dx,mess3 mov ah,09 int 21h mov si,0 mov di,count next1:

mov bx,rank[si] call binidec mov dl,',' mov ah,02 int 21h add si,2 dec di jnz next1 call crlf ret

output endp

decibin proc near

decibin endp binidec proc near push bx ; push cx ; push si ; push di ; mov cx,100d call dec_div dec_div proc near mov ax,bx mov dx,0 div cx mov bx,dx mov dl,al add dl,30h mov ah,02h mov cx,10d call dec_div mov cx,1 call dec_div pop di pop si pop cx pop bx ret

binidec endp int 21h ret

dec_div endp

; crlf proc near ; 。。。 ; 。。。

; crlf endp end main

Page 18 of 25

第 19 页 共 25 页

四、实验步骤

1.认真阅读程序,自己编写十进制到二进制转换子程序decibin和输出回车换行子程序crlf,将程序补充完整,然后汇编、链接、生成可执行文件。

2.用DEBUG的断点命令和T命令运行此程序,观察并记录每次过程调用和进出栈指令前后(带';'的语句)的SP和堆栈内容,如记录执行call input,call rankp,call output三条指令后sp,bp以及[sp]的值。

3.记录数据段各变量的最后结果。

五、实验报告或作业

1.画出input,output和rankp模块的流程图。

2.汇编,连接及调试时产生的错误,其原因及解决办法。 3.记录执行call input ,call rankp,call output三条指令后sp,bp以及[sp]的值,并指出[sp]指向哪条指令。

4.画出堆栈满时堆栈存储区域的示意图。 5.记录最后的输出结果。

6.思考: 如果想用堆栈传递参数,源程序应做何修改?

B———————————————————————B

实验六 I/O程序设计

A---------------------------------------------------A

实验A

一、预习内容

1.程序直接控制I/O方式。 2.I/O程序设计方法。 3.子程序设计方法

二、目的要求

1.掌握程序直接控制I/O方式。 2.熟悉I/O程序设计方法。 3.继续熟悉子程序设计方法。

三、实验内容

用位触发方式(也即程序直接控制输出控制寄存器(I/O端口为61h)的第一位,使该位按所需要的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲经放大后驱动扬声器发声音)模拟响程序。

程序如下,但其中有些语句错误,需要修改后才能正确运行。 code segment main proc far assume cs:code start:

mov cx,50d new_short:

push cx call shoot mov cx,0f000h silent:

loop silent pop cx

Page 19 of 25

第 20 页 共 25 页

loop new_short mov al,48h out 61h,al mov ax,4c00h int 21h main endp

shoot proc near

mov dx,140h mov bx,20h in al,61h

and al,11111100b sound:

xor al,2 out 61h,al add dx,9248h mov cl,3 ror dx,cl mov cx,dx and cx,1ffh or cx,1000h delay: push cx wait:

loop wait pop cx

loop delay dec bx jnz sound

and al,11111100b out 61h,al ret shoot endp code ends end start

实验步骤

1.认真阅读程序,将源程序中的错误找出后修改。

2.编译,链接,生成可执行文件,记录编译过程中的错误,并分析原因。 3.执行程序,调式程序,直到可以清楚听到响的声音。

四、实验报告或作业

1.分析程序,画出程序流程图。

2.汇编,连接及调试时产生的错误,其原因及解决办法。 3.思考:

试将程序中的黑体部分修改为 wait: loop wait,再编译运行程序,是否能听到声,为什么?

A---------------------------------------------------A

Page 20 of 25

第 21 页 共 25 页

B———————————————————————B

实验B (选做)

一、 实验目的

1 掌握输入输出程序设计的概念和方法。 2 了解PC机外围芯片8255、8259的功能。

3 学习如何在PC机上编写具有输入输出功能的程序,包括8255、8259芯片的使用方法

二、 实验说明

本实验要求自行编写一个键盘输入处理程序,它可以完成键盘字符的读入并进行屏幕显示,本实验要利用IBM—PC系统的硬件结构,分别使用外围芯片8255及8259。

在本例中,利用8255A的A端做数据输入,对应的端口地址为60H;利用B端口作控制端输入,端口地址为61H。8255A的控制端口地址为63H 。

本例的8259中断控制器,其IRQ1端用于键盘中断请求线。键盘通过它可以响CPU发出中断请求。8259的I/O端口地址为21H,可以写入中断屏蔽字,以对8个中断源是否容许中断进行控制。在每次中断结束时,要通过I/O端口地址20H写回一个中断结束命令EOI ,使8259可以清除本次中断。 因此本实验既属于输入输出实验,也属于中断实验。 有关说明将详细地附在参考程序中。

三、 实验内容

利用pc机键盘,编写一个读入并显示键盘输入的演示程序。该程序只接受常规字符(包括回车键及退格键),对特殊功能键不进行处理。在程序中设置这些特殊功能键对应0编号即可,凡是检测到键位编号为0值时,均忽略对它们的处理。有键按下时,送出的扫描码的D7位为0时,当键抬起时,扫描的码D7位为1,以判定键是否被按下。

四、实验准备

1 预习输入输出程序设计的特点和方法。

2 仔细阅读参考程序,弄清外围芯片接口初始化的意义和方法。

五、实验步骤

1 建立源文件,并通过汇编和连接,产生可执行文件。 2 运行程序,观察常规字符键及功能键按下时程序的反应,

六、 实验报告要求

1 给出程序框图,包括主程序框图、中断处理程序框图。 2 说明输入输出程序设计的特点。

3 讨论:将SHIFT键及右SHIFT 键也进行判别处理,它们的扫描码为42及。为记录SHIFT键的按动状态,可设一个标志单元KBFLAG,右SHIFT按下,KBFLAG的D0位置1,左SHIFT按下,KBFLAG的D1位置1,放下左右的SHIFT键,KBFLAG的相应恢复为0。当程序工作时,应能显示上档键的字符。

七、参考程序清单 ;KEYPRG.ASM

STACK SEGMENT PARA STACK ‘STACK’ DB 256 DUP(0)

STACK ENDS ;设计256个字节堆栈区

Page 21 of 25

第 22 页 共 25 页

DATA SEGMENT PARA PUBLIC ‘DATA’

BUFFER DB 10DUP(0) ;定义10个字节的键盘缓冲区 BUFFER1 DW 0 ;指向键盘缓冲区的起点 BUFFER2 DW 0 ;指向键盘缓冲区的终点 ;注意当BUFFER1=BUFFER2时,表明缓冲区空 ;

SCANTAB DB 0,0,’12345670- =’,8,0 DB’QWERTYUIOP[]’,0DH,0 DB’ASDFGHJKL;’,0,0,0,0 DB’ZXCVBNM,./’,0,0,0

DB’’,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,’7-456+1230.’ DATA ENDS

EXTRN KBINT: FAR ; ;外部引用说明 CODE SEGMENT PARA PUBLIC ‘CODE’ ;主程序段

ASSUME CS:CODE START: MOV AX,DATA MOV DS,AX

ASSUME DS:DATA

;建立自行设计的中断服务程序

CLI ;关中断,以防引起混乱 MOV AX,0 ;确定中断类型号9的物理地址 MOV ES,AX MOV DI,24H

MOV AX,OFFSET KBINT

;写自行设计的中断处理程序入口偏移量到矢量表中 CLD STOSW

MOV AX,CS

STOSW ;再写入中断处理程序段基址

MOV AL,0FCH ;允许定时器和键盘中断的控制字送8259 OUT 21H,AL

STI ;开中断 ;读键盘并显示字符

PROEVEVER:CALL KBGET1 ;读缓冲区字符 PUSH AX

CALL DISPCHAR ;显示接收字符 POP AX

CMP AL,0DH ;是回车符吗? JNZ FOREVER ;不是再接收 CALL DISPCHAR ;是,换行

JMP FOREVER ;接收下一行字符 ;KBGET1取缓冲区字符—>(返回参数) ;KBGET1 PROC NEAR KBGET: PUSH BX

CLI

MOV BX,BUFFER1 MOV BX,BUFFER2

JNZ KBGET2 ;缓冲区不空,转KBGET2 STI ;开中断

Page 22 of 25

第 23 页 共 25 页

POP BX JMP KBGET ; 取缓冲区字符

KBGET2: MOV AL,[BUFFER+BX] ;取缓冲区字符

INC BX ; 首指针加1 CMP BX,10 ;到缓冲区尾吗? JC KBGET3 ; 未到,转,KBGET3 MOV BX,0 ;到,指向缓冲区首 KBGET3: MOV BUFFER1,BX ;保护首指针 STI

POP BX ;恢复BX寄存器 RET KBGET1 ENDP

;DISPCHAR字符显示子程序 DISPCHAR PROC NEAR

PUSH BX

MOV BX,0 ;显示零页 MOV AH,14H ;写功能

INT 10H ;调显示器中断调用 POP BX RET DISPCHAR ENDP CODE ENDS

END START

从FOREVER开始,程序便进入循环,反复读缓冲区字符,并将其显示出来。而键盘缓冲区的内容,是通过键盘中断9的中断处理程序KBINT写入的。KBINT程序如下: ;KBINT键盘中断处理程序

SEG SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS:SEG PUBLIC KBINT KBINT PROC FAR PUSH BX PUSH AX

;读键盘数据,并发确认信号

IN AL,60H ;读8255A 口,即键盘扫描码 PUSH AX

INT AL,61H ;为置确认信号 ;读8255A B口 OR AL,7FH ;置键盘确认信号 OUT 61H,AL ;置PB7位并送键盘 AND AL,7FH ;恢复键盘确认信号 OUT 61H,AL

;将接收的扫描译为ASCII码 POP AX

TEST AL,80H ;检查是否按下? JNZ KBINT2 ;键抬起放弃本次输入 MOV BX,OFFSET SCANTAB

XLAT SCANTAB ;查表找对应ASCII码 CMP AL,0 ;是有效字符键吗? JZ KBINT2 ;不是,放弃 ;存ASCII码字符到缓冲区

Page 23 of 25

第 24 页 共 25 页

MOV BX,BUFFER2 ;取缓冲区尾指针 MOV [BUFFER+BX],AL ;存字符

INC BX ;尾指针加1 CMP BX,10 ;是否到区尾? JC KBINT3 ;不到,转 MOV BX,0 ;到,置新尾址 KBINT3:CMP BX,BUFFER1 ;缓冲区满?

JZ KBINT2 ;不满,存尾指针 MOV BUFFEER2,BX ;结束中断处理

KBINT2:MOV AL,20H ;发EOI ,结束8259中断 OUT 20H,AL POP AX POP BX

IRET ;中断返回 KBINT ENDP SEG ENDS END

;读键盘数据,并发确认信号

IN AL,60H ;读8255A口,即键盘扫描码 PUSH AX

IN AL,61H ;为置确认信号 ;读8255A B口

OR AL ,80H ; 置键盘确认信号 OUT 61H,AL ;置PB7位并送键盘 AND 61H,AL

;将接收的扫描码译为ASII码 POP AX

TEST AL,80H ;检查是否按下

JNZ KBINT2 ;键抬起放弃本次输入 MOV BX,OFFSET SCANTAB

XLAT SCANTAB ;查表找对应ASII码 CMP AL,0 ;是有效字符键吗? JZ KBINT2 ;不是,放弃 ;存ASII码字符到缓冲区

MOV BX,BUFFWR2 ;取缓冲区尾指针 MOV [BUFFER+BX],AL ;存字符

INC BX ;尾指针加1 CMP BX ,10 ;是否到区尾? JC KBINT3 ;不到,转 MOV BX,0 ;到新尾址

KBINT3: CMP BX,BUFFWR1 ;缓冲区满? JZ KBINT2 ;满,转

MOV BUFFWR2 ;不满,存尾指针 ;结束中断处理

KBINT2: MOV AL,20H ;发WOI,结束8259中断 OUT 20H,AL POP AX POP BX

IRET ; 中断返回

Page 24 of 25

第 25 页 共 25 页 KBINT ENDP SEG ENDS END

B———————————————————————B

实验七 综合程序设计

一、预习内容

1. DOS中断,字符输入输出的方法. 2.综合程序设计方法

二、目的要求

1.熟悉DOS中断,掌握字符输入输出的方法.

2.继续熟悉基本程序设计方法,包括循环程序设计,分支程序设计和子程序设计等. 3.练习综合程序设计方法

三、实验内容

数据区存放有10个正数,要求自己编写一个完整的程序实现这10个数的排序,具体要求如下: 1.显示未排序的10个数据;

2.提示输入排序方法,是按从大到小还是从小到大;

3.从键盘输入‘H’或者‘L’决定数据是按从大到小还是从小到大的顺序排列,如果从键盘输入‘H’,则按从大到小顺序排列,如果输入‘L’,则按从小到大顺序排列,否则提示输入错误,请重新输入;

4.显示最后的排序结果。

四、实验报告或作业

1.写出源程序,画出程序流程图;

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

3.写出你认为在编写汇编程序中应该注意的地方和你的编程经验; 4.写出你对汇编实验的意见或者建议。

参考书目

1.《IBM-PC 汇编语言程序设计实验教程》沈美明 温冬 张赤红 编著,清华大学出版社 2.《IBM-PC 宏汇编语言程序设计》(第二版),韩宗芬 编著,华中理工大学出版社

3.《IBM PC Assembly Language and Programming》 (Fourth edition),Peter Abel,Prentice-Hall International, Inc.(清华大学影印版)。 4.《Pentium/80486实用汇编语言程序设计》,艾德才等编著,清华大学出版社 《Windows环境下汇编语言程序设计》,蓝琚成、肖金秀编著,地质出版社,2001

Page 25 of 25

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务