| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 663 人关注过本帖
标题:[讨论];;;;;在STR中查找‘AME’出现的个数用十进制显示个数没有错不过没有结 ...
只看楼主 加入收藏
我的汇
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-4-20
收藏
 问题点数:0 回复次数:1 
[讨论];;;;;在STR中查找‘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

搜索更多相关主题的帖子: STR AME 十进制 结果 
2006-05-01 21:42
公子吕
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-5-4
收藏
得分:0 

你的那个将十进制转二进制的程序我调了几个小时还没成,你又来了一个题.
你的两个子程序可能都有问题.我改写了你的程序,在masm5下汇编连接正常显示3.
由于时间紧迫(还没吃午饭呢),大小写很混乱,你将就着看看 建议你把我改写的
那个16位二进制补码数转换为ascii字符串子程序保留下来,用宏做成一条指令
以后你会经常用得着. 我的代码如下:

DATA SEGMENT
STR DB 'KFAMEAMEDDAMEA$'
buffer db 5 dup(?),'$'
db '$'
DATA ENDS

stack segment para stack 'stack'
db 2048 dup(0)
stack ends

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ss:stack
START:

MOV AX,DATA
MOV DS,AX
mov si,offset STR
dec si
CALL FIND
mov ax,bx
mov bx,offset buffer
push ax
push bx
call itoaproc
mov dx,offset buffer
mov ah,9
int 21h
mov ah,7
int 21h
mov AH,4CH
INT 21H


;-----------------------------------------------
;查找字符串'AME'子程序
;----------------------------------------------
FIND PROC NEAR
dec si
P: inc si
CMP byte ptr [si], '$' ;遇'$'字符串结束,退出
jz out1
CMP byte ptr [si], 'A'
jnz p
inc si
CMP byte ptr [si], 'M' ;找到A,si加1,看紧接着是不是M
JNz p ;不是M,往后找A
inc si
CMP byte ptr [si], 'E' ;找到A和M,si加1,看紧接着是不是E
JNz p ;不是E,往后找A
INC BX
jmp p
out1:RET
FIND ENDP


;-----------------------------------------------
;该子程序将一个16位二进制补码数转换为ascii字符串
;使用前将要转换的数和转换后的字符串地址先后压入堆栈.
;-----------------------------------------------------
itoaproc proc near
push bp
mov bp,sp
push ax
push bx
push cx
push dx
push di
pushf

mov ax,[bp+6]
mov di,[bp+4]

ifSpecial:
cmp ax,8000h
jne EndIfSpecial
mov BYTE PTR [di],'-'
mov BYTE PTR [di+1],'3'
mov BYTE PTR [di+2],'2'
mov BYTE PTR [di+3],'7'
mov BYTE PTR [di+4],'6'
mov BYTE PTR [di+5],'8'
jmp ExitIToA
EndIfSpecial:

mov dx, ax

mov al,' '
mov cx,5 ; first five
cld ; bytes of
rep stosb ; destination field

mov ax, dx ; copy source number
mov cl,' ' ; default sign (blank for +)
IfNeg: cmp ax,0 ; check sign of number
jge EndIfNeg ; skip if not negative
mov cl,'-' ; sign for negative number
neg ax ; number in AX now >= 0
EndIfNeg:

mov bx,10 ; divisor

WhileMore: mov dx,0 ; extend number to doubleword
div bx ; divide by 10
add dl,30h ; convert remainder to character
mov [di],dl ; put character in string
dec di ; move forward to next position
cmp ax,0 ; check quotient
jnz WhileMore ; continue if quotient not zero

mov [di],cl ; insert blank or "-" for sign

ExitIToA: popf ; restore flags and registers
pop di
pop dx
pop cx
pop bx
pop ax
pop bp
ret 3 ;exit, discarding parameters
itoaproc ENDP

code ends
end start

2006-05-06 12:35
快速回复:[讨论];;;;;在STR中查找‘AME’出现的个数用十进制显示个数没有错不过 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018785 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved