回 帖 发 新 帖 刷新版面

主题:查找‘AME’出现的个数用十进制显示个数没有错不过没有结果

;;;;;在STR中查找‘AME’出现的个数用十进制显示个数没有错不过没有结果
;帮我看一下谢谢了!

;-----二进制数转换为十进制数方法----
;;CX中的数是个16位的二进制无符号数,所表示的数范围

在;;0~65535之间。转换的方法是首先将其反复减十进制万位上

的;;权值10000,一直减到不够减为止,并记录下减的次数,也

就;;是其中所包含10000的个数,那么它的十进制数的万位数字

就;;是它所包含的一万的个数,不够减时再用余下的数减千位上

的;;权值1000,得出千位上的数字,以此类推,可求出百位、十

位;;和个位数的数字。从而把该二进制数转换为十进制数。
;----在STR中查找‘AME’出现的个数用十进制显示个数------
DATA SEGMENT;---------------------------------
STR  DB 'KFAMEAMEDDAMEA'
COUNT  EQU $-STR   ;COUNT=字符串长度
qnum dw 10000,1000,100,10,1
buffer  db 5 dup(?)
DATA ENDS;--------------DATA----------------------
CODE  SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START: MOV AX,DATA;-------------开始---------------
       MOV  DS,AX
       MOV  ES,AX
       LEA DI,STR
       CALL FINDS   ;------查找AME-----
       MOV CX,BX;----?? 
       LEA DI,BUFFER; (DI)=存放转换结果存储区的首地址
       LEA BX,QNUM  ; (BX)=存放十进制权值存储区的首地址
       CALL BIN_DEC ;----转换二进制---- 
       LEA DX,buffer
       mov AH,9
       int 21h      ;----输出十进制----
       mov AH,4CH   ;---回到DOS下---
       INT 21H
FINDS PROC NEAR;------------查找AME------------
       MOV CX,COUNT
       MOV BX,0  ;“AME”程序的次数→BX
       MOV  AL,'A'
       CLD
    P: REPNE SCASB;------
       JE A
       JMP OUT1
    A: CMP  BYTE  PTR  [DI],  'M'
       JNE B
       CMP BYTE  PTR  [DI], 'E'
       JNE B       
       INC BX
    B: CMP CX,0
       JNE p
  OUT1:RET
 FINDS  ENDP---------------
       
;----------------转换二进制---- -----------
BIN_DEC PROC NEAR
          MOV DH,5  ;--(DH)=十进制的总位数(5位)
  NEXT1:  MOV DL,0  ;(DL)=十进制某位上的位数
  NEXT2:  SUB CX,[BX]
          JAE COUTB
          MOV [DI],DL
          ADD CX,[BX]
          INC DI
          ADD  BX,2
          DEC  DH
          JNZ  NEXT1
          RET
    COUTB:INC DL
          JMP NEXT2
  BIN_DEC ENDP
;----------------------------------
      
CODE  ENDS
    END START

回复列表 (共5个回复)

沙发

帮看看哟
我51都不玩的
就编了这个

板凳

先说一下你的错误.
1:buffter后面没有'$'
2:没有设置SS,SP;就算你没有PUSH,POP指令在使用CALL,RET的时候也要用堆栈.当然,默认的话系统会给你分配,但希望你还是自己控制的好.
3:DI没有初始化,虽然DI的数值在你情况下默认为0.
4:REPNZ SCASB 指令有两种情况会影响ZF,我估计你也考虑过了,想把他们合并在一起,但是你的处理是错误的.
5:CMP  BYTE  PTR  [DI],  'M'之后,为了和前面的REPNZ SCASB指令配合,还要处理
  CX,DI.
6:DL没有记得加上'0'
7:程序总体上感觉还是比较巧妙的,这个从简洁程度可以看出.但是我不太支持这样的一种简洁巧妙.因为第一它会使得你花过分的时间和精力去处理一些细节问题.第二个是一个程序过于简洁,就很难修改,比如我对你的程序修改,是在你程序的基础上修改的.修改过后,程序看起来就很乱了,如果要修改,很多寄存器的布局你又要重新思考了.
8:建议你还是多看一下书,发觉你老是犯一些基础性的错误.
在你程序基础上修改后的代码如下.DATA SEGMENT ;---------------------------------
STR1     DB    'KFAMEAMEDDAMEA'
COUNT  EQU $-STR1   ;COUNT=字符串长度
qnum dw 10000,1000,100,10,1
buffer  db 5 dup(?),'$'
DATA ENDS;--------------DATA----------------------
STACK    SEGMENT
    DB 512 DUP(0)
STACK_LEN    =    $
STACK    ENDS

CODE  SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START: MOV AX,DATA;-------------开始---------------
       MOV  DS,AX
       MOV  ES,AX
       MOV    AX,STACK
       MOV    SS,AX
       MOV    SP,STACK_LEN
      
       LEA DI,STR1
       CALL FINDS   ;------查找AME-----
       

       MOV CX,BX;----?? 
       LEA DI,BUFFER; (DI)=存放转换结果存储区的首地址
       LEA BX,QNUM  ; (BX)=存放十进制权值存储区的首地址
       CALL BIN_DEC ;----转换二进制---- 
       LEA DX,buffer
       mov AH,9
       int 21h      ;----输出十进制----
       mov AH,4CH   ;---回到DOS下---
       INT 21H

FINDS PROC NEAR;------------查找AME------------
       MOV CX,COUNT
       MOV BX,0  ;“AME”程序的次数→BX
 
       XOR     DI,DI
       CLD
    P: MOV  AL,'A'
         REPNE SCASB ;------
         OR    CX,CX
         JZ OUT1
    A: CMP  BYTE  PTR  [DI],  'M'
         PUSHF
         INC DI
         DEC CX
         JZ    OUT1
         POPF
       JNE B
       CMP BYTE  PTR  [DI], 'E'
       PUSHF
       INC DI
       DEC CX
       JZ    OUT1
       POPF
      
       JNE B       
       INC BX
    B: CMP CX,0
       JNE p
  OUT1:RET

 FINDS  ENDP ;---------------
       
;----------------转换二进制---- -----------
BIN_DEC PROC NEAR
          MOV DH,5  ;--(DH)=十进制的总位数(5位)
  NEXT1:  MOV DL,0  ;(DL)=十进制某位上的位数
  NEXT2:  SUB CX,[BX]
          JAE COUTB
          ADD    DL,'0'
          MOV [DI],DL
          ADD CX,[BX]
          INC DI
          ADD  BX,2
          DEC  DH
          JNZ  NEXT1
          RET
    COUTB:INC DL
          JMP NEXT2
  BIN_DEC ENDP
;----------------------------------
      
CODE  ENDS
    END START

3 楼

我们学得很浅
只学8086的指令
其它的都不学!还有2节课我们的汇编就不学了
宏后面的都不上了
你帮我修改的这个程序没有错
不过还是不得结果,你能不能在帮我看看
我是学电子的,学这个汇编只是一般运用,没有学得很深

4 楼

我可以得到结果,不过有点奇怪,第一次COPY下来编译运行的时候屏幕没有结果.
后面在调试,编译一下又可以了,都是一样的代码.
有时候测试的时候也会出现这样的情况,不知道为什么.不知道是不是XP对DOS的支持问题.

5 楼

那我再试看
谢谢了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册