汇编语言实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一汇编程序的汇编及运行
1.实验目的和要求
1、熟悉汇编程序的汇编、连接、执行进程
2、生成LST文件,查看LST文件
3、生成OBJ文件,修改语法错误
4、生成EXE文件
5、执行
2.实验环境
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录
一、将数据段输入,取名1.txt,保留在MASM文件夹下。

生成LST文件,(没必要连接、运行)用EDIT查看1.LST文件。

试回答:DA1,DA2的偏移量别离是多少?COUNT的值为多少?
DATA SEGMENT
ORG 20H
NUM1=8
NUM2=NUM1+10H
DA1 DB ‘IBM PC’
DA2 DB 0AH, 0DH
COUNT EQU $-DA1
DATA ENDS
END
2、输入有错误的文件,修改错误语句。

(MASM没有显现错误即可。

没必要
连接、运行。


DATA SEGMENT
VAR1 DB 0, 25, ODH, 300
VAR2 DB 12H, A4H, 6BH
VAR3 DB ’ABCDEF’
VAR4 DW 1234H, 5678H
VAR5 DW 10H DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DE: DATA BEING MOV AX, DATA
MOV DS, AX
LEA SI, VAR5
MOV BX, OFFSET VAR2
MOV [SI], 0ABH
MOV AX, VAR1+2
MOV [BX], [SI]
MOV VAR5+4, VAR4
MOV AH, 4CH
INT 21H
CODE ENDS
END START
3、输入正确的程序,汇编、连接、运行
STACKS SEGMENT STACK
DW 128 DUP(?)
STACKS ENDS
DATAS SEGMENT
STRING DB ‘WELCOME!’, 13, 10, ‘$’
DATAS ENDS
CODES SEGMENT
ASSUME CS: CODES, DS: DATAS
START:MOV AX, DATAS
MOV DS, AX
LEA DX, STRING
MOV AH, 9
INT 21H
MOV AH, 4CH
INT 21H
CODES ENDS
END START
4.算法描述及实验步骤
(1)编写源程序。

(2)对源程序进行汇编、连接。

(3)执行程序。

2的正确代码:
DATA SEGMENT
VAR1 DW 0,25,0DH,300
VAR2 DB 12H,0A4H,6BH
VAR3 DB 'ABCDEF'
VAR4 DW 1234H,5678H
VAR5 DW 10H DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA BEGIN: MOV AX,DATA
MOV DS,AX
LEA SI,VAR5
MOV BX,OFFSET VAR2
MOV WORD PTR[SI],0ABH
MOV AX,VAR1+2
MOV BX,[SI]
MOV CX,VAR4
MOV VAR5+4,CX
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
5.调试进程
(1)300超过一个字节,将DB改成DW。

(2)A4H改成0A4H。

(3)DE改成DS。

(4)BEGIN后要加冒号。

(5) MOV [SI],0ABH改成MOV WORD PTR[SI],0ABH。

(6) MOV [BX],[SI]改成 MOV BX,[SI]。

(7) MOV VAR5+4,VAR4 改成MOV CX,VAR4
MOV VAR5+4,CX
(8)END START改成END BEGIN
6. 实验结果
(1)
DA一、DA2的偏移量别离是0020H,0026H。

COUNT的值为0008H。

(2)
(3)
7. 总结
这次上机实验把握了实际调试程序的能力,熟悉了汇编程序的汇编、连接、执行进程,在生成的文件中修改语法错误。

这次实验不仅验证了讲义的理论,更重要的是使我有了对实践能力的培育。

实验二顺序程序设计
1.实验目的和要求
1.学习利用DEBUG的命令;
2.利用DEBUG命令在数据段中查看程序运行的结果;
3.利用DEBUG运行简单的程序段。

2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录
1)输入程序观看寄放器转变
利用DEBUG,将下面的程序段写入内存,逐条执行,观看每条指令执行后,CPU中相关寄放器的内容转变。

注意用T命令执行时,CS: IP寄放器的内容。

MOV AX, 4E20
ADD AX, 1416
MOV BX, 2000
ADD AX, BX
MOV BX, AX
ADD AX, BX
MOV AX, 001A
MOV BX, 0026
ADD AL, BL
ADD AH, BL
ADD BH, AL
MOV AH, 0
ADD AL, BL
ADD AL, 9C
2)以下程序单步运行,注意AL,BX,CX寄放器的转变,并观看数据段字母的转变。

DSEG SEGMENT
MSG1 DB’abc’
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
LEA BX, MSG1
MOV CX, 3
S: MOV AL, [BX]
AND AL, 11011111B ;将AL中的ASCII码的第5位置0,
;变成大写字母。

MOV [BX], AL
INC BX
LOOP S
MOV AL, 0
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
3)程序的跟踪执行操作
在DOS下直接输入文件主名就能够够执行文件了,有的程序会显示结果,可能执行后什么结果都没有,是因为程序中没有显示命令。

那么如何查看程序的运行结果呢?
程序执行进程的跟踪操作步骤如下:
(2)在DEBUG 提示符下输入U 命令
(3)能够用T 命令单步执行指令,执行到 MOV AH, 4CH 时终止,也能够用G 命令执行整个程序,输入:G=B 地址(如:G=0000)
(4)用D 命令查看程序执行后数据段的转变 输入:D K 地址:0 (如:D1260:0)
在显示的数据中,对照源程序或LST 文件查看结果所在的偏移地址的内容。

4)编写调试下面的程序,用DEBUG 查看数据段中的结果
(1))/()510*)((Y X X W Z ++-=,X ,Y ,W 为字节类型变量,结果存于Z 单元,写出数据段和代码段。

(无符号数)
(2)X ,Y 为字节类型数,求16/)2*)(8*)((Y X Y X Z --+=,写出完整的数据段和代码段,不用乘除指令。

(无符号数) 4.算法描述及实验步骤
1)在DEBUG 的环境下,用A 命令逐条把程序段写入内存 ,用T 命令逐条执行,然后再观看CPU 中相关寄放器的内容转变。

2)先用记事本编写源程序,把它寄存到MASM 目录下,再把它生成.exe 文件,用DEBUG 的反汇编U 命令,G 命令,T 命令,单步运行程序,观看AL ,BX ,CX 寄放器的转变,并观看数据段字母的转变。

假设要将大写字母改成小写字母只要将AND A L, 11011111B 语句改成OR AL, 00100000B (将AL 中的ASCII 码的第5位置1,变成小写字母)即可。

3)(1)分析问题:
设X 、Y 、W 的值寄存在字节变量X 、Y 、W 中。

结果寄存在字节变量Z 当中。

第一:初始化 ;第二:两数相减,AL-X
第三:无符号数乘法mul (单操作数)被乘数在BL 中,将W-X 送入BL 中,mul10,将结果送BL 。

第四:无符号数相加送AX ,(W-X)*10+5->AX 第五:无符号数相加,结果存于BH ,X+Y->(BH) 第六:无符号数除法(单操作数),商->Z,余数->Z+1 (2)分析问题:
设X 、Y 的值寄存在字节变量X 、Y 中。

结果寄存在字节变量Z 当中。

第一:初始化 ;第二:无符号数相加,结果存于AL ,即X+Y —>AL 。

第二:两数相乘用SAL指令,左移3位等于乘8,结果存于AL,即(X+Y)*8—>AL。

第三:无符号数相减,结果存于BL,即X-Y—>BL。

第四:两数相乘用SAL指令,左移一名即乘2,结果存于BL,即(X-Y)*2—>BL。

第五:无符号数相减,结果存于AL,即(X+Y)*8-(X-Y)*2—>AL。

第六:两数相除用SAR指令,右移4位等于除6,结果存于Z,即
((X+Y)*8-(X-Y)*2)/16—>Z。

4)(1)代码如下:(2)代码如下:
DATA SEGMENT DATA SEGMENT
X DB 2 X DB 48
Y DB 10 Y DB 30
W DB 20 Z DB ?
Z DB ? DATA ENDS
DATA ENDS CODE SEGMENT
CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
START: MOV AX,DATA MOV DS,AX
MOV DS,AX MOV AL,X
XOR AX,AX ;将AX置0 ADD AL,Y
MOV AL,W MOV CL,3
SUB AL,X ;W-X SAL AL,CL ;(X+Y)*8
MOV BL,10 MOV BL,X
MUL BL ;(W-X)*10 SUB BL,Y
ADD AX,5 ;(W-X)*10+5 SAL BL,1 ;(X-Y)*2
MOV BH,X SUB AL,BL
ADD BH,Y ;X+Y->(BH) MOV CL,4
DIV BH ;商AL,余AH SAR AL,CL ;((X+Y)*8-(X-Y)*2)/16
MOV Z,AL MOV Z,AL
MOV Z+1,AH MOV AL,0
MOV AH,4CH MOV AH,4CH
INT 21H INT 21H
CODE ENDS CODE ENDS
END START END START
5.调试进程
输入程序并运行,编译结果无误。

6. 实验结果
1)
……
通过T命令逐条执行后,AX、BX的内容发生了转变,而CX、DX、SP、BP、SI、DI、DS、ES、SS的内容都没改变,CS也没变成0B01H,IP内容随着用DEBUG 的T命令逐条执行后发生了改变。

2)
……
因为有LOOP S 语句,循环3次,因此:AL刚开始为5EH,当执行完MOV AL,[BX]和执行完AND AL,DF语句后,AL别离为61H,62H,63H;41H,42H,43H;执行完MOV AL,00后为00H;BX为0000H,当执行完INC BX后别离为0001H,0002H,0003H;CX开始为002BH,当执行完MOV CX,3后为0003H,执行完LOOP 000C后别离为0002H,0001H, 0000H。

大写字母改成小写字母的结果:
3)(1)
T命令逐条执行后数据段中的结果别离为:0002H=14,0000H=02,0001H=0A,
0003H=0F,0004H=05。

(2)
T命令逐条执行后数据段中的结果别离为:0000H=30,0001H=1E,0002H=04。

7. 总结
通过这次的实验,已经能够熟练利用DEBUG命令。

同时也学会利用简单的汇编指令编写程序,也了解了顺序程序语句的执行进程。

对讲义知识进一步明白得,收成专门大。

实验三分支循环程序设计
1.实验目的和要求
一、学习调试程序,查找逻辑错误;
二、学习分支语句的编程和调试;
3、学习循环语句的编程和调试。

2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录
1.有10个数,统计正数的个数,寄存在变量M中中。

通过汇编后,形成EXE文件。

在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,会发觉结果不正确。

用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误,注意每一次循环中AL寄放器中值的转变是不是正确。

(AL寄放器中寄存正数的个数)
DSEG SEGMENT
MSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6
M DB ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
MOV CX, 10
MOV AL, 0
LEA SI, MSG
L1: MOV BL, [SI]
CMP BL, 0
JBE NEXT
INC AL
NEXT: INC SI
LOOP L1
MOV M, AL
MOV AL, 0
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
2.数据段中是一组无符号数,将最小数寄存在M单元中。

按上题方式查找一处逻辑错误。

DSEG SEGMENT
MSG DB 13, 15, 7, 25, 24
M DB ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
MOV CX, 4
MOV AL, MSG
MOV SI, OFFSET MSG+1
L1: CMP AL, [SI]
JB NEXT
MOV AL, [SI]
NEXT: LOOP L1
MOV M, AL
MOV AL, 0
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
3.编程:在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。

4.编程:

-
=
* =
8
1
i
i
i
B
A
Y
,Ai,Bi为字节型无符号数,别离存于NUM1和NUM2开始的持续存储单元中,结果存于REST单元中。

4.算法描述及实验步骤
(1)在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,发觉结果不正确,用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误。

(2)在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,发觉结果不正确,用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误。

(3)代码DSEG SEGMENT (4)DSEG SEGMENT
MSG DB 9,-1,-6,0,2,0,8,-5,0,6 NUM1 DB 7,11,24,53,81,30,42,62 RESULT DB ? NUM2 DB 22,10,77,36,64,51,29,33 DSEG ENDS RESULT DW ?
CSEG SEGMENT DSEG ENDS
ASSUME CS:CSEG,DS:DSEG CSEG SEGMENT PARA PUBLIC'CODE' START:MOV AX,DSEG ASSUME CS:CSEG,DS:DSEG
MOV DS,AX START:MOV AX,DSEG
MOV CX,10 MOV DS,AX
MOV AL,0 MOV CX,8
LEA SI,MSG MOV BX,0
L1: MOV BL,[SI] MOV SI,OFFSET NUM1
CMP BL,0 MOV DI,OFFSET NUM2 JNE NEXT L1:MOV AL,[SI]
INC AL MUL BYTE PTR[DI] NEXT: INC SI ADD BX,AX
LOOP L1 INC DI
MOV RESULT,AL INC SI
MOV AL,0 LOOP L1
MOV AH,4CH MOV RESULT,BX
INT 21H MOV AL,0
CSEG ENDS MOV AH,4CH
END START INT 21H
CSEG ENDS
END START (3)流程图:(4)流程图:
5.调试进程
(1)运行程序,发觉结果错误:
发觉结果错误,单步执行,查找错误:
在执行“JBE NEXT”命令时,到-2时,为有符号数,可是JBE为无符号数的比较,因此显现了结果错误,应把“JBE”改成“JLE”。

(2)进行编译连接、运行程序,结果如下:
发觉结果不正确。

单步执行,查找错误,结果如下:
发觉一直都是0D和0F两个数在比较,直至推出循环。

指针没有往下跳转,因此
得犯错误答案。

在NEXT语句开始部份加上inc SI语句,再执行LOOP L1语句。

6. 实验结果
(1)
(2)
(3)
(4)
7. 总结
通过这次实验,我了解了如何调试程序,查找逻辑错误,学会了一些分支语句的编程和调试和循环语句的编程和调试。

通过实践,对知识进行了巩固,加深了明白得,收成颇多。

实验四 DOS功能挪用
1.实验目的和要求
1.学会DOS中关于显示功能挪用指令的用法。

2.领会修改显存方式显示字符。

2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录
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: 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
CMP SI, 4
JNA P
MOV AH, 4CH
INT 21H
CODE ENDS
END START
4、运行以下程序,在屏幕的第1行,会显示一个字符X,明白得程序段STACK SEGMENT
DB 128 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK
START: MOV AX,STACK
MOV SS,AX
MOV SP,128
MOV AX,0B800H
MOV ES,AX
MOV AH,0 ;BIOS 10H的0号功能,设置80X25的彩色字符模式 MOV AL,03H
INT 10H
MOV AH,'X'
MOV ES:[160*1+40*2],AH
MOV AL,0
MOV AH,4CH
INT 21H
CODE ENDS
END START
5、显示
*********
*******
*****
***
*
6、编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将
统计结果以16进制形式显示出来。

4.算法描述及实验步骤
(1)挪用DOS的1号功能实现。

CODES SEGMENT
ASSUME CS:CODES
START:MOV AH,1
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
(2)挪用DOS的10号和2号功能来实现字符串的显示。

DATAS SEGMENT
BUF DB 10,?,10 DUP(?)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
MOV DL,0DH; 回车换行
MOV AH,02H
INT 21H
MOV DL,0AH;回车换行
MOV AH,02H
INT 21H
MOV CL,BUF+1;循环次数,实际的字符个数在BUF+1那个单元
MOV SI,0;显示字符串
L1:MOV DL,[SI+2]
MOV AH,02H
INT 21H
INC SI
LOOP L1
MOV AH,4CH
INT 21H
CODES 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
(5)利用回车换行分行显示,挪用DOS的9号功能实现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
(6)STACKS SEGMENT STACK
DW 128 DUP(?)
STACKS ENDS
DSEG SEGMENT
BUF DB 0,-1,2,4,3,-4,5,6,-7,0
RESULT DB 0
DSEG ENDS
CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AX,0
MOV BX,0
MOV DX,0
LEA SI,BUF
MOV CX,10
LOP: CMP BYTE PTR[SI], 0
JNE L1
INC DL ;0的个数
JMP L3
L1: JG L2
INC AL ;负数的个数
JMP L3
L2: INC BL ; 正数的个数
L3: INC SI
LOOP LOP
MOV BH,0
CALL DISP ;挪用显示子程序,显示正数的个数 MOV BL,AL
MOV BH,0
CALL DISP ;挪用显示子程序,显示负数的个数 MOV BL,DL
MOV BH,0
CALL DISP ;挪用显示子程序,显示计划零的个数 MOV AL,0
MOV AH,4CH
INT 21H
DISP PROC ;显示BX中的数
PUSH AX
PUSH BX
PUSH DX
MOV CH,4
ROLL: MOV CL,4
ROL BX,CL
MOV DL,BL
AND DL,0FH
CMP DL,9
JBE NEXT1
ADD DL,07H
NEXT1: ADD DL,30H
MOV AH,02H
INT 21H
DEC CH
JNZ ROLL
POP DX
POP BX
POP AX
RET
DISP ENDP
CSEG ENDS
END START
5.调试进程
程序编译后运行,运行无误。

6. 实验结果
(1)(2) (3)
(5)
7. 总结
通过本次实验,学会了DOS中关于显示功能挪用指令的用法。

大体了解到DOS 的挪用指令的种类,大致把握了修改显存的方式显示字符。

实验五子程序设计
1.实验目的和要求
一、学习子程序的编写,主子程序的挪用
二、不同模块间程序的挪用和调试
2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录
一、数据段中的3个字符,挪用子程序将其逐个显示出来。

子程序的功能是显示一个字符。

单步执行,观看IP的转变
DATA SEGMENT
MAG DB ‘ABC’
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV SI, 0
MOV CX, 3
LL: MOV DL, MAG[SI]
CALL MADD
INC SI
LOOP LL
MOV AH, 4CH
INT 21H
MADD PROC
MOV AH, 02H
INT 21H
RET
MADD ENDP
CODE ENDS
END START
二、阅读S31.ASM和S32.ASM。

具体步骤如下:
MASM S31.ASM(别离汇编)
MASM S32.ASM
LINK S31 S32 (将两个文件连接成为一个文件名为S31)
S31.EXE (运行)
3、编程:利用主程序挪用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。

(也能够将找到的不相等字符逐个显示,用INT 21H 的02功能挪用)
4、编程:子程序搜索指定字符缓冲区中是不是有n,若是有效y替代。

挪用子程序将BUF1,BUF2,BUF3中的n全数用y替代
4.算法描述及实验步骤
(1)进行单步执行结果如下:
不同模块间的段间挪用。

从键盘输入2位非紧缩BCD数,存入AX寄放器中。

为了将其转换为二进制数,编写一个子程序TRAN。

显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。

输入数据为00时终止。

EXTRN DISP: FAR
CODE SEGMENT PARA 'CODE'
ASSUME CS: CODE
START: MOV AH, 01H
INT 21H
MOV BL, AL
INT 21H
MOV AH, AL
MOV AL, BL
CMP AX, 3030H
JE EXIT
CALL NEAR PTR TRAN
CALL FAR PTR disp
JMP START
EXIT: MOV AH, 4CH
INT 21H
TRAN PROC NEAR ;将输入的ASCII码转换成2进制数AND AX, 0F0FH ;将ASCII码转换成非紧缩BCD码,;高位在AL中
MOV BL, AH
MOV CL, 10D
MUL CL
ADD AL, BL
RET
TRAN ENDP
CODE ENDS
END START
PUBLIC DISP
CODE1 SEGMENT PARA 'CODE'
ASSUME CS: CODE1
DISP PROC FAR
MOV BL, AL
MOV BH, 00
MOV CH, 4
ROLL: MOV CL, 4
ROL BX, CL
MOV DL, BL
AND DL, 0FH
CMP DL, 9
JBE NEXT1
ADD DL, 07H
NEXT1: A DD DL, 30H
MOV AH, 02H
INT 21H
DEC CH
JNZ ROLL
RET
DISP ENDP
CODE1 ENDS
END
(3) DATA SEGMENT
BUF1 DB'Tomorrow is another dan!',0ah,0dh,'$'
LEN1 =$-BUF1
BUF2 DB'Work hard everndan!',0ah,0dh,'$'
LEN2 =$-BUF2
BUF3 DB'Colorful dan!','$'
LEN3 =$-BUF3
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA
MOV DS,AX
LEA SI,BUF1
MOV CX,LEN1
CALL CMMP
LEA SI,BUF2
MOV CX,LEN2
CALL CMMP
LEA SI,BUF3
MOV CX,LEN3
CALL CMMP
MOV AH,4CH
INT 21H
CMMP PROC
MOV DX,SI
CMP1:CMP BYTE PTR[SI],'n'
JNE NOTN
MOV AL,'y'
MOV [SI],AL
NOTN:INC SI
LOOP CMP1
MOV AH,09H
INT 21H
RET
CMMP ENDP
CODE ENDS
END START
(4) DATA SEGMENT
BUF1 DB'HUIBIANCHENGXU'
LEN1 =$-BUF1
BUF2 DB'HUIBIANLAOSHIL'
BUF DB LEN1 DUP(?) ;不相同的字符存在BUF开始的缓冲区
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DI,BUF1
LEA SI,BUF2
MOV CX,LEN1
LEA BX,BUF
CALL KLL
MOV BYTE PTR[BX],'$';在要显示的字符串末尾加'$'显示字符串BUF LEA DX,BUF
CALL PRINT
MOV AH,4CH
INT 21H
KLL PROC;比较2个字符串,将不相同的字符送到BX开始的存储空间,入口参数为2个字符串的偏移地址SI,DI,和字符串的长度CX AL1:MOV AL,[SI]
CMP [DI],AL
JE AL2
MOV [BX],AL
INC BX
AL2:INC SI
INC DI
LOOP AL1
RET
KLL ENDP
PRINT PROC NEAR;显示字符串子程序
MOV AH,9
INT 21H
RET
PRINT ENDP
CODE ENDS END START
5.调试进程
编译运行,结果无误。

6. 实验结果
(1)(2)(3)
(4)
7. 总结
通过这次实验加深了对子程序的编写和主子程序的挪用,了解到不同模块间程序的挪用和调试的进程,巩固了讲义上的知识,对理论知识有进一步的深化。

相关文档
最新文档