汇编语言学号姓名查找
汇编语言子串查找
题目要求:
在字符串中查找自己的学号和姓名,并返回地址。
在存储空间定义字符串,该字符串中含有自己的学号和姓名(拼音),这两个部分不能相邻,如:
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