文章目录 实验目的和内容 实验要求和步骤 实现右对齐 以下为源码: 方法一 方法二 方法三 测试一——字符串的输入输出 测试二——改进 测试三——改进 测试四——改进
实验目的和内容
实验要求和步骤
实现右对齐
以下为源码:
方法一
DATA SEGMENTNUM EQU 25BUF1 DB NUM,?,NUM DUP(?),0AH,0DH,'$' ;缓冲区1,存入字符串1;分别存入:可输入的最大字符数+1、实际输入字符个数、开始存放输入字符的ASCII码;输入回车键,输入结束,将回车的ASCII码0DH作为最后一个字符存入缓冲区,不计入实际存入字符个数BUF2 DB NUM,?,NUM DUP(?),0AH,0DH,'$'MES2 DB 0AH,0DH,'Please enter 2 strings: ', 0AH,0DH,'$'MES3 DB 0AH,0DH,'The result is:',0AH,0DH,'$'
DATA ENDS CODE SEGMENTASSUME DS:DATA,CS:CODE ;将段寄存器和各个段相关联START: MOV AX,DATAMOV DS,AX ;初始化DSMOV ES,AX ;初始化ESSTD ;设置DF=1,按照减地址方向,字串处理由后往前!LEA DX ,MES2 ;将MES2地址送到DX寄存器MOV AH,09H ;将9号送入AHINT 21H ;调用DOS 9号功能显示MES2字符串内容LEA DX,BUF1 ;把BUF1偏移地址送入DXMOV AH,0AHINT 21H ;调用DOS 10号功能,从键盘读取字符存入缓冲区BUF1中MOV AH,2 ;DOS 2号功能,显示一个字符MOV DL,0AH ;回车INT 21H ;MOV DL,0DH ;换行INT 21H ;第二个字符串在回车、换行后再读取LEA DX,BUF2 ;MOV AH,0AH ;INT 21H ;读入第二个字符串MOV CL,BUF1+1 ;将实际存放字符个数放入CL寄存器中MOV CH,0 ;补全CX高位寄存器,方便后面字运算LEA SI,BUF1 ;SI定位到第一条字符串首地址INC SI ;SI定位到实际存入字符串前面的地址,也就是实际存入字符数量的所在地址ADD SI,CX ;SI定位到存入字符的最后一位LEA DI,BUF1+1 ;DI定位到实际存放字符数量的地址ADD DI,NUM ;DI定位到可存放字符的缓冲区的最后一个地址,即右对齐REP MOVSB ;MOV AL,20H ;MOV AH,0MOV CX,NUM+2 ;MOV DL,BUF1+1 ;MOV DH,0 ;SUB CX,DX ;REP STOSB ;MOV CL,BUF2+1 ;将实际存放字符个数放入CL寄存器中MOV CH,0 ;补全CX高位寄存器,方便后面字运算LEA SI,BUF2 ;SI定位到第一条字符串首地址INC SI ;SI定位到实际存入字符串前面的地址,也就是实际存入字符数量的所在地址ADD SI,CX ;SI定位到存入字符的最后一位LEA DI,BUF2+1 ;DI定位到实际存放字符数量的地址ADD DI,NUM ;DI定位到可存放字符的缓冲区的最后一个地址,即右对齐REP MOVSBMOV AL,20HMOV CX,NUM+2MOV DL,BUF2+1MOV DH,0SUB CX,DXREP STOSBLEA DX,MES3MOV AH,09HINT 21H ;LEA DX,BUF1+2INT 21H ;LEA DX,BUF2+2INT 21H ;MOV AH,4CHINT 21HCODE ENDSEND START
方法二
DATA SEGMENTNUM EQU 25BUF1 DB NUM,?,NUM DUP(?),0AH,0DH,'$' ;缓冲区1,存入字符串1;分别存入:可输入的最大字符数+1、实际输入字符个数、开始存放输入字符的ASCII码;输入回车键,输入结束,将回车的ASCII码0DH作为最后一个字符存入缓冲区,不计入实际存入字符个数BUF2 DB NUM,?,NUM DUP(?),0AH,0DH,'$' MES2 DB 0AH,0DH,'Please enter 2 strings: ', 0AH,0DH,'$'MES3 DB 0AH,0DH,'The result is:',0AH,0DH,'$'
DATA ENDS CODE SEGMENTASSUME DS:DATA,CS:CODE ;将段寄存器和各个段相关联START: MOV AX,DATAMOV DS,AX ;初始化DSMOV ES,AX ;初始化ESSTD ;设置DF=1,按照减地址方向,字串处理由后往前!避免数据覆盖丢失LEA DX,MES2 ;将MES2地址送到DX寄存器MOV AH,09H ;将9号送入AHINT 21H ;调用DOS 9号功能显示MES2字符串内容LEA DX,BUF1 ;把BUF1偏移地址送入DXMOV AH,0AHINT 21H ;调用DOS 10号功能,从键盘读取字符存入缓冲区BUF1中MOV AH,2 ;DOS 2号功能,显示一个字符MOV DL,0AH ;回车INT 21H MOV DL,0DH ;换行INT 21H ;第二个字符串在回车、换行后再读取LEA DX,BUF2 ;MOV AH,0AH ;INT 21H ;读入第二个字符串MOV CL,BUF1+1 ;将实际存放字符个数放入CL寄存器中MOV CH,0 ;补全CX高位寄存器,方便后面字运算LEA SI,BUF1+1 ;SI定位到实际存入字符串前面的地址,也就是实际存入字符数量的所在地址ADD SI,CX ;SI定位到存入字符的最后一位LEA DI,BUF1+1 ;DI定位到实际存放字符数量的地址ADD DI,NUM ;DI定位到可存放字符的缓冲区的最后一个地址,即右对齐REP MOVSB ;将每一个字符串中的字符后移至右对齐MOV AL,20H ;便于STOSB指令将AL内容存到DI指向的存储单元中MOV CX,NUM+2 ;MOV DL,BUF1+1 ;MOV DH,0 ;SUB CX,DX ;计算需要存入空格数量,由于字符串最前面存入了两个额外单元,故要先+2REP STOSB ;;;;;;;;;;;;MOV CL,BUF2+1 ;将实际存放字符个数放入CL寄存器中MOV CH,0 ;补全CX高位寄存器,方便后面字运算LEA SI,BUF2+1 ;SI定位到实际存入字符串前面的地址,也就是实际存入字符数量的所在地址ADD SI,CX ;SI定位到存入字符的最后一位LEA DI,BUF2+1 ;DI定位到实际存放字符数量的地址ADD DI,NUM ;DI定位到可存放字符的缓冲区的最后一个地址,即右对齐REP MOVSBMOV AL,20H ;存入空格的ASCII码MOV CX,NUM+2MOV DL,BUF2+1MOV DH,0SUB CX,DXREP STOSB ;同上LEA DX,MES3MOV AH,09HINT 21H ;LEA DX,BUF1+2INT 21H ;LEA DX,BUF2+2INT 21H ;MOV AH,4CHINT 21HCODE ENDSEND START
方法三
DSEG SEGMENTSHOW DB 'Please enter two strings:',0AH,0DH,'$' ;提示键盘输入BUF DB 25 ; 缓冲区长度(含回车)ACTHAR DB 0 ; 保留单元, 存放输入的实际字符个数(不含回车)CHAR DB 25 DUP (0) ; 定义25个字节输入缓冲区
DSEG ENDS
ESEG SEGMENTDISP DB 25 DUP (0),0AH,0DH,'$' ; 定义显示缓冲区
ESEG ENDSSSEG SEGMENT STACKDB 20H DUP(0)
SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,ES:ESEG,SS:SSEG
START:MOV AX, DSEG ;数据段的段地址送入DSMOV DS, AXMOV AX, ESEG ;附加段的段地址送入ESMOV ES, AXMOV DX, OFFSET SHOW ;显示“Please enter two strings:”MOV AH, 9INT 21HMOV BL,2 ;输入字符串数量
NEXT:MOV DX, OFFSET BUF ;等待键盘输入字符串MOV AH, 0AHINT 21HMOV CL, ACTHAR ;将字符串输出到显示缓冲区,并右对齐。XOR CH, CHMOV SI, OFFSET CHARADD SI, CXDEC SIMOV DI, OFFSET DISP+24STDREP MOVSBMOV CL, BUF ;显示缓冲区左边空位填写为空格(20H)SUB CL, ACTHAR ;空位总位数XOR CH, CHMOV AL, 20HREP STOSBPUSH DS ;保存DS值PUSH ES ;将ES赋值给DSPOP DS;MOV DX, OFFSET DISP ;显示输入的字符串MOV AH, 9INT 21HPOP DS ;恢复DS值DEC BLJNZ NEXTMOV AH, 4CHINT 21HCSEG ENDSEND START
测试一——字符串的输入输出
DATAS SEGMENT;NUM EQU 25;STRING DB NUM,?,NUM DUP(?),0AH,0DH,'$'STRING DB 25,?,25 DUP(?),0AH,0DH,'$'MES1 DB 'Please enter a string:',0AH,0DH,'$'MES2 DB 0AH,0DH,'The answer is:',0AH,0DH,'$'
DATAS ENDS;这一部分是不需要的
STACKS SEGMENT STACKDB 200 DUP(?)
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AXLEA DX,MES1MOV AH,09HINT 21HLEA DX,STRINGMOV AH,0AHINT 21HLEA DX,MES2MOV AH,09HINT 21H;;;;;;;;;LEA SI,STRING+2MOV CL,STRING+1MOV AH,2
NEXT:MOV DL,[SI]INT 21HINC SIDEC CXJNZ NEXTMOV AH,4CHINT 21H
CODES ENDSEND START
测试二——改进
DATAS SEGMENT;NUM EQU 25;STRING DB NUM,?,NUM DUP(?),0AH,0DH,'$'STRING DB 25,?,25 DUP(?),0AH,0DH,'$'MES1 DB 'Please enter a string:',0AH,0DH,'$'MES2 DB 0AH,0DH,'The answer is:',0AH,0DH,'$'
DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS
START:MOV AX,DATASMOV DS,AXLEA DX,MES1MOV AH,09HINT 21HLEA DX,STRINGMOV AH,0AHINT 21HLEA DX,MES2MOV AH,09HINT 21H;;;;;;;;;MOV BL,STRING+1;MOV BH,0LEA SI,STRING+2MOV BYTE PTR[SI+BX],'$'MOV DX,SIMOV AH,9INT 21HMOV AH,4CHINT 21H
CODES ENDSEND START
测试三——改进
DATAS SEGMENT;NUM EQU 25;STRING DB NUM,?,NUM DUP(?),0AH,0DH,'$';认准美元符号24H,才允许9号功能输出字符串STRING DB 25,?,25 DUP(24H),0AH,0DH,'$'MES1 DB 'Please enter a string:',0AH,0DH,'$'MES2 DB 0AH,0DH,'The answer is:',0AH,0DH,'$'
DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS
START:MOV AX,DATASMOV DS,AXLEA DX,MES1MOV AH,09HINT 21HLEA DX,STRINGMOV AH,0AHINT 21HLEA DX,MES2MOV AH,09HINT 21H;;;;;;;;;LEA DX,STRING+2MOV AH,9INT 21HMOV AH,4CHINT 21H
CODES ENDSEND START
测试四——改进
DATAS SEGMENT;NUM EQU 25;STRING DB NUM,?,NUM DUP(?),0AH,0DH,'$';认准美元符号24H,才允许9号功能输出字符串STRING DB 25,?,25 DUP(?),0AH,0DH,'$'MES1 DB 'Please enter a string:',0AH,0DH,'$'MES2 DB 0AH,0DH,'The answer is:',0AH,0DH,'$'
DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS
START:MOV AX,DATASMOV DS,AXLEA DX,MES1MOV AH,09HINT 21HLEA DX,STRINGMOV AH,0AHINT 21HLEA DX,MES2MOV AH,09HINT 21H;;;;;;;;;;在输入字符串末尾插入符号(24H)MOV AL,STRING+1MOV AH,0ADD AX,2MOV SI,AXMOV STRING[SI],24HLEA DX,STRING+2MOV AH,9INT 21HMOV AH,4CHINT 21H
CODES ENDSEND START