Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102140
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-26 21:14
文章分类

全部博文(30)

文章存档

2015年(1)

2008年(29)

我的朋友

分类: WINDOWS

2008-10-29 10:29:02

一个接受输入的字符串并反向输出的程序分析

                                                 by shile

 

 

 

代码:

 

.model small
.386
DATA segment
 msg1 db 'Please input a string.',0DH,0Ah,'$'
 buf db 100, 0 ,100 DUP (0)
 crlf db 0Dh,0Ah,'$'
DATA ends

STACK segment
 DB 20 DUP (0)
STACK ends

CODE segment
 assume cs:CODE,ds:DATA,ss:STACK
START:
 mov ax,DATA
 mov ds,ax
 lea dx,msg1 ;输出提示文字
 mov ah,9
 int 21h
 lea dx,buf
 mov ah,0Ah ;接受字符串
 int 21h
 mov dx,offset crlf
 mov ah,9 ;输出字符串中断
 int 21h
 mov bl,buf+1;字符串长度送到bl
 mov bh,0
 cmp bx,0
 jz EXIT
L1:mov dl,buf+1[bx] ;把最后一位送到dl
 mov ah,2 ;输出一个字符中断
 int 21H
 dec bx ;倒着输出字符
 jnz l1
EXIT:mov AH,4CH
 int 21H
CODE ends
END START

 

 

假设文件名是asm2.asm

用masm611编译即可运行.

 

编译步骤:

masm asm2.asm

link asm2.obj;

 

运行结果:


D:\MASMWO~1>asm2
Please input a string.
asdfsa
asfdsa
D:\MASMWO~1>asm2
Please input a string.
this is  a  joke!
!ekoj  a  si siht

 

 

程序的原理是利用了下面的int21H中断:

功能描述: 向标准输出设备(如:屏幕)输出一个字符。该输出还可被重定向,如果这样做,则将无法判断磁盘是否满
入口参数: AH=02H
DL=待输出字符的ASCII码
出口参数:

功能描述: 从标准输入设备上读入一个字节字符串,遇到“回车键”结束输入(输入的字符在标准的输出设备上有回显)。如果该输入操作被重定向,那么,将无法判断文件是否已到文件尾
入口参数: AH=0AH
DS:DX=存放输入字符的起始地址
接受输入字符串缓冲区的定义说明:
  1、第一个字节为缓冲区的最大容量,可认为是入口参数;
  2、第二个字节为实际输入的字符数(不包括回车键),可看作出口参数;
  3、从第三个字节开始存放实际输入的字符串;
  4、字符串以回车键结束,回车符是接受的最后一个字符;
  5、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃,系统并发出响铃,直到输入“回车”键才结束输入。

例如:
  BUFF 80, ?, 80 DUP(?)   ;最多接受80个字符

出口参数:

 

 

功能描述: 输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,将无法判断磁盘已满
入口参数: AH=09H
DS:DX=待输出字符的地址
说明:待显示的字符串以’$’作为其结束标志
出口参数:

 

功能描述: 终止程序的执行,并可返回一个代码
入口参数: AH=4CH
AL=返回的代码
出口参数:
阅读(3243) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

xbyx20082008-12-18 12:58:22

请问这个"" buf db 100, 0 ,100 DUP (0)"" mov bl,buf+1;字符串长度送到bl""不是把0给bl吗? 为什么在这又是字符串长度送到bl呢? 我是刚学回编的菜鸟!~~ 谢谢!~!