| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 674 人关注过本帖
标题:看看这个汇编问题!
只看楼主 加入收藏
zhouyu
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-11-15
收藏
 问题点数:0 回复次数:8 
看看这个汇编问题!

帮我看看这个程序:
dseg segment
info1 db 0dh,0ah,'input string: $'
info2 db 0dh,0ah,'output string: $'
bufa db 81
db ?
db 80 dup (0)
bufb db 81 dup (0)
dseg ends
stack segment stack
db 200 dup (0)
cseg segment
assume cs:cseg,ds:dseg,ss:stack
start:
mov ax,dseg
mov ds,ax
lea dx,info1
mov ah,9
int 21h
lea dx,bufa
mov ah,10
int 21h
lea si,bufa+1
mov ch,0
mov cl,[si]
add si,cx
lea di,bufb
next:
mov al,[si]
mov [di],al
dec si
inc di
loop next
mov byte ptr [di],'$'
lea dx,info2
mov ah,9
int 21h
lea dx,bufb
mov ah,9
int 21h
cseg ends
end start

这是一个在显示器上出入一字符串
然后反向输出
但我把字符串输进去了后
我不知道如何操作使得它反向输出。
谢谢!

搜索更多相关主题的帖子: 汇编 
2006-12-16 15:58
lefttime
Rank: 1
等 级:新手上路
帖 子:162
专家分:0
注 册:2006-10-6
收藏
得分:0 

看了楼主的程序,思路还不错,不过就是小漏洞有两个啊:
首先你定义了堆栈段,有开始却没有结束;
再来,你的源程序中没有程序返回也没有程序结束,这样可不太好:
加上

......
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
......

......
MOV AX,4C00H
INT 21H

CSEG ENDS
END START

这样你的程序就达到你的效果啦


我是金子,我要闪光的
2006-12-16 19:38
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
我给你改了
你自己对照看吧,不会的问我.
dseg segment
cr equ 0dh;
info1 db ' Input string: $'
info2 db 0dh,0ah,'Output string: $'
bufa db 80 dup (?)
bufb db 81 dup (0)
fk db 0
dseg ends
stack segment stack
db 200 dup (0)
stack ends
cseg segment
assume cs:cseg,ds:dseg,ss:stack
start:
mov ax,dseg
mov ds,ax
lea dx,info1
mov ah,9
int 21h
mov cx,80
lea bx,bufa
lop: mov ah,0
int 16h
cmp al,cr
jz q
mov [bx],al
mov dl,al
mov ah, 02h
int 21h
inc bx
inc fk
loop lop
q: mov si,word ptr fk
mov cx,si
dec si
mov di,0
next: mov al,bufa[si]
mov bufb[di],al
dec si
inc di
loop next
mov byte ptr bufb[di],'$'
lea dx,info2
mov ah,9
int 21h
lea dx,bufb
mov ah,9
int 21h
mov ah,8
int 21h
mov ah,4ch
int 21h
cseg ends
end start

♂ 死后定当长眠,生前何须久睡。♀
2006-12-16 20:10
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
刚才怎么没传上?
上面程序的运行结果:
7HQIthpy.rar (1.29 KB) 看看这个汇编问题!



♂ 死后定当长眠,生前何须久睡。♀
2006-12-16 20:14
zhouyu
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-11-15
收藏
得分:0 
谢谢楼上的!
有点问题,请指教!
int 16h
cmp al,cr
这2条看不懂,int 16是什么意思?cr表示什么?没学过。
前面没有定义al,al的值是什么?

2006-12-17 22:54
lefttime
Rank: 1
等 级:新手上路
帖 子:162
专家分:0
注 册:2006-10-6
收藏
得分:0 

BIOS中的16号中断属于键盘中断吧;目前有3种功能,分别由AH指定:
程序中采用的是0号功能

.......
mov ah,0
int 16h ;ah中得到的是输入输入字符的扫描码,这里判断是回车(扫描码为:1C),al中得到的是输入字符的ASCII码
cmp al,cr ;因为数据段已经有符号定义: cr equ 0dh; 所以这里al就是和0dh比较,也就是回车喽
......

简单一点儿就是
.......
mov ah,1
int 21h
cmp al,0dh
.......


我是金子,我要闪光的
2006-12-18 14:13
zhouyu
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-11-15
收藏
得分:0 

谢谢!

2006-12-18 15:30
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
以下是引用lefttime在2006-12-18 14:13:55的发言:

BIOS中的16号中断属于键盘中断吧;目前有3种功能,分别由AH指定:
程序中采用的是0号功能

.......
mov ah,0
int 16h ;ah中得到的是输入输入字符的扫描码,这里判断是回车(扫描码为:1C),al中得到的是输入字符的ASCII码
cmp al,cr ;因为数据段已经有符号定义: cr equ 0dh; 所以这里al就是和0dh比较,也就是回车喽
......

简单一点儿就是
.......
mov ah,1
int 21h
cmp al,0dh
.......

谢谢,这位大哥帮我解释了,对于你的解释我也很满意!由于那天写程序的时候时间仓促没有把注释添上给程序的阅读带来不便,还请原谅!嘿嘿!


♂ 死后定当长眠,生前何须久睡。♀
2006-12-19 17:32
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
dseg segment
cr equ 0dh ; 定义回车符,以回车结束字符串的输入
info1 db ' Input string: $' ;字符串提示信息
info2 db 0dh,0ah,'Output string: $';输出提示信息
bufa db 80 dup (?);定义字节类型的变量用来存储输入的字符串最大允许输入80个字符不包括回车符
bufb db 81 dup (0);用来保存将bufa中的字符串逆转后的结果外加一个$字符最多是81个字符
fk db 0;
dseg ends
stack segment stack
db 200 dup (0)
stack ends
cseg segment
assume cs:cseg,ds:dseg,ss:stack
start:
mov ax,dseg
mov ds,ax
lea dx,info1;输出提示信息Input string:
mov ah,9
int 21h
mov cx,80;用来做循环为looop指令做准备
lea bx,bufa
lop: mov ah,0;al中得到的是输入字符的ASCII码,不显示输入的字符
int 16h;BIOS中的16号中断属于键盘中断吧;目前有3种功能,分别由AH指定:
;这里采用的是0号功能:将字符输入到al中,并不显示输入的内容.
cmp al,cr;这里判断是否是回车,若是回车则结束输入,但是此时的回车符已经存入al中了,并没有存入bufa中
jz q
mov [bx],al
mov dl,al
mov ah, 02h;以单字符的形式将每次输入的单个字符输出来
int 21h
inc bx
inc fk;用来记录输入的字符个数每次加一
loop lop
q: mov si,word ptr fk;
mov cx,si;为下边的loop循环做准备
dec si;注意这句不能少
mov di,0;将di清0
next: mov al,bufa[si];将bufa最后一个字符放入al中,进行逆转
mov bufb[di],al;将bufa的字符反着存入bufb中,这是本题的关键之处
dec si
inc di
loop next
mov byte ptr bufb[di],'$';进行逆转之后别忘了在字符串的最后加上$
lea dx,info2;输出提示信息Output string:
mov ah,9
int 21h
lea dx,bufb;将逆转之后的字符串输出
mov ah,9
int 21h
mov ah,8;让屏幕暂停接受一个字符并不显示,目的是为了查看结果
int 21h
mov ah,4ch;返回dos
int 21h
cseg ends
end start
说明:由于那天写程序的时候时间仓促没有把注释添上给程序的阅读带来不便,还请原谅!今天补上!嘿嘿!

♂ 死后定当长眠,生前何须久睡。♀
2006-12-19 18:04
快速回复:看看这个汇编问题!
数据加载中...
 
   



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

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