汇编语言学号姓名查找

汇编语言子串查找

题目要求:

​ 在字符串中查找自己的学号和姓名,并返回地址。

​ 在存储空间定义字符串,该字符串中含有自己的学号和姓名(拼音),这两个部分不能相邻,如:

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 
posted on 2021-10-29 00:13  QSun  阅读(282)  评论(0编辑  收藏  举报