Files
Operating-System/Experiment/asm-exp/实验七/实验七-3_字符串查找.asm
2026-06-25 00:09:09 +08:00

67 lines
1.5 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; 实验七-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