微机原理及应用 主讲:谢维成 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功能调用的综合应用