80x86汇编编程:在输入的字符串中查找关键字

编写程序:
接收键入的一个句子以及一个关键字;
如果句子中不包含关键字则显示“No match !”;
如果句子包含关键字则显示“Match !”,且把该字在句子中的位置用十六进制数显示出来。

满意回答:

;================================
DATAS  SEGMENT

       T1  DB  10, 13, 'Input String: $'
       T2  DB  10, 13, 'Input a Char: $'

  RESULT1  DB  10, 13, 'MATCH !', 13, 10, '$'
  RESULT2  DB  10, 13, 'NO  MATCH !', 13, 10, '$'

      KEY  DB  100 DUP(?)
      SEN  DB  ?

DATAS  ENDS
;================================
CODES  SEGMENT
    ASSUME  CS:CODES, DS:DATAS
START:
    MOV  AX, DATAS
    MOV  DS, AX
;--------------------------------
    MOV  DX, OFFSET  T1 ;Input String:
    MOV  AH, 09H
    INT  21H

    XOR  BX, BX
L5:
    MOV  AH, 01H
    INT  21H
    MOV  KEY[BX], AL ;保存输入的字符
    INC  BX
    CMP  AL, 13      ;是“回车”?
    JNZ  L5          ;不是,就继续输入。超过100个就会出错,但愿不会输入这么多吧 !

    MOV  DX, OFFSET  T2 ;Input a Char:
    MOV  AH, 09H
    INT  21H

    MOV  AH, 01H
    INT  21H
    MOV  SEN, AL     ;保存关键字
;-----------------------------
L1:
    MOV  AL, KEY[BX - 1]
    CMP  AL, SEN
    JZ   L3          ;找到了转移.
    DEC  BX
    JNZ  L1
;-----------------------------
L2:                  ;没有找到.
    MOV  DX, OFFSET  RESULT2
    MOV  AH, 09H
    INT  21H
    JMP  L4
L3:
    MOV  DX, OFFSET  RESULT1  ;MATCH !
    MOV  AH, 09H
    INT  21H
;---------------------下面是显示位置
    MOV  AL, BL
    MOV  AH, 0
    MOV  BL, 16
    DIV  BL

    MOV  DX, AX

    ADD  DL, 30H
    CMP  DL, 3AH
    JB   L7
    ADD  DL, 7
L7:
    MOV  AH, 2
    INT  21H

    MOV  DL, DH

    ADD  DL, 30H
    CMP  DL, 3AH
    JB   L8
    ADD  DL, 7
L8:
    MOV  AH, 2
    INT  21H

    MOV  DL, 'H'
    MOV  AH, 2
    INT  21H
;-----------------------------
L4:
    MOV  AH, 4CH
    INT  21H
CODES  ENDS
    END  START
;================================

如果含有多个关键字,本程序只是显示最后输入的关键字位置。

运行结果如下:

c:\masm510>SEN
Input String: SASFRGERTEGDFBDBD
Input a Char: D
MATCH !
11H

c:\masm510>SEN
Input String: EWEWE
Input a Char: M
NO  MATCH !

;================================
回答者: 做而论道 | 2012-4-13 09:55
原题网址:http://zhidao.baidu.com/question/409735230.html
;================================

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序接收用户键入的一个关键字以及一个句子。如果句子不包含关键字则显示’no match’;如果句子包含关键字则显示‘match’,且把该字在句子的位置用十六进制数显示出来,要求程序的执行过程如下: enter keyword :abc enter sentence :we are studying abc match at location :11H of the sentence enter sentence: xyz ,ok? no match enter sentence :^c 四. 方法说明: 程序可由三部分组成: (1 ) 输入关键字和一个句子,分别存入相应的缓冲区,可用功能调用0AH。 (2) 在句子查找关键字。 1. 关键字和一个句子相应字段的比较可使用串比较指令,为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,这样,相应的寄存器内容也有了确定的含义,如下: SI 寄存器为关键字的指针 DI 寄存器为句子正相比较的字段的指针 CX寄存器存放关键字的字母个数(长度) 2. 整个句子和关键字的比较过程可以用一个循环结构来完成。循环次数为: (句子长度--关键字长度)+1在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“no match”,循环还需要用到BX寄存器,它用来保存句子当前正在比较字段的首地址。 (3) 输出信息: 用功能调用09h分“找到”或“找不到”两种情况分别显示不同的信息。在“找到”时,还要求显示出匹配字符串在句子的位置,在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1 即是所要的匹配字符串在句子的位置,可将位置转换为十六进制数从屏幕上显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值