实验四 字符串长度计算字符串搬移及处理
实验目的:
1.掌握计算字符串长度的编程方法。
2.掌握字符串搬移处理的编程方法。
3.掌握分模块编程的方法。
实验设备:
计算机一台。预装Windows XP、宏汇编MASM5。
实验内容A:
编写能够实现以下要求的汇编语言程序,并上机实现。
1.一个字符串以回车(0DH)为结束符,编写一个程序计算这个字符串的长度,并将这个字符串及长度(3位十进制数)输出到屏幕。
2.程序中有一段是将AX中的二进制数转换成3位十进制数,并输出到屏幕上。这是后面各实验都要用到的一个处理功能。仿照实验三中实验内容B的方法,将这段程序做成一个可供链接调用的模块,在主模块中调用它。这样,以后各程序用到这段程序时,调用链接就可以了。
实验内容B:
编写能够实现以下要求的汇编语言程序,并上机实现。
1.用另一种方法来实现字符串输出,将该字符串搬移到另一存储区中,并以“$”结尾,然后就用输出字符串的方法显示该字符串。
预习要求:
1.阅读实验内容A的参考源程序,对其结构以及实现方法进行分析,在理解的基础上掌握编程方法。
2.根据要求,编写实验内容B的源程序。
3.编辑建立实验内容A和实验内容B的源程序文件,存入U盘保存。
4.写出预习报告,报告中应有实验内容B的源程序清单。
实验步骤:
1.编辑建立实验内容A的源程序,对其进行汇编、链接获得可执行文件。运行可执行文件,实现实验内容A的要求。
2.参考实验内容A的源程序,编辑建立实验内容B的源程序,对其进
行汇编、链接获得可执行文件。如果在汇编、链接过程中有错误产生,则根据提示信息逐一修改错误,直到无错误产生。运行可执行文件,实现实验内容B的要求。
重要提示:
1.程序中的string2是保留给实验内容B做传送使用的。
2.在计算出string1的长度后,实验内容B中的传送是很容易用循环结构实现的。在传送完这个字符串后,不要忘记在其后补一个“$”。
3.输出以“$”结束的字符串可以使用DOS功能调用的方法来实现,请参考实验一的做法。这时二——十进制转换及显示模块就不需要了,但不要忘记去掉主模块中的extrn b_d:far行。
实验内容A参考程序:
主模块:
NAME DEMO4
EXTRN B_D:FAR
DATA SEGMENT
STRING1 DB '123456abcdEFGHIJ',0DH
L1 DB ?
CR EQU 0DH
STRING2 DB 100 DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE
ASSUME DS:DATA
ASSUME ES:DATA
ASSUME SS:STACK
START PROC FAR
BEGIN: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DI,STRING1 ;计算出字符串长度放L1 MOV DL,0
MOV AL,0DH ;CR
CLD
AGAIN: SCASB
JE DONE
INC DL
JMP AGAIN
DONE: LEA BX,L1
MOV [BX],DL
MOV CL,L1 ;输出字符串
MOV CH,0
LEA BX,STRING1
S_OUT1: MOV DL,[BX]
MOV AH,2
INT 21H
INC BX
LOOP S_OUT1
MOV DL,0DH ;输出回车换行
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV AL,L1 ;输出字符串长度
MOV AH,0
CALL B_D
RET
START ENDP
CODE ENDS
END BEGIN
二——十进制转换及显示模块:
NAME B_D_SHOW
PUBLIC B_D
STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK
B_D PROC FAR
MOV CL,100
DIV CL
PUSH AX
MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H
POP AX
MOV AL,AH
MOV AH,0
MOV CL,10
DIV CL
PUSH AX
MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H
POP AX
MOV DL,AH字符串长度规则
ADD DL,30H
MOV AH,2
INT 21H
RET
B_D ENDP
CODE ENDS
END
实验B参考程序:
DATA SEGMENT
STRING1 DB '123456abcdEFGHIJ',0DH
L1 DB ?
CR EQU 0DH
STRING2 DB 100 DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE
ASSUME DS:DATA
ASSUME ES:DATA
ASSUME SS:STACK
START PROC FAR
BEGIN: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DI,STRING1 ;计算出字符串长度放L1 MOV DL,0
MOV AL,0DH ;CR
CLD
AGAIN: SCASB
JE DONE
INC DL
JMP AGAIN
DONE: LEA BX,L1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论