迪士尼在逃国王 發表於 2021-11-27 14:13:03

汇编语言系列之汇编实现字符串操作

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1.字符串匹配设计</li><ul class="second_class_ul"><li>1.1设计要求:</li><li>1.2设计思路:</li><li>1.3程序清单:</li><li>1.4程序运行结果及分析:</li></ul><li>2.字符串输入及显示设计</li><ul class="second_class_ul"><li>2.1设计要求:</li><li>2.2设计思路:</li><li>2.3程序清单:</li><li>2.4程序运行结果及分析:</li></ul></ul></div><p>软件:emu8086</p>
<p>语言:汇编语言(Assembly)</p>
<p>注意:本文列出了字符串匹配和字符串输入显示的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。</p>
<p class="maodian"></p><h2>1.字符串匹配设计</h2>
<p class="maodian"></p><h3>1.1设计要求:</h3>
<p>要求掌握提示信息的设置及读取键入信息的方法。设计程序,从键盘输入两个字符串进行比较,如相同,则显示“MATCH”,否则显示“NO MATCH”。</p>
<p class="maodian"></p><h3>1.2设计思路:</h3>
<p>DOS功能调用输入两个字符串,通过CMPSB指令一个字节一个字节比较字符串,相同输出MATCH,不同输出NO MATCH。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712540928.png" /></p>
<p class="maodian"></p><h3>1.3程序清单:</h3>
<div class="jb51code">
<pre class="brush:plain;">
DATA    SEGMENT
      pkey   DB0DH,0AH, 'please input str1 end by enter:','$'
      qkey   DB0DH,0AH,'please input str2 end by enter:','$'
      skey   DB0DH,0AH,'MATCH','$'
      tkey   DB0DH,0AH,'NO MATCH','$'
      BUFF1DB101,0,101 DUP(0)
      BUFF2DB101,0,101 DUP(0)`
DATA    ENDS

CODE    SEGMENT
      ASSUMECS:CODE,DS:DATA
      
START:MOV AX,DATA
      MOV DS,AX
      MOV ES,AX          ;数据段和堆栈段初始化
            
      LEA DX,pkey            
      MOV AH,9
      INT 21H               ;DOS功能调用,输出字符串
      LEA DX,BUFF1
      MOV AH,0AH
      INT 21H               ;输入第一个字符串到BUFF1缓冲区
      
      LEA DX,qkey
      MOV AH,9
      INT 21H
      LEA DX,BUFF2
      MOV AH,0AH
      INT 21H               ;输入第二个字符串到BUFF2缓冲区
   
      LEA SI,BUFF1          ;将第一个字符串给SI
      LEA DI,BUFF2          ;将第二个字符串给DI
      MOV CX,53            ;给计数器值
      CLD                  ;清方向标准DF
      REPZ CMPSB      ;一个字节一个字节比较字符串,SI和DI递增
      JZ MATCH             ;全部字节都相等输出MATCH
      LEA DX,tkey
      MOV AH,9
      INT 21H               ;不等输出NO MATCH
      JMP START
      
MATCH:LEA DX,skey
      MOV AH,9
      INT 21H               ;DOS功能调用,输出MATCH
      JMP START

CODE    ENDS
      END   START</pre>
</div>
<p class="maodian"></p><h3>1.4程序运行结果及分析:</h3>
<p>主要是学会CMPSB指令的使用,清零DF标志使DI,SI递增,然后实现一个字节一个字节的比较。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712540929.png" /></p>
<p>图7 字符串匹配设计结果</p>
<p class="maodian"></p><h2>2.字符串输入及显示设计</h2>
<p class="maodian"></p><h3>2.1设计要求:</h3>
<p>要求掌握字符和数据的显示方法。设计程序,接收键盘键入字符串,包括字符和数字,并在终端显示。设计要求:有键入和结束提示信息,如在键入字符串之前提示:INPUT STRING,THE END FLAG IS $。要求统计键入字符串中数字(0-9)的个数和字符的个数,分行显示。</p>
<p class="maodian"></p><h3>2.2设计思路:</h3>
<p>判断在0~9范围内DI累加,判断在a~z和A~Z范围内SI累加,然后将SI和DI即字母个数和数字个数分别转十进制输出。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712541030.png" /></p>
<p class="maodian"></p><h3>2.3程序清单:</h3>
<div class="jb51code">
<pre class="brush:plain;">
DATA    SEGMENT
      pkeyDB0dh,0ah,"input string,the end flag is $"
      skeyDB0dh,0ah,'abc length is:','$'
      tkeyDB0dh,0ah,'num length is:','$'
DATA    ENDS

CODE    SEGMENT
      ASSUMECS:CODE,DS:DATA
      
START:MOV AX,DATA
      MOV DS,AX
      MOV ES,AX               ;数据段堆栈段初始化
      LEA DX,pkey
      MOV AH,9
      INT 21H                   ;DOS功能调用,输出字符串
      MOV DX,'$'
      MOV AH,2
      INT 21H                   ;DOS功能调用,输出$
      MOV DX,3AH
      MOV AH,2
      INT 21H                   ;DOS功能调用,输出:
      MOV DX,0DH
      MOV AH,2
      INT 21H                   ;DOS功能调用,归位
      MOV DX,0AH
      MOV AH,2
      INT 21H                   ;DOS功能调用,换行
      
      MOV SI,0
      MOV DI,0            ;清零,SI存放字母个数,DI存放数字个数
      
INPUT:MOV AH,1
      INT 21H
      CMP AL,'$'
      JZINEND
      CMP AL,'z'
      JAINPUT                  
      CMP AL,'a'
      JAE ABC1                   ;输入为a~f,SI加1
      CMP AL,'Z'
      JAINPUT
      CMP AL,'A'                        
      JAE ABC1                   ;输入为A~F,SI也加1
      CMP AL,'9'
      JAINPUT
      CMP AL,'0'
      JAE NUM1                   ;输入为0~9,DI加1
      JMP INPUT
      
ABC1:INC SI
       JMP INPUT   
      
NUM1:INC DI
      JMP INPUT
               
INEND:MOV BX,0
      MOV CX,10      
      MOV AX,SI               ;将字母个数给AX(十六进制转十进制)
      
LP1:    MOV DX,0
      DIV CX       ;AX表示的32位数除以10,商放在AX,余数放在DX
      PUSH DX                   ;将余数压入栈
      INC BX
      CMP AX,0                  ;商不为0就继续除10
      JNZ LP1
      LEA DX,skey
      MOV AH,9
      INT 21H                  ;DOS功能调用,输出字符串

LLP1:   POP DX                     ;DX中数据依次出栈并显示
      ADD DX,30H
      MOV AH,2
      INT 21H                  ;DOS功能调用,输出字母个数
      DEC BX
      JNZ LLP1
      MOV BX,0
      MOV AX,DI            ;将数字个数给AX(十六进制转十进制)
      
LP2:
      MOV DX,0               
      DIV CX       ;AX表示的32位数除以10,商放在AX,余数放在DX
      PUSH DX               ;将余数压入栈
      INC BX
      CMP AX,0
      JNZ LP2               ;商不为0就继续除10
      LEA DX,tkey
      MOV AH,9
      INT 21H                  ;DOS功能调用,输出字符串
      
LLP2:   POP DX                   ;DX中数据依次出栈并显示
      ADD DX,30H
      MOV AH,2
      INT 21H                  ;DOS功能调用,输出数字个数
      DEC BX
      JNZ LLP2
      JMP START
      
CODE    ENDS
      END   START</pre>
</div>
<p class="maodian"></p><h3>2.4程序运行结果及分析:</h3>
<p>当输入字母或数字个数大于10之后统计输出比较麻烦,这里使用了除以10循环并存入堆栈再依次输出的方法实现输出。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712541031.png" /></p>
<p>图8 字符串输入及显示设计结果</p>
<p>到此这篇关于汇编语言系列之汇编实现字符串操作的文章就介绍到这了,更多相关汇编字符串操作内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>汇编语言系列之汇编实现简单数学运算</li><li>汇编语言系列之汇编实现各种码制的转换(思路详解)</li><li>汇编语言Debug命令详解教程</li><li>汇编语言LDR指令和LDR伪指令详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言系列之汇编实现字符串操作