汇编输入输出(单个字符以及字符串)

  • Post author:
  • Post category:其他


简单的汇编代码演示


1、输入输出

输入输出主要有两个中断调用,分别为INT 16H 和INT 21H

1.1 INT 16H(ROM BIOS中断)

原理:

16H中断服务子程序提供了多个功能,每个功能对应一个功能号码,调用他们的方法是

功能号->AH
INT 16H
功能号 功能 返回参数
0 等待从键盘读字符 AL=字符的ASCII码,AH=扫描码
1 读键盘缓冲区字符 若ZF=1,表示缓冲区空;否则表示缓冲区不空,则AL=ASCII值,AH=扫描码
2 返回键盘状态字 AL=键盘状态字节

相关示例代码(可以跑起来):

主要是从键盘中读取一个字符

DATAS  SEGMENT
    CHAR DB ?
DATAS  ENDS

STACKS  SEGMENT
      DB  128 DUP (?)
STACKS  ENDS

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

    MOV AH,0    ;进行输入
    INT 16H
    MOV CHAR,AL

    mov AH,2    ;进行输出
    MOV DL,CHAR
    INT 21H

    MOV AH,4CH
    INT 21H
CODES  ENDS
    END  START
1.1 INT 21H(DOS中断)

原理:

功能号发送AH寄存器,调用参数所求的位置,然后发送INT 21H系统功能调用中断

主要的功能号如下图所示:

功能号 调用参数 说明
1 AL=输入字符串的ASCII值 等待从标准输入设备(通常为键盘)输入一个字符,把接受到的字符的ASCII码值送给AL,并显示到显示器的当前光标位置。该功能识别Ctrl-C键并做相应处理
2 DL=输出字符的ASCII值 该输出功能也使光标跟随移动
0AH DS:DX指向自定义的输入缓冲区首地址 从标准输入设备(通常为键盘)输入一串字符到用户定义的缓冲区,直到按下Enter键为止。在接受的同时显示到屏幕上,并且识别Ctrl-C键,也处理DOS编辑器

示例代码:

;输出hello world
;data数据段定义
data segment
  string db 'hello world','$' ;切忌串结束符$
data ends

;代码段定义
code segment
;程序开始
start:
  mov ax,data  ;将数据段段地址装入AX寄存器
  mov ds,ax ;将数据段段地址通过通用寄存器AX装入DS
  mov dx,offset string ;将串的段内地址装入DX
  mov ah,09h ;调用DOS的09H号功能,传入参数DS:DX=串地址,'$'结束字符串
  int 21h
  mov ah,4ch ;调用DOS的4CH号功能,带返回码结束,返回码存在于AL
  int 21h
code ends  ;代码段定义结束
end start  ;程序结束

运行结果如下:


2、字符串的输入

这里用到了上面DOS中断的0AH功能

可以将一段字符串读入并显示在屏幕上,代码如下

DATAS SEGMENT
    buffer db 60;定义缓冲区长度
           db ? ;预留实际输入字符个数的技术单元
           db 60 dup(?);设DS已是buffer的段基址
DATAS ENDS

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

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

    mov ah,0ah;接受一串字符
    lea dx,buffer
    int 21h
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START



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