简单的汇编代码演示
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 版权协议,转载请附上原文出处链接和本声明。