匯編語言學號姓名查找


匯編語言子串查找

題目要求:

​ 在字符串中查找自己的學號和姓名,並返回地址。

​ 在存儲空間定義字符串,該字符串中含有自己的學號和姓名(拼音),這兩個部分不能相鄰,如:

String db “***”,“1502031001”,“***”,“zhang san”,“***”

​ 要求:在屏幕中顯示這兩個字符串的偏移地址,並顯示學號和姓名。

代碼:

;----數據段----
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
;----堆棧段----
STACKS  SEGMENT
      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[SI]
            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[SI]
            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
END  START 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM