【计算机与UNIX汇编原理⑦】——DOS/BIOS功能调用【实现两数相加 + Hello World】


🍻 国庆节快乐!



再一次 Hello World!🌏

上一篇文章链接: 【计算机和汇编原理⑥】——UNIX的编程基础【SEGMENT、ASSUME、PROC、ORG、END】.

下一篇文章链接: 【计算机与UNIX汇编原理⑧】——UNIX编程进阶【分支程序、循环程序、子程序、宏指令】.


一、功能调用简介

  ● 在汇编里面要使用一些已经写好的子程序的话,我们就可以使用功能调用。且有两种方式:
    ① 通过操作系统内核里面提供的一些子程序。(也叫做 DOS 功能调用)。
    ② 绕开操作系统,直接调用主板芯片上固化的子程序。(叫做 BIOS 功能调用)

  ■ DOS/BIOS 调用模式

DOS/BIOS 调用模式:
	MOV AH, 功能号
	设置入口参数
	INT n
	分析出口参数

  ♦ 说明
    ① 其中 n 值因子程序的不同而可能不同,比如:ROM BIOS 有 n = 5 ~ 1FH,而DOS 有 n = 20H、21H、23 ~ 2AH、2EH、2FH、33H 和 67H 等几种情况。有的 n 只对应一个子程序,有的 n 对应很多子程序。
    ② 子程序调用结束后一般都有出口参数,这些出口参数常放在寄存器中,通过出口参数可以知道功能调用的成功与否。
    ③ 在 DOS 功能子程序调用中,我们把通过 “INT 21H” 来实现的子程序调用称为 DOS 系统功能调用。



二、DOS常用功能调用

  ● DOS 功能调用的例子如下:【简单了解即可】

在这里插入图片描述

  ♦ 说明
    ① 中断向量表在下学期会学,它是一种数据结构。它储存了我们要调用的子程序的真实地址。
    ② “绿色” 部分放大即是我们的右边的 “用户程序”。当在 “右边” 执行到代码段的 “INT 21H” 后,系统会自动做计算 (根据 n =21H ,然后去中断向量表去找) 来找出子程序。
    ③ 它执行完后还要回到原来的 “中断点”,但它不像以前讲的 CALL 命令。


1、功能号 01H (调用指令INT 21H)

  ■ 入口参数:无。
  ■ 出口参数:AL = 按键的 ASCII 码。注:若 AL = 0,表明按键是功能键、光标键,需再次调用此功能,才能返回按键的扩展码。
  ▶ 功能:等待键入一个字符,有回显,并用 “Ctrl + C” 结束输入。【回显:当敲某个键时,屏幕上会对应出现该字符】

举例:
MOV AH, 1
INT 21H

  ● 补充:“07H”——无回显+不响应Ctrl_c;“08H” 无回显+响应Ctrl_c。


2、功能号 02H (调用指令INT 21H)

  ■ 入口参数:DL = 待显字符的 ASCII 码。
  ■ 出口参数:无。
  ▶ 功能:显示一个字符。响应组合键为 “Ctrl+C”。本功能在屏幕的当前位置显示一个字符,光标右移一格,如果是在一行末尾显示字符,则光标返回下一行的开始格。如果是在屏幕的右下角显示字符,则光标在返回时屏幕要上滚一行。【注意:该项功能会破坏AL寄存器的内容】

" 举例一: 在文本屏幕上显示字符 A "
MOV DL, 'A'
MOV AH, 2
INT 21H


" 举例二: 从键盘键入一个“Q”, 屏幕上回显一个“Q” "
.586

DATA SEGMENT USE16
DATA ENDS

CODE SEGMENT USE16
	 ASSUME CS:CODE,DS:DATA
	 
BEG: MOV	AX,DATA
	 MOV 	DS,AX
	
	 MOV 	AH,1		; 从键盘上获取一个字符(功能号 01H)
	 INT 	21H
	 MOV 	DL,AL
	 MOV	AH,2		; 显示(功能号 02H)
	 INT 	21H
	 
	 MOV 	AH,4CH		
	 INT 	21H
	 
CODE ENDS
END	BEG

  ● 样例二的运行结果

在这里插入图片描述
  ♦ 说明:要先 “Compile”,再 “Link”,最后才能 “Run”。


" 举例三:【两数相加】从键盘键入一个 1 位的加数,一个 1 位的被加数, 并将它们的和显示在屏幕上"
.586

DATA SEGMENT USE16
DATA ENDS

CODE SEGMENT USE16
	 ASSUME CS:CODE, DS:DATA
	 
BEG: MOV	AX, DATA
	 MOV 	DS, AX
	
	 MOV AH, 1
	 INT 21H 			; 键入3,(AL)=33H
	 SUB AL, 30H 		;(AL)=3
	 
	 MOV DL, AL 		;(DL)=3
	 MOV AH, 1
	 INT 21H 			; 键入4,(AL)=34H
	 SUB AL, 30H 		;(AL)=4
	 
	 ADD DL, AL 		; 相加:(DL)=7
	 ADD DL, 30H 		;(DL)=37H
	
	 MOV AH, 2			; 回显
	 INT 21H
	 
	 MOV 	AH,4CH		
	 INT 	21H
	 
CODE ENDS
END	BEG

  ● 样例三的运行结果

在这里插入图片描述

  ♦ 说明:键入的数字 “3” 是 ASCII 码(值为51),所以我们要减去 “30H(转化为十进制即是48)”。


3、功能号 09H (调用指令INT 21H)

  ■ 入口参数:DS:DX = 字符串首地址,字符串必须以 ‘$’ (即 ASCII 码 24H ) 为结束标志。
  ■ 出口参数:无。
  ▶ 功能:该项功能从屏幕当前位置开始,显示字符串,遇到结束标志 ‘$’ 时停止,但这个字符并不显示。【注意:9号功能也会破坏 AL 寄存器的内容】

" 例: 在屏幕上显示‘HELLO WORLD!’ "

.586
DATA SEGMENT USE16 			; 定义数据段
MESG DB 'HELLO WORLD!', '$'
DATA ENDS

CODE SEGMENT USE16 			; 定义代码段
ASSUME CS:CODE, DS:DATA
	BEG: MOV AX, DATA
		MOV DS, AX
		LAST: MOV AH, 9
		MOV DX, OFFSET MESG	; 把 MESG 的首地址给 DX 寄存器
		INT 21H
		
		MOV AH, 4CH
		INT 21H 			; 返回DOS
		
	CODE ENDS
END BEG

  ● 运行结果

在这里插入图片描述

  ♦ 说明:“ MESG DB ‘HELLO WORLD!’, ‘$’ ” 写成 “ MESG DB ‘HELLO WORLD!$’ ” 也可以。


4、功能号 0AH (调用指令INT 21H)

  ■ 入口参数:DS:DX 指向放键入字符的缓冲区。
  ■ 出口参数:存放于缓冲区的字符串,以回车键结尾。
  ▶ 功能:等待键入一串字符,送用户程序数据缓冲区。【注意:缓冲区中的第一个字节由用户写入,其余字节由系统写入;如果输入的字节数少于定义的字节数,缓冲区其余字节将自动补零;输入的字节数大于定义的字节数,后来输入的字符被自动被丢弃且响铃警告。】

  ● 例:使用 0AH号 DOS 功能调用, 从键盘获取最大长度为 100 的字符串(包含回车键):

  ● 示意图:
在这里插入图片描述

  ♦ 说明:“41H” 是 “A” 的十六进制的 ASCII 码。“0DH” 是回车符(CR,十进制的 ASCII 码为13)。

  ● 代码如下

.586

DATA SEGMENT USE16 				; 定义数据段
	 BUF DB 100
		 DB ?
		 DB 10 DUP(?)
DATA ENDS

CODE SEGMENT USE16 				; 定义代码段
ASSUME CS:CODE, DS:DATA

	BEG: MOV AX, DATA
		MOV DS, AX
		
		MOV DX, OFFSET BUF	
		MOV AH, 0AH				; 功能号 0AH 
		INT 21H
		MOV DX, OFFSET BUF+2	;"BUF+2"的位置开始键入
		
		MOV BX, DX				; 键入字符的个数
		ADD BL, BUF+1
		
		MOV BYTE PTR [BX], '$'	; 间接寻址
		MOV AH, 09H				; 功能号09H[显示字符串]
		INT 21H
		
		MOV AH, 4CH
		INT 21H 				; 返回DOS
		
	CODE ENDS
END BEG

  ♦ 说明:因为显示时重新刷新了屏幕,屏幕上原来输入时回显的字符串被去除了,同样内容的字符串被再次显示出来,所以屏幕上只看到了一个字符串 (并没有出现我们想看到的两个字符串 )。所以我们可以在 “单步调试” 中进行查看结果。

在这里插入图片描述


5、功能号 4CH (调用指令INT 21H)

  ■ 入口参数:AL = 返回码(或者不设置)。
  ■ 出口参数:无。
  ▶ 功能:终止当前程序的运行,并把控制权交给调用它的程序。

MOV AH, 4CH
INT 21H 		; 返回DOS


三、BIOS常用功能调用

  ● DOS 功能调用的例子如下:【简单了解即可】
在这里插入图片描述
  ■ BIOS 调用模式

BIOS 调用模式:
	MOV AH, 功能号
	设置入口参数
	INT XXH (XXH为 BIOS 功能调用类型号) 
	分析出口参数

  ● BIOS 调用模式有两个常用的功能调用:键盘功能调用(INT 16H)、文本显示功能调用(INT 10H)。


1、功能号 00H (调用指令INT 16H)

  ■ 入口参数:无。
  ■ 出口参数:AL = 键入字符的 ASCII 码。若 AL = 0,则 AH = 输入键的扩展码。

  ▶ 功能:读取键入的一个字符,无回显,响应Ctrl_C,无键入则等待。

"举例:"
MOV AH, 00H
INT 16H
MOV CL, AL 		; 获得键盘输入字符的 ASCII 码, 并放入 CL 寄存器


2、功能号 0EH (调用指令INT 16H)

  ■ 入口参数:AL = 待显字符的 ASCII 码。
  ■ 出口参数:无。
  ▶ 功能:在光标的当前位置显示一个字符,随后光标前进一格,满一行后自动换行,满一页则整屏信息上滚一 行。与 DOS 系统的 2 号功能调用具有相同的效果。

"举例:"
MOV AH, 0EH
MOV AL, 'A'
INT 10H 		; 在文本屏幕上显示字符 A


四、参考附录:

[1] 《微型计算机原理与接口技术(慕课板)》
清华大学出版社

[2] 《汇编语言程序设计(第2版)》

上一篇文章链接: 【计算机和汇编原理⑥】——UNIX的编程基础【SEGMENT、ASSUME、PROC、ORG、END】.

下一篇文章链接: 【计算机与UNIX汇编原理⑧】——UNIX编程进阶【分支程序、循环程序、子程序、宏指令】.


🍻 国庆节快乐!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值