《微机原理与接口技术-第4-1章》由会员分享,可在线阅读,更多相关《微机原理与接口技术-第4-1章(74页珍藏版)》请在金锄头文库上搜索。
1、微机原理与接口技术第4章 模块化程序设计教学重点p汇编语言程序设计方法p顺序程序设计p分支程序设计p循环程序设计p子程序设计p模块的设计系统功能调用方法p汇编程序提供给汇编语言程 序员的功能非常有限p程序员需要利用ROM-BIOS和操作系统提供的资源p系统功能调用是程序设计的 一个重要方面裸机汇编语言程序Windows系统功能调用是通过 Win32 API函数调用实现的系统功能调用方法pBIOS是OS的核心,主要功能是驱动系统的外部设备。pDOS层的功能模块在系统盘中,在系统启动时被装入内存。主要功能是文件 管理、存储管理、设备管理等。系统功能调用步骤p通常按照如下4个步骤进行: 在AH寄存器
2、中设置系统功能调用号 在指定寄存器中设置入口参数 用中断调用指令( INT i8)执行功 能调用 (BIOS中断号为51FH) 根据出口参数分析功能调用执行情 况BIOS功能模块调用pBIOS中的键盘输入p在BIOS系统中,提供了中断16H来实现键盘输入功能,其具体的功能如下:p00H从键盘读一个字符,输入字符不回显p01H判断键盘缓冲区内是否有字符可读p02H读取当前键盘状态字。p例如从键盘读入一个字符,需完成以下3步:p入口参数:无;pAH00H;pINT 16H;p其出口参数,也就是键入的字符的ASCII码在 AL中。BIOS功能模块调用pBIOS中的屏幕输出pBIOS系统提供了中断10
3、H来实现各种屏幕处理功能。p00H设置显示器模式 01H设置光标形状p02H设置光标位置 03H读取光标信息 p05H设置显示页 p06H、(07H)向上滚屏和(向下滚屏)p08H读光标处的字符及其属性 p09H在当前光标处按指定属性显示字符p0AH在当前光标处显示字符 0CH写图形象素p0DH读图形象素 0FH读取显示器模式p例如在显示器上显示一个字符需完成以 下3步:p入口参数:pAL需显示字符的ASCII码,pBH 页号,pBL 字符的显示属性。pAH09HpINT 10Hp执行完成后,就会在显示器上按指定的 字符属性显示该字符。p例4-3 用键盘最多输入10个字符,并存 入内存变量Bu
4、ff中,若按“Enter”键,则表示输入结束。p用BIOS层功能调用实现 的源程序: .MODEL SMALLCREQU0DH.STACK200H.DATA Buff DB 10 DUP(?).CODE.STARTUPMOVCX, 0AHLEABX, Buff.REPEATMOV AH, 0HINT 16H.BREAK .IF AL=CRMOV BX,ALINC BX.UNTILCXZ.EXIT 0ENDDOS输入输出功能调用pDOS利用21H号中断提供给用户近百个 系统功能,主要包括设备管理、目录管理 和文件管理三个方面的功能p重点掌握:p输入一个字符,01H号功能调用p输入一个字符串,0A
5、号功能调用p输出一个字符,02H号功能调用p输出一个字符串,09H号功能调用pDOS中的键盘输入p01H带回显的键盘输入 p06H控制台的输入/输出:当 DL=0FFH,表示键盘输入 p08H不回显的键盘输入p0AH键盘输入字符串 p0BH检查键盘有无输入p0CH清除输入缓冲区的输入功能p带回显的键入单个字符的功能调用,需 完成以下3步p选功能号01H于AH中p入口参数:无p通常使用“INT 21H”语句调用。p执行完成后,用户可从AL取出输入字符的ASCII码。p键入字符串功能调用,需完成以下3步:p功能号:AH0AH;p入口参数:DS:DX存储键入字符串的首 地址,(DS:DX)=允许键入
6、字符的个数;p第三,中断指令:INT 21H。p 执行完成后,用户可从DS:(DX+2)单元取 出输入字符的ASCII码,从DS:(DX+1)取出实际键入字符的个数。pDOS中的显示器输出p02H显示的字符p06H控制台的输入/输出:当DL0FFH,表示显示字符p09H在屏幕上显示一个字符串02H号DOS功能调用p输出一个字符 功能调用号:AH02H 入口参数:DL欲显示字符的ASCII码 功能调用:INT 21H 出口参数:无;显示一个问号“ ?” mov ah,02h;设置功能调用号 mov dl,?;设置入口参数 int 21h;功能调用例题-回车换行的子程序crlfproc push
7、ax;保护寄存器 push dx mov ah,2 mov dl,0dh;回车功能的ASCII码是0DH int 21h mov ah,2 mov dl,0ah;换行功能的ASCII码是0AH int 21h pop dx ;恢复寄存器 pop ax ret crlfendp09H号DOS功能调用p输出一个字符串 功能调用号:AH09H 入口参数:DS:DX欲显示字符串在内存中的首地址(逻辑 地址形式:DS段地址,DX偏移地址)内存中的字符串以ASCII码形式保存,最后必须添 加一个“$”结尾(并不显示) 功能调用:INT 21H 出口参数:无例题-在屏幕上显示一段信息;数据段(定义要显示的字
8、符串)stringdb Hello, Assembly !,0dh,0ah,$;代码段(显示字符串的程序)mov dx,offset stringmov ah,9int 21hHello, Assembly !程序功能01H号DOS功能调用p输入一个字符 功能调用号:AH01H 入口参数:无 功能调用:INT 21H 出口参数:AL键入字符的ASCII码;输入一个字符 mov ah,01h;设置功能调用号 int 21h;功能调用 mov dl,al;使用出口参数结束用户程序的方法START PROC FARBEGIN: PUSH DSMOV AX, 0PUSH AX.RETSTART END
9、P推荐采用第1种方法。MOV AH, 4CHINT 21HINT 20HJMP 0MOV AH, 0INT 21HWindows层功能模块的调用pWin32 API中包含了大量的函数,结构和消息 等。除了OS自身运行需要之外,还提供调用。pWin32的功能模块放在Windows的动态连接库 (DLL)中pWin32 APU的核心由3个DLL提供pKernel32.dll系统服务功能,包括内存管理 ,任务管理和动态链接。pGdi32.dll图形设备接口。pUser32.dll用户接口服务。建立窗口和传 送消息等。Windows层功能模块的调用pWin32 API使用堆栈来传递参数pAPI函数调用
10、pC语言的消息框函数的声明:int MessageBox(HWND hWnd, / handle to owner windowLPCTSTR lpText, / text in message boxLPCTSTR lpCaption, / message box titleUINT uType / message box style);/参数最后还有一句说明:Library: Use User32.lib./说明这个函数的位置p汇编的声明格式:pMessageBox Proto hWnd:dword,lpText:dword,lpCaption:dword,uType:d wordp汇编中
11、调用MessageBox 函数的方法是:push uTypepush lpCaptionpush lpTextpush hWndcall MessageBoxp使用invoke 语句pMicrosoft 在MASM6.11中提供了一 条伪指令实现利用堆栈传递参数的子程序 调用,那就是invoke 伪指令,它的格式 是:invoke 函数名,参数1,参数 2.p 对MessageBox 的调用在MASM 中 可以写成:invoke MessageBox,NULL,offset szText,offset szCaption,MB_OKpAPI 函数的返回值p有的API 函数有返回值,如Messa
12、geBox 定义的返回值是int类型的数,返回值的类型对 汇编程序来说也只有dword 一种类型,它永远 放在eax 中。如果要返回的内容不是一个eax 所能容纳的,Win32 API 采用的方法一般是返回一个指针,或者在调用参数中提供一个缓冲 区地址,干脆把数据直接返回到缓冲区中去。p函数的声明p在调用API 函数的时候,函数原型也必须预先声明,否则,编译器会不认这个函数 。invoke伪指令也无法检查参数个数。声明函数的格式是:p函数名proto 距离 语言 参数1:数据类型,参数2:数据类型, pinclude 语句p若程序用到了API 函数,则需要用include语句将函数声明包含进来
13、p假设程序使用了的函数分别在User32.dll 和 Kernel32.dll 中,在MASM32 工具包中已经包括了 所有DLL 的API 函数声明列表,每个DLL对应 文件,在源程序中只要使用include 语句包含进来就可以了pinclude user32.inc pinclude kernel32.incpincludelib语句p为了告诉链接程序使用哪个导入库,使 用的语句是:p includelib 库文件名p或includelib p假设使用的函数分别在User32.dll 和 Kernel32.dll 中,那么在源程序使用的相 应语句为:pincludelib user32.l
14、ibpincludelib kernel32.lib顺序程序设计p没有分支、循环等转移指令的程序,会 按指令书写的前后顺利依次执行,这就是 顺序程序p顺序结构是最基本的程序结构p完全采用顺序结构编写的程序并不多见例题STACK SEGMENT STACK STACKDW 64DUP(?) ;定义堆栈段 STACK ENDS DATA SEGMENTX DW 0010HY DW 0123HZ DW 7890HV DW 3456H ;分配变量X、Y、Z、VQR DW ? ;存放商REMAINDER DW ?;存放余数 DATA ENDS要求:计算(要求:计算(V V(X*YX*YZ Z540540
15、)/X/X例 代码段CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK MAIN PROC START: MOV AX,DATAMOV DS,AX ;初始化DSMOV AX,X ;AXXIMUL Y;DX:AXX*YMOV CX,AXMOV BX,DX ;暂存在BX,CX中MOV AX,ZCWD;Z扩展ADD CX,AXADC BX,DX ;BX:CXX*YZ例 代码段(续1)SUB CX,540SBB BX,0;可能有借位MOV AX,VCWD ;扩展VSUB AX,CXSBB DX,BXIDIV XMOV QR,AX ;保存商MOV REMAINDER,DX;保存余数例 代码段(续2)MOV AH,4CHINT 21H;程序结束,返回到DOSMAIN ENDP;过程结束CODE END