引言
之前有本科的同学需要做一个汇编程序,简单补了补发现自己会嘻嘻嘻。
题目
题目:从键盘输入任一字符串(字符数>1),在下一行以相反的次序显示出来。
如:输入字符串123abc
在下一行显示cba321
程序思想
字符串逆序采用的实现方法是堆栈。因为堆栈有着后进先出的原则,可以保证题目要求。只要可以正确调用堆栈就能实现字符串逆序。
实现技巧
如图所示是系统整体的流程,在程序实现上用到了DOS层中断。DOS层的功能模块在DOS操作系统盘中,系统启动时被装入内存。DOS层的功能在实际中使用较少,只是x86接口实验设备还需要用到其子程序。从编程角度看,可以把DOS层看作一个函数库,只要前期按要求设置就能调用这些系统函数。
其调用的方法是:
第一,设置入口参数。
第二,选功能号置入AX寄存器的AH中。
第三,使用INT 21H启动函数。
我们从实际的应用例子上看看具体函数的调用方法。
(1)从键盘读入字符
MOV AH,01H
INT 21H
首先,01H所对应的函数功能就是带回显的键盘输入,使用MOV指令将其置入AH中,再调用INT中断就可以使程序执行此项功能,所以键盘输入一共就两行语句。
(2)显示单个字符
显然,类似输入可以使用02H功能号进行调用,但是输出是需要内容的,也就是这个函数需要一个“内容”用于输出。换句话说是我们要显示的字符,需要在函数调用时将其打入DL寄存器中。
MOV AH,02H
MOV DL,BL
INT 21H
(3)其他问题
①可以从题目看到我们需要换行输出,这时只要使用显示单个字符的函数去显示一个控制字符即可,换行的控制字符是0DH和0AH,两个必须一起调用。
②需要一个判断用户输入终止的操作,本程序设定的是输入$为结束,也就是默认字符串中不会出现这个字符。
③需要知道循环多少次出栈操作可以输出完所有字符,所以需要一个寄存器保存入栈的次数。
程序例程
; You may customize this and other start-up templates;
; The location of this template is c:\emu8086\inc\0_com_template.txt
org 100h
.MODEL SMALL
.CODE
.STARTUP
MOV CX,0H
INPUT:MOV AH,01H
INT 21H
MOV BL,AL
MOV BH,0H
PUSH BX
INC CX
CMP AL,'$'
JNZ iNPUT
POP BX
DEC CX
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
AGAIN:
;出栈
POP BX
MOV AH,02H
MOV DL,BL
INT 21H
LOOP AGAIN
.EXIT
ret
程序结果
可以看到输入为“shidH”时,输出为“Hdihs”
改进思路
程序功能虽然实现了,但是仍然有可以改进的地方。比如,我们输入完整个字符串后,终止符也被显示出来。
改进思路如下:
①改输入为不带回显的输入,收到终止符判断后,先输出一遍之前的字符。
②改终止符为没有显示的控制字符比如回车。