8086汇编程序问题

8086汇编程序问题

程序要求:从键盘输入一串字符串,将所有小写字母转为大写并输出


输入字符串

课上代码:

DATA SEGMENT
BUFFER DB 16,?,16 DUP ('$'),'$'
DATA ENDS
CODE SEGMENT
  ASSUME CS:CODE,DS:DATA
BEGIN:
  MOV AX,DATA
  MOV DS,AX
  LEA DX,BUFFER
  MOV AH,0AH
  INT 21H
  MOV DL,0AH
  MOV AH,02H
  INT 21H
  LEA DX,BUFFER+2
  MOV AH,09H
  INT 21H
  MOV AH,4CH
  INT 21H
CODE ENDS
  END BEGIN

这段程序在数据段定义了BUFFER缓冲区用来存放输入的字符串,BUFFER第一个位置存放最大字符数,第二个位置存放实际输入的字符数。
通过DOS功能号0AH来调用键盘输入到缓冲区功能。在输入完成后输出了一个换行符,这是因为在按下回车键后没有自动换行,不输出换行符的话输出就会覆盖之前的输入,造成没有输出的错觉。
运行结果:
这里写图片描述
此处有一个问题,当我输入了一串字符串后,如果删去几个字符,显示的输出会有所变化,例如本来要输入kkkkkbbbfff,但在删去fff后,显示的输出并不是kkkkkbbb:
这里写图片描述
可以看到,显示的输出并不等于输入,但这并不是因为输入出错了,而是因为回车符导致的,可以使用debug来查看:
这里写图片描述
可以看到在程序执行前数据段的缓冲区初始化的全是$符,这与我们的程序相符
这里写图片描述
在程序执行后数据段情况如上图所示,在最后一个b的后面跟着0D,这是回车符的Ascii码,后面跟着ff,这与输入相符,证明输入没有出错。

输出与输入不同的原因是输出字符串是遇到$符才结束的,所以我们在输出完kkkkkbbb后,又输出了回车,再输出了ff,覆盖了开头的kk,最后才输出结束。

小写字母转大写

小写字母利用了小写字母和大写字母的ASCII码值只有第5位不同的特点,因此将任意字母转换成大写,只需将其第5位清零。

代码如下:

DATA SEGMENT
BUFFER DB 16, ?, 16 DUP('$'), '$'
COUNT EQU $ - BUFFER - 3
DATA ENDS

EXTRA SEGMENT
DEST DB COUNT DUP ('$'), '$';初始化为$符,用于结束输出
EXTRA ENDS

CODE SEGMENT
    ASSUME CS:CODE, DS:DATA, ES:EXTRA
BEGIN:
    MOV AX, DATA
    MOV DS, AX
    MOV AX, EXTRA
    MOV ES, AX

    LEA DX, BUFFER;从键盘输入字符串
    MOV AH, 0AH
    INT 21H

    MOV DL, 0AH;输出换行
    MOV AH, 02H
    INT 21H

    MOV CX, COUNT;此处读出buffer中的数据并将所有小写字母转大写送入dest中
    LEA SI, BUFFER + 2
    LEA DI, DEST
    AG:
    LODSB

    AND AL, 0DFH
    STOSB
    LOOP AG

    MOV AX, EXTRA;输出结果字符串
    MOV DS, AX
    LEA DX, DEST
    MOV AH, 09H
    INT 21H

    MOV AH, 4CH
    INT 21H

CODE ENDS
    END BEGIN

这段代码运行后的结果也与预期不符:
这里写图片描述
同样使用debug工具来查看
DATA段情况:
这里写图片描述
可以看到输入的字符串是正确的

EXTRA段情况:
这里写图片描述
看上去也没有什么毛病?确实转成了大写啊?
问题又出在回车符,回车符ASCII码为0DH,和DFH做与运算得到的还是回车符,而我们在转换时实际上连同回车符也一起转换过来了,在输出完CHENKKK后,回车,继续输出剩下的字符,直到遇到$符为止,因此就有了现在的结果。

解决的方法?既然回车符被一起转过来了,那当然就是不要它了,在读取buffer缓冲区时,读取到回车符就代表已经转换完成了,就可以直接跳转去输出了:
这里写图片描述
结果:
这里写图片描述
成功输出了,同时这样也解决了前面提到的第一个问题,删除部分字符后不会把已经删除的字符进行转换并输出了。

猜你喜欢

转载自blog.csdn.net/chenf1999/article/details/52723596
今日推荐