1.
cld
repe scasb ;当字符串中有m时,比较字符串中下一字符,否则cx也不为0时,重复执行scab. 所以要给为repne.
mov ah,[di] ;
cmp ah,al ;既然用了从字符串重复前缀,那你上面这两条指令是多余的.
jne last
mov dl,ah ;这里估计是你手误吧 al
mov ah,02h
int 21h
结果调试后的程序:
code segment
assume cs:code, ds:code, es:code
start:jmp begin
BUS_TITLE db 'computer wizards'
WORK_SPACE db 16 dup(?)
find db 'm'
begin:
mov ax,code
mov ds,ax
mov es,ax
mov cx, 16
lea di, BUS_TITLE
mov al, find
cld
repne scasb
jne last
mov dl,al
mov ah,02h
int 21h
last :
mov ax,4c00h
int 21h
code ends
end start
2. data segment
sentence db 50,?,50 dup(?) ;你后面要0ah功能输入字符串,那你的缓冲区要符合它的要求啊.
keyword db ?
match db 'Match',0dh,0ah,'$'
nomatch db 'No match',0dh,0ah,'$'
mes1 db 'enter keyword:','$'
mes2 db 'enter sentence:','$'
yes db 00
data ends
;stack segment
;stack ends 你定义这是什么意思?栈可不是你这样定义的哦
stack segment stack
db 128 dup(0)
stack ends
code segment
assume cs:code, ds:data
start:
mov ax,data
mov ds,ax
lea dx,mes1
mov ah,09h
int 21h
mov ah,01h
int 21h
mov si,ax
mov dl,0dh ;换行
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
lea dx,mes2
mov ah,09h
int 21h
lea dx, sentence
mov ah,0ah ;你用0ah功能的时候你查查书,看看它对缓冲区的要求,
int 21h
mov dl,0dh ;换行
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
lea di,sentence
push ds
pop es
mov cl,[di+1]
mov ch,0
push cx
cld
add di,2
mov ax,si
repnz scasb
jnz noma ;当在字符串里没找到相同字符,转noma
inc yes
pop bx
sub bx,cx ;你这里bx有可能会是两位十进制啊,这个问题得考虑,所以你单纯的or bx,30h是不对的
mov ax,bx
mov bl,10
div bl
xchg al,ah
add ax,3030h
mov bx,ax
mov dl,bh ;输出十位
mov ah,02h
int 21h
mov dl,bl ;输出个位
mov ah,02h
int 21h
mov dl,0dh ;换行
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
;cmp cx,00
;jnz l1 无论怎样都不可能在跳到repnz scasb,你跳repnz scasb那不是把做过的工作在做一遍吗
jmp ma
noma: lea dx,nomatch
mov ah, 09h
int 21h
jmp last
ma: lea dx,match
mov ah, 09h
int 21h
last: mov ah,7
int 21h ;任意键结束
mov ah,4ch
int 21h
code ends
end start
;这个程序中yes标志是没必要的,程序有很多地方值得优化,但为你能看的明白,没做太多改动
LZ 不改行吗
我有查找输入关键字 (长度不定
输入句子查找关键字的程序
要的话 谢谢采纳 留下邮箱
信誉保证肯定能够满足LZ两程序要求 而且更好