微机原理及应用
主讲:谢维成
http://xweicheng.ys168.com
scxweicheng@yahoo.com.cn
第4章汇编语言程序设计
? 汇编语言的格式
? 语句行的构成
? 指示性语句
? 指令语句
? 汇编语言程序设计及举例
4.1 汇编语言的格式 (P111、 P99<3>)
8086汇编语言程序举例
MY_DATA SEGMENT
SUM DB ?
MY_DATA ENDS
MY_CODE SEGMENT
ASSUME CS:MY_CODE,DS:MY_DATA
PORT_VAL EQU 3
MAIN PROC FAR
GO: PUSH DS
MOV AX,0
PUSH AX
MOV AX,MY_DATA
4.1 汇编语言的格式
MOV DS,AX
MOV SUM,0
CYCLE: CMP SUM,100
JNA NOT_DONE
MOV AL,SUM
OUT PORT_VAL,AL
HLT
NOT_DONE: IN AL,PORT_VAL
ADD SUM,AL
JMP CYCLE
4.1 汇编语言的格式
RET
MAIN ENDP
MY_CODE ENDS
END GO
1、汇编语言源程序是分段的,通常每个模块程
序包括数据段、堆栈段和若干代码段。
2、每个程序结构类似,可以复制。
4.2 语句行的构成
指令性语句,其格式为:
标号:(前缀)指令助记符 操作数;注释
GO: PUSH DS
指示性语句,又叫伪指令,其格式为:
变量 伪指令 操作数 ;注释
SUM DB ?
4.2 语句行的构成
1
返回
4.5 汇编语言程序设计及举例
4.5.1 直线运行程序设计
返回
4.5.6 有关I/O的DOS功能调用( P149)
第3版在P177,第4版在P149
在 C语 言 中 有 scanf和 printf语 句 实 现 从 键 盘 输 入
和从CRT上显示的功能
scanf("%d",&x);
printf(“\n学生姓名: %c\n",name);
在汇编语言中实现从键盘输入和从C RT上显示的功
能只能通过调用DOS功能和BIOS软件中断。
返回
4.5.6 有关I/O的DOS功能调用
DOS功 能中 断实际上就是D OS提供的一组计算机基本
功能子程序,下表是部分键盘输入及显示中断。
4.5.6 有关I/O的DOS功能调用
操作系统的核心是由许多有关I /O驱动、磁盘读写以
及文件管理等子程序构成。这些子程序都 编 了 号 ,
可由汇编语言源程序调用。
实际上计算机提供D OS中断调用和B IOS中断调用,开
放计算机的基本功能,如I /O驱动、磁盘读写以及文
件管理等。
在调用时一般分四个步骤。
4.5.6 有关I/O的DOS功能调用
1、DOS软件中断调用过程
(1)将功能调用号传送到AH中;
( 2)把调用参数(入口参数)送到规定寄存器或存储
器区域中;
(3)发中断命令INT 21H;
( 4) 在 返 回 参 数 ( 出 口 参 数 ) 寄 存 器或存储器区查询
执行结果 ;
与高级语言函数调用相似:p2=round(p,5,1)
4.5.6 有关I/O的DOS功能调用
2、DOS显示功能调用
(1)显示一个字符
例1:在CRT显示器上显示字符“5”,程序段如下:
MOV AH,02H;将功能号02(从中断表中查询)传送到AH中
MOV DL,35H;把“5”的ASCII码传送到调用参数DL中
INT 21H;发中断命令INT N
调试程序演示……disp2.asm
2、DOS显示功能调用
(2)显示字符串
被显示的字符串必须以 ’$’结束,且所显示的
内容不应出现非可见的ASCII码,否则产生不可
预料的结果。
2、DOS显示功能调用
例2:在CRT显示器上显示“Hello World!”:
Data segment
Buffer db “Hello World!”,”$”
Data ends
……
mov ah,09h;将功能号 09传送到 AH中
lea dx,buffer;把字符串的起始地址送到 DX中
int 21h;发中断命令 INT N
……
调试程序演示……disp9.asm
返回
2、DOS显示功能调用
例3:在显示器上循环显示数字“0123456789”50
遍,最好显示一个字符后有延时,提示:
……
MOV AH,02H;将功能号 02(从中断表中查)传送到 AH中
MOV DL,AL;把要显示的 ASCII码传送到调用参数 DL中
INT 21H;发中断命令 INT N
INC AL;每次显示后把数字的 ASCII码加 1后循环
……
可以用循环程序做为延时
实验调试程序……作为作业在实验室调试
3、DOS键盘输入功能调用
(1)从键盘输入一个字符(有回显)
从键盘输入的字符在AL中。执行INT 21H后
从AL中取输入的结果。
3、DOS键盘输入功能调用
例4:从键盘输入一个字符回显并保存:
Data segment
Buffer db 10 dup(?)
Data ends
……
lea bx,buffer;把保存输入字符的起始地址送到 BX中
mov ah,01h;将功能号 01传送到 AH中
int 21h;发中断命令 INT N
mov [bx],al;从返回参数 AL中取键盘输入结果并保存
……
调试程序演示……input1.asm
3、DOS键盘输入功能调用
(2)从键盘输入一个字符(无回显)
从键盘输入的字符在AL中。执行INT 21H
后从AL中取输入的结果,但输入的字符在显示
器上无显示。
3、DOS键盘输入功能调用
例5:从键盘输入一个字符不回显并保存,要求
每输入一个字符显示一个“*”:
Data segment
Buffer db 10 dup(?)
Data ends
……
lea bx,buffer;把保存输入字符的起始地址送到 BX中
mov ah,07h;将功能号 07传送到 AH中
int 21h;发中断命令 INT N
mov [bx],al;从返回参数 AL中取键盘输入结果并保存
……
调试程序演示……input7.asm
3、DOS键盘输入功能调用
(3)从键盘输入字符串(有回显)
调用该键盘输入中断前必须定义与之相符
合的内存数据区,注意[DX][DX+1]和[DX+2]
中存放的数据意义。
真正输入的字符是在输入缓冲区的第3个
字节开始,即[DX+2]单元开始。
3、DOS键盘输入功能调用
例6:从键盘输入一串字符,并换行显示:
Data segment
Buffer db 10,?,10 dup(?),”$”
Data ends
……
lea dx,buffer;把输入缓冲区起始地址送到 DX中
mov ah,0ah;将功能号 0A传送到 AH中
int 21h;发中断命令 INT N
……
调试程序演示……input0a.asm
4.5.6 有关I/O的DOS功能调用
有关I/O的DOS功能调用的综合应用
例7:编程实现模拟计算机开机密码输入过程
即显示 “Password:”,等待用户输入密码
(1-6位),每输入一个字符显示一个 ‘*’,要
求把输入的口令存储在buffer为起始地址的
内存区域。(要求书写汇编语言源程序,下
次实验中调试)
** 内存操作
例8 定义数据区B UFFER1(100 个字节数),B UFFER2
( 100个字节数),B UFFER3(保留100个字节), 实
现 BUFFER1区 的 第 1个 数 与 BUFFER2区 的 第 100个数相
加 , BUFFER1区 的 第 2个数与B UFFER2区的第99个数 相
加 ......直 到 实 现 BUFFER1区的第100个数与
BUFFER2区的第1个数相加,且结果依次存储在
BUFFER3区。
** 字符操作
例9:编程实现从键盘输入10个字母(“A-Z”或
“a-z”中的任10个),并改变大小写换行显示,
例如:输入“fHhFHhajAD”,显示;
Data segment
Buffer db 10,?,10 dup(?),”$”
Data ends
……
lea dx,buffer;把输入缓冲区起始地址送到 DX中
mov ah,0ah;将功能号 0A传送到 AH中
int 21h;发中断命令 INT N
……
调试程序演示……
4.5.6 ?
例*
4.5.6 ?
有关I/O的DOS功能调用的综合应用