[汇编笔记]一个接受输入的字符串并反向输出的程序分析

时间:2023-01-04 15:10:38

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

                                                 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中断:

(2)、功能02H

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

(8)、功能0AH

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

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

出口参数:

 

 

(7)、功能09H

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

 

(5)、功能4CH

功能描述: 终止程序的执行,并可返回一个代码
入口参数: AH=4CH
AL=返回的代码
出口参数: