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

问题一:在bus_title中查找是否有'm',若有则显示输出
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
repe scasb
mov ah,[di]
cmp ah,al
jne last
mov dl,ah
mov ah,02h
int 21h
last :
mov ax,4c00h
int 21h
code ends
end start
问题二:
输入一个关键字(一个字符),然后再输入一个句子,查找句子中出现的该字符,显示输出位置和总数,并显示“match”字样,没有则显示“no match”
data segment
sentence db 50 dup(?)
keyword db ?
match db 'Match','$'
nomatch db 'No match','$'
mes1 db 'enter keyword:','$'
mes2 db 'enter sentence:','$'
yes db 00
data ends

stack segment
stack ends

code segment
assume cs:code, ds:data, es:stack
start:
mov ax,data
mov ds,ax
mov ax,stack
mov es,ax

lea dx,mes1
mov ah,09h
int 21h

;lea al, keyword
mov ah,01h
int 21h
;mov keyword,al

lea dx,mes2
mov ah,09h
int 21h

lea dx, sentence
mov ah,0ah
int 21h

;mov al, keyword
lea di, sentence
mov cx, [di+1]
push cx
cld
l1:
repnz scasb
jz found
cmp yes,00
jz noma
jmp ma

found:
inc yes
pop bx
push bx
sub bx,cx
or bx,30h
mov dl,bl
mov ah,02h
int 21h
cmp cx,00
jnz l1
noma:
lea dx,Nomatch
mov ah, 09h
int 21h
jmp last
ma:
lea dx,match
mov ah, 09h
int 21h
last:
mov ah,4ch
int 21h
code ends
end start
请帮忙改正错误,谢谢了!!

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

改的程序我看懂了,恍然大悟啊,我第二个程序是想把字符串里所有匹配的字符的位置全部输出,所以才有了跳转回去的语句,还有yes是用来记录匹配个数的,劳烦能否帮我改成符合要求的啊?我自己写了一下出现了一堆乱码啊,先谢过了

追答

sentence db 50,?
sent_begin db 50 dup(?)

code segment
assume cs:code,ds:data,es:data
start:mov ax,data
mov ds,ax
mov dx,offset mes1
call disp_infor ;输出mes1
mov ah,01h
int 21h ;获取关键字
mov keyword,al ;存关键字
call newline
mov dx,offset mes2
call disp_infor ;输出mes2
mov dx,offset sentence
mov ah,0ah
int 21h ;获取字符串
call newline
mov al,keyword
mov di,offset sent_begin
push ds
pop es
mov cl,sentence[1]
mov ch,0
mov si,cx
go_on:cld
repnz scasb
jcxz over ;cx=0搜索结束,但最后个字符可能是关键字
ok:inc yes
mov bx,si
sub bx,cx
call BToAsc
call newline
jmp go_on
over:jnz end_char_no ;最后个字符不是关键字转end_ch_no
inc yes
mov bx,si
sub bx,cx
call BToAsc
call newline
end_char_no:
cmp yes,0
jnz ma ;yes=0没有关键字
noma:mov dx,offset nomatch
mov ah,09h
int 21h
jmp last
ma:mov dx,offset match
mov ah,09h
int 21h
last:mov ah,7
int 21h ;任意键结束
mov ah,4ch
int 21h
;-------------------------------------
disp_infor proc
mov ah,09h
int 21h ;输出mes1
ret
disp_infor endp
;-------------------------------------
BToAsc proc
push ax
push dx
mov ax,bx
mov bl,10
div bl
xchg al,ah
mov bx,ax
add bx,3030h
mov dl,bh ;输出十位
mov ah,02h
int 21h
mov dl,bl ;输出个位
mov ah,02h
int 21h
pop dx
pop ax
ret
BToAsc endp
;----------------------------------
newline proc
push ax
push dx
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
pop dx
pop ax
ret
newline endp
code ends
end start
程序贴不上来了,前两行是在上面基础上修改下data段

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-18
LZ 不改行吗
我有查找输入关键字 (长度不定
输入句子查找关键字的程序
要的话 谢谢采纳 留下邮箱
信誉保证肯定能够满足LZ两程序要求 而且更好追问

不好意思,我只想知道我的错误在哪里,因为这对于我学习汇编很重要。。。

汇编高手来帮忙啊,有段代码不是很懂?
首先把线性地址的最高10位(即位22至位31)作为页目录表的索引,对应表项所包含的页码指定页表;然后,再把线性地址的中间10位(即位12至位21)作为所指定的页目录表中的页表项的索引,对应表项所包含的页码指定物理地址空间中的一页;最后,把所指定的物理页的页码作为高20位,把线性地址的低12位不加...

...清零程序。对初学者实在是太难了。大神帮帮忙吧!
;http:\/\/zhidao.baidu.com\/question\/485975186.html ;0.0 ~ 9.9 ;P0, P2静态显示 ;设系统晶振为12MHz。;按键连接在P3.5,;按一下,计时,再按一下,停止,再按一下,清零。;--- ORG 0000H LJMP MAIN ORG 000BH LJMP T0_INT ;--- ORG 0100H INIT: ;初始化 MOV ...

程序设计中的指令是什么?有哪几种?
(3)Visual Basic 不是真正的编译型语言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使得Visual Basic 的编译速度大大变慢。 综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间里学会vB编程,并用VB 做出自己的作品。对于那些把编程...

跪求c语言程序教程,先上100,搞定追加。
链接: https:\/\/pan.baidu.com\/s\/1115MNWjku3s1Wi2JHGecsw 提取码: vwi9 千锋Mars老师Java语言教程-2013年版,史上最牛java培训视频 千锋-java语言教程-43_类集框架(三).mp4 千锋-java语言教程-42_类集框架(二).mp4 千锋-java语言教程-41_类集框架(一).mp4 千锋-java语言教程-40_...

51单片机汇编语言编写一个跑马灯的程序,初学者做实验用,具体要求如下...
程序1:ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV SP,#5FH LOOP:MOV A,P2 MOV B,A MOV P0,A MOV P1,#0FFH LOOP1:LCALL DELAY MOV C,P1.7 MOV A,P0 RLC A MOV P0,A MOV A,P1 RLC A MOV P1,A MOV A,P2 CJNE A,B,LOOP SJMP LOOP1 DELAY:MOV R2,#60 DELAY1:MOV R3,#...

汇编基础题问题
不好意思,之前看错你表达的意思了。要在10000H处写入字型数据2266H,所以在内存里面应该是这样的:在10000H:0处写66,在10000H:01出写22,这样就完成了写入。然后栈的指针要指向10000H:02这个位置(栈是指向要写入地址的下一位的),所以要mov sp,2 实在抱歉啦。

谁会编写程序啊?教教我
计算机所能识别的语言只有机器语言,即由构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。目前通用的编程语言有两种形式:汇编语言和高级语言。汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用...

汇编语言
要有解析的 还有我要的是8051单片机的汇编语言 大哥们,我说mov只是举例而已,汇编语言的书我有,我想要的只是例题和解析而已,书图书馆有很多的,就是没有练习册。说白了就是练习册,明白?jollen@yeah.net这是我的邮箱谢谢。最好是编程题,我不太喜欢选择填空那样的 展开 ...

编程问题请教高手
计算机所能识别的语言只有机器语言,即由0和1构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。目前通用的编程语言有两种形式:汇编语言和高级语言。汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者...

汇编一段程序是输入的小写字母变大写输出,请教高手!
sub al,20h 可以改为:and al,11011111b 这样,无论输入的大写、小写,都会变成小写。当然,还应该先判断输入的是否为英文字母。呵呵,这也可能超出了对初学者的要求。

相似回答