接收一个字符串,然后抽去其中的空格,最后按相反的顺序显示这个改变后的字符串。

考完微机原理好几天了,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来测试一下,结果确实是可以的。
在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值