请教cmp指令 汇编语言 微机原理

小弟编了一个关于在字符串中找关键字的程序,可编译到start5时cmp指令总出错,请大神帮忙。悬赏50.
DATA SEGMENT
DA1 DB 'PLEASE INPUT STRING$'
DA2 DB 'PLEASE INPUT CHARACTE$'
DA3 DB 'FOUND$'
DA4 DB 'NOT FOUND$'
DA5 DB 'PLEASE INPUT STRING LENGTH$'
DA6 DB 'ERROR,INPUT AGAIN$'
STR DB 10H,?,10H DUP(?)
LEG DW ?
KEY DB ?
DATA ENDS

CRLF MACRO
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM

CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START1: MOV DX,DATA
MOV DS,DX

LEA DX,DA1
MOV AH,9
INT 21H

START2: CRLF

LEA DX,DA5
MOV AH,9
INT 21H

LEA DX,LEG
MOV AH,01H
INT 21H

START3: CRLF

LEA DX,DA1
MOV AH,9
INT 21H

LEA DX,STR
MOV AH,0AH
INT 21H

START4: CRLF

LEA DX,DA2
MOV AH,9
INT 21H

LEA DX,KEY
MOV AH,0AH
INT 21H

START5: LEA BX,STR+1
MOV CX,[BX]
LEA DX,LEG
CMP BX,[DX]
JE START6
JMP START3

START6: LEA BX,STR+2

LP1: MOV AL,[BX]
INC BX
CMP AL,KEY
JE FOUND
DEC CX
CMP CX,0
JE NOTFOUND
JMP LP2

LP2: MOV AL,[BX]
INC BX
CMP AL,KEY
JE FOUND
DEC CX
CMP CX,0
JE NOTFOUND
JMP LP1

FOUND: CRLF

LEA DX,DA3
MOV AH,9
INT 21H

NOTFOUND: CRLF

LEA DX,DA4
MOV AH,9
INT 21H

CODE ENDS
END START1

  cmp是汇编的比较指令;
  cmp(compare)指令的作用:进行比较两个操作数的大小;
  例如:
  cmp oprd1,oprd2
  为第一个操作减去第二个操作数,但不影响第两个操作数的值;
  它影响flag的CF,ZF,OF,AF,PF

  怎么判断大小呢?
  若执行指令后;
  ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0
  当无符号时:
  若
  CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
  CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
  当有符号时:
  若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
  若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
  若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
  若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
  最后两个可以作出这种判断的原因是,溢出的本质问题:
  两数同为正,相加,值为负,则说明溢出;
  两数同为负,相加,值为正,则说明溢出;
  故有,正正得负则溢出,负负得正则溢出。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-29
  cmp是汇编的比较指令;
  cmp(compare)指令的作用:进行比较两个操作数的大小;
  例如:
  cmp oprd1,oprd2
  为第一个操作减去第二个操作数,但不影响第两个操作数的值;
  它影响flag的CF,ZF,OF,AF,PF

  怎么判断大小呢?
  若执行指令后;
  ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0
  当无符号时:
  若
  CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
  CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
  当有符号时:
  若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
  若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
  若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
  若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
  最后两个可以作出这种判断的原因是,溢出的本质问题:
  两数同为正,相加,值为负,则说明溢出;
  两数同为负,相加,值为正,则说明溢出;
  故有,正正得负则溢出,负负得正则溢出。
第2个回答  2014-05-05
括号里只能放bx,si,di,bp寄存器,其它的不合规则。
相似回答