考完微机原理好几天了,xin麒想分享一下这学期的写的一些汇编作业。
问题描述:
写一个程序,它先接收一个字符串,然后抽去其中的空格,最后按相反的顺序显示这个改变后的字符串。
一、说明:
1、读入的数据有限制,当然可以在代码中自定义设置,代码中默认最大字符数目为100.
2、xin麒的程序没有使用到堆栈!没有使用到函数,没有使用到子程序。
3、遍历输出时的核心思路:从尾部进行遍历,当为空格时便跳过,当不为空格,则输出。
二、实现:
.asm源代码文件:
DATA SEGMENT
Buf DB 100,?,100 DUP(?) ;100,?, 100个?
LF DB 0AH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
start:
MOV AX,DATA ;实现段与段寄存器之间的对应关系,代码段系统会默认
MOV DS,AX
lea DX,Buf ;将buf首地址值赋予dx 目前姑且当作是将一个地址赋值于一个寄存器所表示的value吧。
mov AH,0AH ;0AH往往和mov dx xxx搭配使用(上面有),dx的第一个字节是说最多buffer大小也就是100,
;第二个字节是实际上的大小也就是"?",个人推理:?的值是当字符串输入完毕便可确定了.当0ah的功能是以回车结束吧(这个是推理出来的)
INT 21h
;---->表示换行
mov DL,LF ;0AH赋值给DL
mov AH,02h ;显示输出 DL=输出字符
INT 21h ;INT中断
;<----
mov BL,Buf+1 ;代码角度:相当于将buf首地址的值和1相加,结果作为一个地址,这个地址存储的元素值赋予BL。从业务层来看:实际输入的字符数目
XOR BH,BH ;这里肯定相同的;XOR:异或运算(同为0,异为1)这里会将结果保存到第一个操作数,这里会对跳转有影响,这里直接把BH清零,目的:排除原来BX高八位的影响
DEC BX ;DEC指令:自减意思,BX--;这里会对跳转有影响
mov SI,0
;下面进行遍历输出:
do:
cmp SI,BX ;第一个操作减去第二个操作数,但不影响第两个操作数的值 作用:影响flag的CF,ZF,OF,AF,PF.
jg over ;当作是在cmp的辅助下,前者>后者就跳转到程序末尾
mov AL,Buf[BX+2] ;为什么加2,因为Buf的前两个字节所代表的值不需要遍历
DEC bx
cmp al,20h;空格的ASCII码为20h,如果是空格,则跳过
je do
mov dl,al
MOV AH,2 ;显示输出 DL=输出字符
INT 21H ;int中断
jmp do
over:
mov AH,4CH ;带返回码结束,AL=返回码
INT 21h
CODE ENDS
END start
三、运行结果:
具体操作如下:(自己电脑得先下载好DOSBOX等软件以及搭建好环境)
1、编译:
将xinqi.asm源代码文件编译成为后缀名为obj的文件:
masm是编译指令:
生成:
2、链接:
库文件和.obj文件经过link.exe(链接程序)生成xinqi.exe程序文件:
link指令:
生成:
3、测试:
运行xinqi.exe程序文件以测试:
比如输入样本abcd es nice
来测试一下,结果确实是可以的。