汇编语言之字符(串)的输入输出

  • Post author:
  • Post category:其他



这一篇文章主要是给刚接触汇编的初学者准备的,尤其是在学校里刚刚开始学习汇编,又被作业搞得一头雾水的小伙计。这里主要是介绍如何利用调用DOS功能来实现字符(串)的

输入/输出

这里我们主要的实验平台就是:

Masm for Windows 集成实验环境 2015



字符的输出

在DOS中可以调用

2/6号功能号

都可以实现单字符的打印,这里我们以

2号功能号

做例子

假如我们要输出字符

‘A’

MOV DL,41H
MOV AH,2
INT 21H

因为‘A’字符的

ASCII码



41H

(十六进制),我们只需要将值赋到DX寄存器的

低8位

,然后将

2号功能号

赋到AH,然后调用

INT 21H

中断,即可触发

DOS

的2号功能,这样在屏幕上就会打印出

A



字符的输入

在DOS中我们调用

1号功能号

即可实现单字符的输入。

示例:

MOV AH,1
INT 21H

当调用

INT 21H

中断后,屏幕上就会等待你出入一个字符,当输入字符后,输入字符的

ASCII码

会存储在AL中



字符串的输出

字符串的输出可以有多种方式,第一种就是利用字符输出一个一个的输出,第二种就是在字符串最后添加

'$'

符号作为字符串的结束符,然后调用

9号功能号

来输出字符串。这里我们演示一下第二种方式。

DATAS SEGMENT
    tip db 'The original sentence as follows:',0dh,0ah,'$'
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;打印字符串提示信息
    MOV DX,OFFSET TIP
    ;调用9号中断
    MOV AH,09H
    INT 21H

    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

在数据段我们定义了一个字符串,后面以

0dh,0ah,'$'

结尾表示换行



字符串的输入

学习过c语言的朋友都知道字符串输入后需要一个缓冲区进行存储,所以这里我们也需要提前在数据段中预定义一个空的缓冲区用来接收字符串。

DATAS SEGMENT
    BUF DB 6,?,6 DUP(?)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX

    ;将缓冲区地址赋到DX中
    LEA DX, BUF 
    ;键盘输入到缓存区
    MOV AH, 0AH
    INT 21H

    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

调用

0A号功能号

这部分很简单就不详细说明了,我们来重点关注一下数据段中一下部分

DATAS SEGMENT
    BUF DB 6,?,6 DUP(?)
DATAS ENDS

按照DOS官方的要求:


  • 0A中断会向保存在DX中的地址存放来自键盘的输入


  • [DX]

    是缓冲区最大容量

  • 返回值

    [DX+1]

    是你实际输入的字符个数,

    [DX+2]

    是字符串首

上面这段话的意思是你定义的缓冲区的格式必须得和

BUF DB 6,?,6 DUP(?)

一致,其中两个6均表示缓冲区大小。

在键盘输入完毕后,

DOS会自动添加’$’到字符串后面

。真正的字符串是在缓冲区的第3个字符开始的,这意味着你要打印时,需要

偏移两位

,如下:

;将缓冲区地址赋到DX中
LEA DX, BUF 
;键盘输入到缓存区
MOV AH, 0AH
INT 21H

;打印字符串
ADD DX,2 ;偏移2位
;调用9号中断
MOV AH,09H
INT 21H


温馨提示

:汇编是不区分大小写的,所以在写代码时不必一直开着大写锁定。不过如果是提交作业呢,最好还是找个编辑器转为全大写,比较美观。



版权声明:本文为qq_41115702原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。