汇编初学者,以下编写的代码不能实现题目要求,求汇编高手帮忙改正,在线等。。

2024-11-26 04:42:15
推荐回答(2个)
回答1:

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标志是没必要的,程序有很多地方值得优化,但为你能看的明白,没做太多改动

回答2:

LZ 不改行吗
我有查找输入关键字 (长度不定
输入句子查找关键字的程序
要的话 谢谢采纳 留下邮箱
信誉保证肯定能够满足LZ两程序要求 而且更好