匯編語言子串查找
題目要求:
在字符串中查找自己的學號和姓名,並返回地址。
在存儲空間定義字符串,該字符串中含有自己的學號和姓名(拼音),這兩個部分不能相鄰,如:
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