尚勇 發表於 2021-10-29 00:13:00

汇编语言学号姓名查找

<h1 id="汇编语言子串查找">汇编语言子串查找</h1>
<h4 id="题目要求">题目要求:</h4>
<p>​        在字符串中查找自己的学号和姓名,并返回地址。</p>
<p>​        在存储空间定义字符串,该字符串中含有自己的学号和姓名(拼音),这两个部分不能相邻,如:</p>
<pre><code class="language-assembly">String db “***”,“1502031001”,“***”,“zhang san”,“***”
</code></pre>
<p>​        要求:在屏幕中显示这两个字符串的偏移地址,并显示学号和姓名。</p>
<h4 id="代码">代码:</h4>
<pre><code class="language-assembly">;----数据段----
DATAS SEGMENT
      STR1 DB "***123456789***zhang san***";28个字符
      SNO DB "123456789"
      SNAME DB "zhang san"
      OFFSET_SNO DW 0
      OFFSET_SNAME DW 0
      STR2 DB 'The student number is:',"$"
      STR3 DB 0ah,0dh,'The student name is:',"$"
      STR4 DB 0ah,0dh,'The student number offset locate is:',"$"
      STR5 DB 0ah,0dh,'The student number is:',"$"
DATAS ENDS
;----堆栈段----
STACKSSEGMENT
      DW 256 DUP(0)
STACKS ENDS
;----代码段----
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,ES:DATSA,SS:STACKS
   
START:
    ;----初始化地址----
    MOV AX,DATAS
    MOV DS,AX
    MOV ES,AX
    MOV AX,STACKS
    MOV SS,AX
   
    ;----寻找学号-----
    MOV DI,OFFSET STR1;DI存放待查找字符串的地址
    MOV CX,28;设定循环次数为待查找字符串的长度
    MOV AL,SNO;取学号的第一个字符
    CLD
    SEARCH_SNO:
      REPNZ SCASB;查找第SI个字符,在查找到第一个相同字符时,ZF=0
      JNZ NOFIND_SNO;没找到就跳转到NOFIND
      LEA SI,SNO+1
      PUSH CX;
      PUSH DI;
      MOV CX,8;待查找字符串(学号)的余下(9-1)长度
      REPZ CMPSB
      POP DI;
      POP CX;
      JNZ SEARCH_SNO
    SUB DI,1
    MOV OFFSET_SNO,DI;学号偏移地址存入DI
    ;----若未寻找到学号----
    NOFIND_SNO:
      ;---此题待查找的字符串中必定含有学号和姓名,故此无操作---
      
   
    ;----寻找姓名-----
    MOV DI,OFFSET STR1;DI存放待查找字符串的地址
    MOV CX,28;设定循环次数为待查找字符串的长度
    MOV AL,SNAME;取姓名的第一个字符
    CLD
    SEARCH_SNAME:
      REPNZ SCASB;查找第SI个字符,在查找到第一个相同字符时,ZF=0
      JNZ NOFIND_SNAME;没找到就跳转到NOFIND
      LEA SI,SNAME+1
      PUSH CX;
      PUSH DI;
      MOV CX,8;待查找字符串(姓名)的余下(9-1)长度
      REPZ CMPSB
      POP DI;
      POP CX;
      JNZ SEARCH_SNAME
    SUB DI,1
    MOV OFFSET_SNAME,DI;学号偏移地址存入DI
    ;----若未寻找到姓名----
    NOFIND_SNAME:
      ;---此题待查找的字符串中必定含有学号和姓名,故此无操作---
   
    ;----输出学号----
    OUT_SNO:
      MOV DX,OFFSET STR2
      MOV AH,09H
      INT 21H
      ;----遍历输出学号字符串中每个字符---
      MOV SI,0
      MOV CX,9;学号长度
      MOV BX,OFFSET SNO
      LP1:
            MOV DX,BX
            MOV AH,02H
            INT 21H
            INC SI
            DEC CX
            JNZ LP1
      MOV DX,0DH
      MOV AH,02H
      INT 21H
    ;----输出姓名----
    OUT_NAME:
      MOV DX,OFFSET STR3
      MOV AH,09H
      INT 21H
      ;----遍历输出姓名字符串中每个字符---
      MOV SI,0
      MOV CX,9;姓名长度
      MOV BX,OFFSET SNAME
      LP2:
            MOV DX,BX
            MOV AH,02H
            INT 21H
            INC SI
            DEC CX
            JNZ LP2
      MOV DX,0DH
      MOV AH,02H
      INT 21H
   ;----输出学号的偏移地址----
   LOC_SNO:
      MOV DX,OFFSET STR4
      MOV AH,09H
      INT 21H
      ;----打印16进制的数字----
      MOV CX,0;记录入栈次数
      MOV AX,OFFSET_SNO;每次要打印的内容存入AX中
      MOV BX,10
      PUS:
            ;-----低位先入栈,高位后入栈
            MOV DX,0
            DIV BX ;除以10
            PUSH DX;将余数入栈
            INC CX;记录入栈次数作为输出时的循环次数
            CMP AX,0
            JNZ PUS;当商为0时退出循环
      POS:
            ;-----高位先输出,低位后输出
            POP DX
            ADD DX,30H
            MOV AH,2
            INT 21H
            LOOP POS
   ;----输出姓名的偏移地址----
   LOC_SNAME:
      MOV DX,OFFSET STR5
      MOV AH,09H
      INT 21H
      ;----打印16进制的数字----
      MOV CX,0;记录入栈次数
      MOV AX,OFFSET_SNAME;每次要打印的内容存入AX中
      MOV BX,10
      PUSHLP:
            ;-----低位先入栈,高位后入栈
            MOV DX,0
            DIV BX ;除以10
            PUSH DX;将余数入栈
            INC CX;记录入栈次数作为输出时的循环次数
            CMP AX,0
            JNZ PUSHLP;当商为0时退出循环
      POPLP:
            ;-----高位先输出,低位后输出
            POP DX
            ADD DX,30H
            MOV AH,2
            INT 21H
            LOOP POPLP   
CODES ENDS
ENDSTART
</code></pre><br><br>
来源:https://www.cnblogs.com/QSun77/p/15478393.html
頁: [1]
查看完整版本: 汇编语言学号姓名查找