- 实验名称:实验三 串操作指令
二、实验内容:
在数据段定义缓冲区,从键盘接收两串字符到两个缓冲区,将第二串中与第一串字符不一致的字符显示在屏幕。
- 实验过程:
源代码:
data segmentmess1 db 16,?,16 dup(?),13,10mess2 db 16,?,16 dup(?),13,10buff1 db 'Please input string1: $'buff2 db 'Please input string2: $'buff3 db 'NO.$'data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov es,ax ;let ds and ex link with data segmentmov dx,offset buff1mov ah,9int 21h ;output buff1lea dx,mess1mov ah,0ahint 21hmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21h ;input mess1 and operate enter for next inputmov dx,offset buff2mov ah,9int 21h ;output buff2lea dx,mess2mov ah,0ahint 21hmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21h ;input mess2 and operate entermov cx,0 ;clear cxmov cl,mess2+1 ;assign cl as mess1+1 which is point to real string sizelea si,mess1+2 ;pass mess1 string effective address to dilea di,mess2+2 ;pass mess2 string effective address to siscan:cld ;set directionrepe cmpsb ;compare mess1 and mess2, when cx=0 or zf=0 exitjnz output ;ZF=0 jump to outputjmp exitoutput:mov dx,offset buff3mov ah,9int 21h ;output buff3xor ax,ax ;clear axmov al,mess2+1 ;assign al with mess2 real lengthsub al,cl ;label the location of different characteradd al,'0'mov dl,al ;ASCII codemov ah,2int 21hmov dl,':'mov ah,2int 21h ;output NO.x:mov dl, byte ptr ds:[si-1]mov ah,2int 21h ;output mess1 original charactermov dl,'-'mov ah,2int 21h ;output '-'mov dl, byte ptr es:[di-1] ;assign dl with different character which is the front di point tomov ah,2int 21h ;output different charactermov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21h ;operate enterjcxz exit ;when cx=0 jump to exitjmp scan ;when cx!=0, go on scanning next characterexit:mov ah,4chint 21hcode endsend start
运行截图:
- 实验小结:
本次实验完成串扫描任务,任务内容是找出两个串中的不同字符,按照以下格式输出结果:“NO.X:x-x”,在本次实验中,我对数据段,缓冲区的概念了解地更为深刻,在老师的指导下我知道了回车和换行是两种不同的操作,一个是13号命令,一个是10号命令,此外我更加深刻地认识到了,汇编在计算机中运行的数据或是指令全部都是以二进制代码形式执行的。所以在输出结果的时候,一定要把对应的结果转换成其ASCII码形式,否则得不到想要的结果。此外我还加强了对串操作指令的熟悉,要想知道一个指令的工作逻辑以及后面一条指令与其的关系,首先我们要关注“这条指令的执行前提”以及“该指令执行完后的影响”。在我们前面算术运算类指令章节中提及过比较指令CMP,CMP属于减法运算指令,影响除DF外的其他全部标志位,但是不影响目标操作数的值,因此比较类指令后面跟着的一定是和标志位有关系的跳转指令。与前面的数据传送类指令一样,传比较指令也分为三个:CMPS、CMPSB、CMPSW,其中CMPSB、CMPSW均采用隐含寻址的方法,目标操作数默认为DS:SI,源操作数默认为ES:DI。