• 汇编语言学号姓名查找


    汇编语言子串查找

    题目要求:

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

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

    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 
    
  • 相关阅读:
    Android相对布局RelativeLayout常用到的属性
    用LinkedList模拟队列(Java容器)
    JAVA数组(一)
    SQL分页查询(转)
    asp.net 子窗体和父窗体交互
    Silverlight加载外部XAP包和页面
    As.net 动态反射程序集里面DLL并创建对象
    Silverlight LIstBox 实现横向排列元素 并且自动换行
    java jdbc 连接SQL数据库
    Silverlight Command的运用
  • 原文地址:https://www.cnblogs.com/QSun77/p/15478393.html
Copyright © 2020-2023  润新知