67 lines
1.5 KiB
NASM
67 lines
1.5 KiB
NASM
; 实验七-3: 字符串查找程序 - 使用REP SCASB
|
||
; 功能: 在字符串中查找特定字符
|
||
|
||
DATAS SEGMENT
|
||
TARGET_STRING DB 'Hello, Assembly Language!', 0 ; 目标字符串
|
||
SEARCH_CHAR DB 'A' ; 要查找的字符
|
||
CHAR_FOUND DB 'Character Found!', 0DH, 0AH, '$'
|
||
CHAR_NOT_FOUND DB 'Character Not Found!', 0DH, 0AH, '$'
|
||
POSITION DB 'Position: ', 0 ; 位置信息
|
||
DATAS ENDS
|
||
|
||
STACKS SEGMENT
|
||
DB 64 DUP(?)
|
||
STACKS ENDS
|
||
|
||
CODES SEGMENT
|
||
ASSUME CS:CODES, DS:DATAS, SS:STACKS
|
||
|
||
START:
|
||
MOV AX, DATAS
|
||
MOV DS, AX
|
||
MOV ES, AX ; SCASB使用ES:DI
|
||
|
||
LEA DI, TARGET_STRING ; DI指向目标字符串
|
||
MOV AL, SEARCH_CHAR ; AL=要查找的字符
|
||
|
||
; 计算字符串长度
|
||
MOV CX, 0
|
||
COUNT_LOOP:
|
||
CMP BYTE PTR [DI + CX], 0
|
||
JE COUNT_DONE
|
||
INC CX
|
||
JMP COUNT_LOOP
|
||
COUNT_DONE:
|
||
|
||
; 使用REP SCASB查找字符
|
||
; SCASB将AL与[ES:DI]比较,不等则继续,相等则停止
|
||
REP SCASB
|
||
|
||
; 检查查找结果
|
||
; 如果CX=0且ZF=0,说明没找到
|
||
; 如果ZF=1,说明找到了
|
||
JZ FOUND
|
||
|
||
; 未找到的情况
|
||
LEA DX, CHAR_NOT_FOUND
|
||
JMP DISPLAY
|
||
|
||
FOUND:
|
||
; 计算位置:原长度 - 剩余长度 = 找到的位置
|
||
MOV AX, 0
|
||
SUB AX, CX ; AX = 原长度 - CX
|
||
DEC AX ; 位置从1开始计数
|
||
ADD AX, 1
|
||
|
||
LEA DX, CHAR_FOUND
|
||
|
||
DISPLAY:
|
||
MOV AH, 09H
|
||
INT 21H
|
||
|
||
; 程序结束
|
||
MOV AH, 4CH
|
||
INT 21H
|
||
|
||
CODES ENDS
|
||
END START |