一个接受输入的字符串并反向输出的程序分析
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、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃,系统并发出响铃,直到输入“回车”键才结束输入。 例如: |
|
出口参数: |
无
|
功能描述: | 输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,将无法判断磁盘已满 | |
入口参数: | AH=09H DS:DX=待输出字符的地址 说明:待显示的字符串以’$’作为其结束标志 |
|
出口参数: | 无 |
功能描述: | 终止程序的执行,并可返回一个代码 | |
入口参数: | AH=4CH AL=返回的代码 |
|
出口参数: | 无 |