第5章计算机网络

上传人:壹****1 文档编号:569332547 上传时间:2024-07-28 格式:PPT 页数:99 大小:861.50KB
返回 下载 相关 举报
第5章计算机网络_第1页
第1页 / 共99页
第5章计算机网络_第2页
第2页 / 共99页
第5章计算机网络_第3页
第3页 / 共99页
第5章计算机网络_第4页
第4页 / 共99页
第5章计算机网络_第5页
第5页 / 共99页
点击查看更多>>
资源描述

《第5章计算机网络》由会员分享,可在线阅读,更多相关《第5章计算机网络(99页珍藏版)》请在金锄头文库上搜索。

1、第第 5 5 章章教学重点在在掌掌握握基基本本的的汇汇编编语语言言程程序序设设计计方方法法之之后后,进进一一步步学学习习如如何何提提高高编编程程效效率率的的各各种种实实用方法:用方法:高级语言特性高级语言特性宏结构宏结构模块化模块化第 5 章5.1 高级语言特性MASM 6.0引引入入高高级级语语言言的的程程序序设设计计特性特性n条件控制伪指令条件控制伪指令.IF .ELSE .ENDIFn循环控制伪指令循环控制伪指令.WHILE .ENDW .REPEAT .UNTILn过程声明和过程调用伪指令过程声明和过程调用伪指令.PROTO .INVOKE第 5 章5.1.1 条件控制伪指令 类类似似

2、高高级级语语言言中中IF、THEN、ELSE和和ENDIF的相应功能的相应功能在在汇汇编编时时要要展展开开,自自动动生生成成相相应应的的比比较较和和条条件转移指令序列,实现程序分支件转移指令序列,实现程序分支.IF 条件表达式条件表达式;条件为真(值为非条件为真(值为非0) 分支体分支体;执行分支体执行分支体 .ELSE;前面前面IF条件为假条件为假 分支体分支体;执行分支体执行分支体 .ENDIF;分支结束分支结束条件;单分支结构单分支结构.IF AX = ax;比较二者大小比较二者大小 mov tag,1;第一分支体:条件满足,第一分支体:条件满足,tag1.else mov tag,0;

3、第二分支体:条件不满足,第二分支体:条件不满足,tag0.endif.exit 0例5.12/2第 5 章5.1.2 循环控制伪指令 WHILE结构结构的循环控制伪指令的循环控制伪指令.WHILE 条件表达式条件表达式;条件为真条件为真 循环体循环体;执行循环体执行循环体.ENDW ;循环体结束循环体结束UNTIL结构结构的循环控制伪指令的循环控制伪指令.REPEAT;重复执行循环体重复执行循环体 循环体循环体.UNTIL 条件表达式条件表达式;直到条件为直到条件为真真;WHILE结构结构xor ax, axmov cx,100.while cx!=0 add ax,cx dec cx.end

4、wmov sum,ax求1100之和;UNTIL结构结构xor ax, axmov cx,100.repeat add ax,cx dec cx.until cx=0mov sum,axmov cx,100xor ax,axlea bx,array.repeat .if sword ptr bx = 0 add ax,bx .else .break .endif inc bx inc bx.untilcxzmov result,ax例5.2第 5 章要要调调用用带带参参数数过过程程定定义义的的过过程程,不不应应采采用用CALL指令,因为比较烦琐指令,因为比较烦琐应该采用过程调用伪指令应该采用过

5、程调用伪指令INVOKE使使 用用 INVOKE伪伪 指指 令令 的的 前前 提提 是是 需需 要要 用用PROTO伪指令对过程进行声明伪指令对过程进行声明5.1.3 过程声明和过程调用伪指令过程名过程名 PROC调用距离调用距离 语言类型语言类型 作用范围作用范围 USES 寄存器列表寄存器列表, 参数参数:类型类型LOCAL 参数表参数表;汇编语言语句汇编语言语句过程名过程名 ENDP过程声明伪指令:过程声明伪指令:用于事先声明过程的结构用于事先声明过程的结构过程名过程名PROTO 调用距离调用距离 语言类型语言类型, 参数参数:类型类型过程调用伪指令过程调用伪指令INVOKE 过程名过程

6、名,参数参数,.如何调如何调用用;汇编语言程序:汇编语言程序:lt503.asm.model smallchecksumd PROTO c,:word,:word;声明过程声明过程.stack.dataarraydb 12h,25h,0f0h,0a3h,3db 68h,71h,0cah,0ffh,90hcountequ $-array;数数 组组 的的 元元 素素 个个 数数resultdb ?;校验和校验和.code.startupINVOKE checksumd,count,offset array;调用过程调用过程mov result,al;保存校验和保存校验和.exit 0例5.31/

7、2列表文件checksumd PROC c USES bx cx,countp:word,arrayp:wordmov bx,arrayp;BX数组的偏移地址数组的偏移地址mov cx,countp;CX数组的元素个数数组的元素个数xor al,alsumd: add al,bx;求和:求和:ALAL+DS:BXinc bxloop sumdretchecksumd endpend例5.32/2列表文件第 5 章5.2 宏结构程序设计宏汇编宏汇编重复汇编重复汇编条件汇编条件汇编统称宏结构统称宏结构宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法第 5 章

8、宏宏具有宏名的一段汇编语句序列具有宏名的一段汇编语句序列宏定义宏定义时书写时书写宏指令宏指令这段汇编语句序列的缩写这段汇编语句序列的缩写宏调用宏调用时书写时书写宏宏展展开开宏宏指指令令处处用用这这段段宏宏代代替替的的过过程程宏汇编宏汇编时实现时实现宏的参数宏的参数功能强大,颇具特色功能强大,颇具特色配合宏,还有配合宏,还有宏操作符宏操作符和有关伪指令和有关伪指令5.2.1 宏汇编宏定义宏定义宏名宏名 macromacro 形参表形参表 宏定义体宏定义体endmendmmainbeginmainbeginMACROMACRO ;定义名为定义名为mainbeginmainbegin的宏,无参数的宏

9、,无参数movmov ax,data ax,data;宏定义体宏定义体movmov ds,axds,axENDMENDM;宏定义结束宏定义结束mainendmainendMACRO MACRO retnumretnum;带有形参带有形参retnumretnummovmov al,retnumal,retnum;宏定义中使用参数宏定义中使用参数movmov ah,4ch ah,4chintint 21h 21hENDMENDM宏注释符宏注释符宏调用宏调用宏名宏名 实参表实参表 start:start: mainbeginmainbegin; ;宏调用,建立宏调用,建立DSDS内容内容dispms

10、gdispmsg string string; ;宏调用,显示字符串宏调用,显示字符串mainendmainend 0 0; ;宏调用,返回宏调用,返回DOSDOSend startend start 宏调用的实质是在汇编过程中进行宏展开宏调用的实质是在汇编过程中进行宏展开 宏宏展展开开的的具具体体过过程程是是:当当汇汇编编程程序序扫扫描描源源程程序序遇遇到到已已有有定定义义的的宏宏调调用用时时,即即用用相相应应的的宏宏定定义义体体取取代代源源程程序序的的宏宏指指令令,同同时时用用位位置置匹匹配配的的实实参参对对形形参参进进行取代行取代宏展开宏展开宏宏展展开开在在汇汇编编时时,用用宏宏定定义义

11、体的代码序列替代宏指令的过程。体的代码序列替代宏指令的过程。start:start: mainbeginmainbegin; ;宏指令宏指令 1 1movmov ax,data ax,data; ;宏展开宏展开 1 1movmov ds,axds,axmainendmainend 0 0; ;宏指令宏指令 1 1movmov al,0 al,0; ;宏展开宏展开 1 1movmov ah,4ch ah,4ch 1 1intint 21h 21h宏的参数宏的参数宏的参数使用非常灵活宏的参数使用非常灵活宏定义时,宏定义时,可以可以无参数无参数,例如,例如5.4a的的mainbegin可以带有可以带

12、有一个参数一个参数,例如,例如5.4a的的mainend也可以具有也可以具有多个参数多个参数;例如;例如5.5a的的shlext参参数数可可以以是是常常数数、变变量量、存存储储单单元元、指指令令(操操作作码码)或或它它们们的的一一部部分分,也也可可以以是是表表达达式式;例例如如5.5b的的shift和和shrot宏宏定定义义体体可可以以是是任任何何合合法法的的汇汇编编语语句句,既既可可以以是是硬硬指指令令序序列列,又又可可以以是是伪伪指指令令序序列列;例例如如5.6的的dstring;宏定义;宏定义shlextshlextmacro macro shloprandshloprand, ,shl

13、numshlnumpush push cxcxmovmov cl,cl,shlnumshlnumshlshl shloprandshloprand,cl,clpop pop cxcxendmendm;宏指令宏指令shlextshlext axax, ,6 6;宏展开宏展开 1 1push push cxcx 1 1movmov cl, cl,0606 1 1shlshl axax,cl,cl 1 1pop pop cxcx例5.5a;统一;统一4 4条移位指令的宏指令条移位指令的宏指令shiftshiftmacro macro soprand,snum,soprand,snum,sopcode

14、sopcodepush push cxcxmovmov cl,snumcl,snums s& &sopcodesopcode& & soprand,clsoprand,clpop pop cxcxendmendm;统一移位和循环移位统一移位和循环移位8 8条指令的宏指令条指令的宏指令shrotshrotmacro macro sroprand,srnum,sroprand,srnum,sropcodesropcodepush push cxcxmovmov cl,srnumcl,srnumsropcodesropcode sroprand,clsroprand,clpop pop cxcxen

15、dmendm例5.5b替换操作符替换操作符;宏定义;宏定义dstringdstring macro stringmacro stringdb db & &stringstring& &,0dh,0ah,0dh,0ah,$ $endmendm;宏调用宏调用dstringdstring dstringdstring 0 0 ! ! Number Number ! !;宏展开宏展开 1 1db db This This is is a a example.example., , 0dh,0ah,0dh,0ah,$ $ 1 1db db 0 Number 100 Number 10, 0dh,0ah,

16、 , 0dh,0ah, $ $例5.6转义注释符转义注释符传递注释符传递注释符第 5 章与宏有关的伪指令局部标号伪指令局部标号伪指令LOCAL 标号列表标号列表宏定义体采用了标号,应使用宏定义体采用了标号,应使用LOCAL加以说明加以说明它必须是宏定义它必须是宏定义MACRO语句之后的第一条语句语句之后的第一条语句宏定义删除伪指令宏定义删除伪指令PURGE PURGE 宏名表宏名表不需要某个宏定义时,可以把它删除不需要某个宏定义时,可以把它删除宏定义退出伪指令宏定义退出伪指令EXITMEXITM伪指令伪指令EXITMEXITM表示结束当前宏调用的展开表示结束当前宏调用的展开;宏定义;宏定义ab

17、solabsol macro macro oprdoprdlocal nextlocal nextcmpcmp oprd,0 oprd,0jgejge next nextnegneg oprdoprdnext:next:endmendm例5.7;宏调用;宏调用absolabsol word word ptrptr bxbx absolabsol bxbx;宏展开宏展开 1 1cmpcmp word word ptrptr bx,0 bx,0 1 1jgejge ?0000 ?0000 1 1negneg word word ptrptr bxbx 1 1?0000:?0000: 1 1cmpc

18、mp bx,0 bx,0 1 1jgejge ?0001 ?0001 1 1negneg bxbx 1 1?0001:?0001:单独占一行单独占一行比较仅仅是是源源程程序序级级的的简简化化:宏宏调调用用在在汇汇编编时时进进行行程程序序语语句句的的展展开开,不不需需要要返返回回;不不减减小小目目标标程程序序,执执行行速速度度没没有改变有改变通通过过形形参参、实实参参结结合合实实现现参参数数传传递递,简简捷捷直直观、灵活多变观、灵活多变还还是是目目标标程程序序级级的的简简化化:子子程程序序调调用用在在执执行行时时由由CALLCALL指指令令转转向向、RETRET指指令令返返回回;形形成成的的目目

19、标标代代码码较较短短,执执行行速速度减慢度减慢需需要要利利用用寄寄存存器器、存存储储单单元元或或堆堆栈栈等等传传递递参参数数宏宏子程序子程序宏宏与与子子程程序序具具有有各各自自的的特特点点,程程序序员员应应该该根据具体问题选择使用那种方法根据具体问题选择使用那种方法通通常常,当当程程序序段段较较短短或或要要求求较较快快执执行行时时,应应选选用用宏宏;当当程程序序段段较较长长或或为为减减小小目目标标代代码码时,要选用子程序时,要选用子程序比较结论宏宏子程序子程序第 5 章5.2.2 重复汇编重重复复汇汇编编指指在在汇汇编编过过程程中中,重重复复展展开开一一段(基本)相同的语句段(基本)相同的语句

20、重复汇编没有名字,不能被调用重复汇编没有名字,不能被调用重重复复汇汇编编常常用用在在宏宏定定义义体体中中,也也可可以以在在一般汇编语句中使用一般汇编语句中使用重复汇编伪指令有三个:重复汇编伪指令有三个:REPEAT按参数值重复按参数值重复FOR按参数个数重复按参数个数重复FORC按参数的字符个数重复按参数的字符个数重复最后,用最后,用ENDM结束结束按参数值重复按参数值重复REPEATREPEAT 重复次数重复次数 重复体重复体ENDMENDMchar = Achar = AREPEAT 26REPEAT 26 db char db char char = char +1 char = cha

21、r +1ENDMENDM 1 1db chardb char; ;等效于等效于db Adb A 1 1char = char +1char = char +1 1 1db chardb char; ;等效于等效于db Bdb B 1 1char = char +1char = char +1. 1 1db chardb char; ;等效于等效于db Zdb Z 1 1char = char +1char = char +1按参数个数重复按参数个数重复FORFOR 形参形参, ,实参表实参表 重复体重复体ENDMENDMFOR FOR regadregad, , push push regad

22、regadENDMENDM 1 1push axpush ax 1 1push push bxbx 1 1push push cxcx 1 1push push dxdx按参数字符个数重复按参数字符个数重复FORCFORC 形参形参, , 字符串字符串 重复体重复体ENDMENDMFORC FORC regad,dcbaregad,dcba pop & pop ®ad&xregad&xENDMENDM 1 1pop pop dxdx 1 1pop pop cxcx 1 1pop pop bxbx 1 1pop axpop ax第 5 章5.2.3 条件汇编条条件件汇汇编编伪伪指指令令在在

23、汇汇编编过过程程中中,根根据条件决定汇编的语句据条件决定汇编的语句IFxx 表达式表达式;满足,汇编分支语句体满足,汇编分支语句体1分支语句体分支语句体1 ELSE;不满足,汇编分支语句体不满足,汇编分支语句体2分支语句体分支语句体2 ENDIF;条件汇编结束条件汇编结束pdatapdatamacro nummacro num IFIF num num ltlt 100 100;如果如果num 100num 100,则汇编如下语句则汇编如下语句db num dup (?)db num dup (?) ELSEELSE;否则,汇编如下语句否则,汇编如下语句db 100 dup (?)db 100

24、 dup (?) ENDIFENDIFendmendmpdatapdata 12 12 ; ;宏调用宏调用db 12 dup(?)db 12 dup(?) ; ;宏汇编结果宏汇编结果pdatapdata 102 102 ; ;宏调用宏调用db 100 dup(?)db 100 dup(?) ; ;宏汇编结果宏汇编结果例5.10宏结构的作用宏汇编、重复汇编和条件汇编宏汇编、重复汇编和条件汇编为源程序的编写提供了很多方便,为源程序的编写提供了很多方便,灵活运用它们可以编写出非常灵活运用它们可以编写出非常良好的源程序来良好的源程序来汇编系统中有些以圆点起始的汇编系统中有些以圆点起始的 伪指令(如伪指

25、令(如.startup、.exit等)等)实际上是一种宏结构实际上是一种宏结构dstringdstringMACRO stringMACRO string;定义字符串定义字符串db &string&,0dh,0ah,$db &string&,0dh,0ah,$ENDMENDMmainbeginmainbeginMACRO MACRO dssegdsseg;设置数据段地址设置数据段地址movmov ax,dssegax,dssegmovmov ds,axds,axENDMENDMdispmsgdispmsgMACRO messageMACRO messagemovmov dx,offsetdx,

26、offset message messagemovmov ah,09h ah,09hintint 21h 21hENDMENDM例题5.41/3mainendmainend MACRO MACRO retnumretnum;返回返回DOSDOS,可不带参数,可不带参数ifbifb movmov ah,4ch ah,4ch;没有参数没有参数elseelse movmov ax,4c00h+(retnum AND 0ffh) ax,4c00h+(retnum AND 0ffh); ; 有参数有参数endifendifintint 21h 21hENDMENDM例题5.42/3.model smal

27、l.model small.stack 256.stack 256.data.datamsg1msg1equequ this byte this bytedstringdstring !msg2msg2equequ this byte this bytedstringdstring You made it.code.codestart:start:mainbeginmainbegin data data; ;建立建立DSDS内容内容dispmsgdispmsg msg1 msg1; ;显示显示msg1msg1字符串字符串dispmsgdispmsg msg2 msg2; ;显示显示msg2ms

28、g2字符串字符串mainendmainend; ;返回返回DOSDOSend startend start例题5.43/3将将程程序序分分段段、采采用用子子程程序序或或宏宏结结构构都都是进行模块化程序设计是进行模块化程序设计介绍开发大型程序时采用的方法:介绍开发大型程序时采用的方法:源程序文件的包含目标模块连接子程序库5.3 模块化程序设计例题例题 5.125.12将键盘输入的数据按升序输出将键盘输入的数据按升序输出把把源源程程序序分分放放在在几几个个文文本本文文件件中中,在在汇汇编编时时通过包含伪指令通过包含伪指令INCLUDE结合成一体结合成一体INCLUDE 文件名文件名可将常用的子程序

29、形成可将常用的子程序形成.ASM.ASM汇编语言源文件汇编语言源文件可将常用的宏定义存放在可将常用的宏定义存放在.MAC.MAC宏库文件中宏库文件中可将常量定义、声明语句组织在可将常量定义、声明语句组织在.INC.INC包含文件中包含文件中例例5.12a5.12a 宏库文件宏库文件 lt512a.mac 主程序文件主程序文件 lt512a.asm 子程序文件子程序文件 sub512a.asm5.3.1 源程序文件的包含1dispchardispcharmacro charmacro char; ;显示显示charchar字符字符movmov dl,char dl,charmovmov ah,2

30、 ah,2intint 21h 21hendmendmdispmsgdispmsgmacro messagemacro message; ;显示显示messagemessage字符串字符串movmov dx,offsetdx,offset message messagemovmov ah,9 ah,9intint 21h 21hendmendmLt512a.macinclude lt512a.macinclude lt512a.mac.dispmsgdispmsg msg1 msg1; ;提示输入数据提示输入数据movmov bx,offsetbx,offset bufbufcall inpu

31、tcall input; ;数据输入数据输入cmpcmp cx,0 cx,0jeje start4 start4; ;没有输入数据则退出没有输入数据则退出movmov count,cxcount,cx.; ;显示输入的数据显示输入的数据.; ;数据排序数据排序.; ;显示经排序后的数据显示经排序后的数据start4:start4: .exit 0.exit 0include sub512a.asminclude sub512a.asmendendLt512a.asm子程序源文件有子程序源文件有3 3个子程序个子程序ALdispALdisp; ;显示显示2 2位位1616进制数子程序(例进制数子

32、程序(例4.104.10)sortingsorting ; ;排序子程序(例排序子程序(例4.84.8)inputinput; ;键盘输入子程序键盘输入子程序还包含一个宏还包含一个宏convertconvert ;将将DXDX两位两位ASCIIASCII码转换为两位码转换为两位1616进制数进制数sub512a.asm让我们重点分析键盘输入子程序让我们重点分析键盘输入子程序 inputinput; ;键盘输入子程序键盘输入子程序; ;入口参数:入口参数:ds:bxds:bx= =存放数据的缓冲区存放数据的缓冲区; ;出口参数:出口参数:cxcx= =数据个数数据个数inputinputproc

33、procpush axpush axpush push dxdxxorxor cx,cxcx,cx; ;数据个数清数据个数清0 0input01:input01: xorxor dx,dxdx,dx; ;输入字符清输入字符清0 0input02:input02: movmov ah,1 ah,1; ;键盘输入一个字符键盘输入一个字符intint 21h 21hinput之一继续:继续:inputinput之二之二input10:input10: cmpcmp al,0dh al,0dhjeje input30 input30; ;是是回车回车,结束整个数据的输入,结束整个数据的输入cmpcmp

34、 al, al, jeje input20 input20; ;是是空格和逗号空格和逗号,确认输入了一个数据,确认输入了一个数据cmpcmp al, al, ,jeje input20 input20cmpcmp al,08h al,08hjeje input17 input17; ;是是退格退格,丢弃本次输入的数据,出错,丢弃本次输入的数据,出错input之二继续:继续:inputinput之三之三cmpcmp al, al,0 0; ;有效数字判断有效数字判断(图(图5.2b5.2b)jbjb input17 input17; ;小小于于0 0,不不是是有有效效数数字字,出出错错cmpcm

35、p al, al,f fjaja input17 input17; ;大于大于f f,不是有效数字不是有效数字cmpcmp al, al,a ajbjb input11 input11sub al,20hsub al,20h; ;a af f转转换换成成大大写写A AF Fjmpjmp input12 input12input11:input11: cmpcmp al, al,F Fjaja input17 input17; ;字字符符小小于于a a、大大于于F F,出出错错cmpcmp al, al,A Ajaejae input12 input12; ;是是A AF F,有效字符有效字符c

36、mpcmp al, al,9 9jaja input17 input17; ;是是0 09 9,有效字符,有效字符input之三继续:继续:inputinput之四之四input12:input12: cmpcmp dl,0 dl,0; ;有效字符的处理有效字符的处理jnejne input13 input13movmov dl,al dl,al;dl=0;dl=0,输入了一个数据的低位,则输入了一个数据的低位,则dlaldlaljmpjmp input02 input02; ;转到字符输入转到字符输入input13:input13: cmpcmp dh,0 dh,0jnejne input1

37、7 input17;dl0;dl0,dh0dh0输入输入3 3位数据,出错位数据,出错movmov dh,dldh,dl;dl0;dl0,dhdh0 0输入了一个数据的高位输入了一个数据的高位movmov dl,al dl,al; ;dhdldhdl,dlaldlaljmpjmp input02 input02; ;转到字符输入转到字符输入input之四继续:继续:inputinput之五之五input17:input17:movmov dl,7 dl,7; ;输入错误处理输入错误处理movmov ah,2 ah,2intint 21h 21hmovmov dl,? dl,?movmov ah

38、,2 ah,2intint 21h 21hjmpjmp input01 input01; ;转到输入一个数据转到输入一个数据input之五继续:继续:inputinput之六之六; ;转换正确的输入数据转换正确的输入数据(图(图5.2c5.2c)input20:input20: convertconvertjmpjmp input01 input01 ; ;转到输入一个数据转到输入一个数据input30:input30: convertconvertpop pop dxdxpop axpop axretret; ;返回,出口参数已设定返回,出口参数已设定inputinputendpendpin

39、putinput之六之六继续:继续:convertconvert之一之一;将将DXDX两位两位ASCIIASCII码转换为两位码转换为两位1616进制数(图进制数(图5.2c5.2c)convertconvert macromacrolocal input21,input22local input21,input22local input24,input25local input24,input25cmpcmp dl,0 dl,0;dl=0;dl=0,没有要转换的数据,退出没有要转换的数据,退出jeje input25 input25convert之一继续:继续:convertconvert之

40、二之二cmpcmp dl,9 dl,9jbejbe input21 input21sub dl,7sub dl,7;字符字符A AF F,则减,则减7 7input21:input21: and dl,0fhand dl,0fh;转换低位转换低位cmpcmp dh,0 dh,0;dh=0;dh=0,没有高位数据没有高位数据jeje input24 input24cmpcmp dh,9 dh,9jbejbe input22 input22sub dh,7sub dh,7input22:input22: shlshl dh,1 dh,1shlshl dh,1 dh,1shlshl dh,1 dh,

41、1shlshl dh,1 dh,1;转换高位转换高位or or dl,dhdl,dh;合并高、低位合并高、低位convert之二继续:继续:convertconvert之三之三源文件包含的操作步骤:源文件包含的操作步骤: 分别编辑生成各个文件分别编辑生成各个文件 汇编、连接主程序文件汇编、连接主程序文件input24:input24: movmov bx,dlbx,dl;存入缓冲区存入缓冲区inc inc bxbxinc inc cxcx;数据加数据加1 1input25:input25:endmendmconvert之三把把常常用用子子程程序序写写成成独独立立的的源源程程序序文文件件,单单独

42、独汇编,形成子程序的目标文件汇编,形成子程序的目标文件.OBJ主程序也经过独立汇编之后形成目标文件主程序也经过独立汇编之后形成目标文件连连接接程程序序将将所所有有目目标标文文件件连连接接起起来来,最最终终产产生可执行文件生可执行文件需要遵循的原则:需要遵循的原则: 声明共用的变量、过程等声明共用的变量、过程等 实现正确的段组合实现正确的段组合 处理好参数传递问题处理好参数传递问题5.3.2 目标代码文件的连接2第 5 章声明共用的变量、过程各个模块间共用的变量、过程等要说明各个模块间共用的变量、过程等要说明PUBLIC 标识符标识符 ,标识符标识符.;定义标识符的模块使用定义标识符的模块使用E

43、XTERN 标识符标识符:类型类型 ,标识符标识符:类型类型.;调用标识符的模块使用调用标识符的模块使用标识符是变量名、过程名等标识符是变量名、过程名等类类型型是是byte / word / dword(变变量量)或或near / far(过程)过程)在一个源程序中,在一个源程序中,public/extern语句可以有多条语句可以有多条各各模模块块间间的的public/extern伪伪指指令令要要互互相相配配对对,并并且指明的类型互相一致且指明的类型互相一致第 5 章实现正确的段组合子子程程序序文文件件必必须须定定义义在在代代码码段段中中,也也可可以以具具有有局局部部的数据变量的数据变量采采用

44、用简简化化段段定定义义格格式式,只只要要采采用用相相同同的的存存储储模模式式,容易实现正确的近或远调用容易实现正确的近或远调用完完整整段段定定义义格格式式中中,为为了了实实现现模模块块间间的的段段内内近近调调用用(near类类型型),各各自自定定义义的的段段名名、类类别别必必须须相相同同,组组合合类类型型都都是是public。实实际际的的程程序序开开发发中中,各各个个模模块块往往往往由由不不同同的的程程序序员员完完成成,不不易易实实现现段段同同名名或或类类别相同,所以索性定义成远调用(别相同,所以索性定义成远调用(far类型)类型)定定义义数数据据段段时时,同同样样也也要要注注意意这这个个问问

45、题题。当当各各个个模模块块的的数数据据段段不不同同时时,要要正正确确设设置置数数据据段段DS寄寄存存器器的段基地址的段基地址第 5 章处理好参数传递问题少少量量参参数数可可用用寄寄存存器器或或堆堆栈栈直直接接传传送送数数据据本身本身大大量量数数据据可可以以安安排排在在缓缓冲冲区区,用用寄寄存存器器或或堆栈传送数据的存储地址堆栈传送数据的存储地址还还可可利利用用变变量量传传递递参参数数,但但是是要要采采用用public/extern声明为公共(全局)变量声明为公共(全局)变量这些也是子程序间的参数传递方法这些也是子程序间的参数传递方法另另外外,第第7章章混混合合编编程程介介绍绍了了更更好好的的堆

46、堆栈栈传递参数方法,可以采用传递参数方法,可以采用例5.12b主程序主程序lt512b.asm并入宏定义并入宏定义子子程程序序文文件件sub512b.asm,要要加加上上段段定定义义语语句句、声声明明语语句句等等,但不需要起始点和结束点但不需要起始点和结束点模块连接的操作步骤:模块连接的操作步骤: 分别编辑生成各个文件分别编辑生成各个文件 分别汇编各个文件分别汇编各个文件 连接各个目标文件,形成连接各个目标文件,形成可执行文件可执行文件把把常常用用子子程程序序写写成成独独立立的的源源文文件件,单单独独汇编形成汇编形成OBJ文件后,存入文件后,存入子程序库子程序库主程序也单独汇编形成主程序也单独

47、汇编形成OBJ文件文件主主程程序序连连接接时时,调调入入子子程程序序库库中中的的子子程程序模块,产生最终的可执行文件序模块,产生最终的可执行文件例例5.12c5.12c 主程序文件主程序文件 lt512c.asm 子程序文件子程序文件 sub512c1.asm 子程序文件子程序文件 sub512c2.asm 子程序文件子程序文件 sub512c3.asm5.3.3 子程序库的调入3.; ;宏定义宏定义.code.codeextern extern ALdisp:near,sorting:near,input:nearALdisp:near,sorting:near,input:near; ;声

48、明其他模块中的子程序声明其他模块中的子程序.startup.startup.exit 0.exit 0endendLt512c.asm.model small.model small.code.codepublic public aldispaldispAldispAldispprocproc.AldispAldispendpendpendendsub512c1.asm.model small.model small.code.codepublic sortingpublic sortingsortingsortingprocproc.sortingsortingendpendpendends

49、ub512c2.asm.model small.model small.code.codepublic inputpublic inputinputinputprocproc.inputinputendpendpendendsub512c3.asm库文件调入的操作步骤:库文件调入的操作步骤: 分别编辑生成各个文件分别编辑生成各个文件 分别汇编各个文件分别汇编各个文件 用库管理文件,将子程序模块添加用库管理文件,将子程序模块添加到库文件(到库文件(.LIB.LIB)中中 连接主程序,提供库文件,连接主程序,提供库文件,形成可执行文件形成可执行文件第 5 章补充例题将将子子程程序序应应用用的的例例

50、题题4.134.15的的子子程程序序编编写成模块,供主程序调用写成模块,供主程序调用实实现现功功能能:从从键键盘盘输输入入有有符符号号十十进进制制数数,求求它们的平均值,然后输出它们的平均值,然后输出源程序文件进行简单修改源程序文件进行简单修改n主程序文件主程序文件n子程序文件子程序文件利用目标代码文件的连接形成可执行文件利用目标代码文件的连接形成可执行文件第 5 章5.4 输入输出程序设计输入指令输入指令IN从外设读取数据从外设读取数据输出输出OUT指令向外设提供数据指令向外设提供数据处理器通过处理器通过I/O接口控制外设接口控制外设参考参考I/O指令指令第第2.1.5节节建议结合硬件相关课

51、程学习建议结合硬件相关课程学习第 5 章5.4.1 程序直接控制输入输出程序执行程序执行IN或或OUT指令实现数据传送指令实现数据传送.model tiny.model tiny; ;形成形成comcom格式的程序格式的程序.code.code.startup.startupcall speaker_oncall speaker_on; ;打开打开扬声器声音声器声音mov ah,1mov ah,1; ;等待按等待按键int 21hint 21hcall speaker_offcall speaker_off ; ;关关闭扬声器声音声器声音.exit 0.exit 0例5.13:主程序speak

52、er_on procspeaker_on proc; ;扬声器开子程序声器开子程序push axpush axin al,61hin al,61h; ;读取原来控制信息取原来控制信息or al,03hor al,03h; ;D1D0=PB1PB0=11bD1D0=PB1PB0=11bout 61h,alout 61h,al; ;直接控制直接控制发声声pop axpop axretretspeaker_on endpspeaker_on endp例5.13:子程序扬声器关扬声器关; ;扬声器关子程序声器关子程序speaker_offspeaker_offand al,0fchand al,0fc

53、h; ;D1D0=PB1PB0=00bD1D0=PB1PB0=00b 第 5 章5.4.2 程序查询输入输出程序需要查询外设状态,然后进行数据交换程序需要查询外设状态,然后进行数据交换实际的输入输出程序可以规定一个超时参数实际的输入输出程序可以规定一个超时参数打印机查询输出的控制:打印机查询输出的控制:n要打印的字符首先提供给数据端口要打印的字符首先提供给数据端口n然后查询状态端口,确定打印机是否可以接受然后查询状态端口,确定打印机是否可以接受n如如果果打打印印机机还还没没有有准准备备好好接接受受数数据据,则则继继续续检检测一个固定时间测一个固定时间n如如果果打打印印机机能能够够接接受受数数据

54、据,处处理理器器利利用用控控制制端端口将数据提供给打印机口将数据提供给打印机mov cx,(sizeof okmsg)-1mov cx,(sizeof okmsg)-1mov si,offset okmsgmov si,offset okmsgprnbegin:prnbegin: mov dx,378hmov dx,378h; ;打印机基地址打印机基地址mov bx,100mov bx,100; ;超超时参数参数mov al,simov al,si; ;打印字符打印字符call printcharcall printchar; ;调用打印子程序用打印子程序jc prnerrjc prnerr;

55、CF=1;CF=1,不能打印,不能打印inc siinc si;CF=0;CF=0,打印正常,打印正常loop prnbeginloop prnbegin; ;继续mov dx,offset okmsgmov dx,offset okmsg ; ;显示正确示正确jmp prnokjmp prnokprnerr:prnerr:mov dx,offset errmsgmov dx,offset errmsg ; ;显示示错误prnok:prnok:mov ah,9mov ah,9int 21hint 21h例5.14:主程序printchar procprintchar procpush cxpu

56、sh cxout dx,alout dx,al; ;向数据端口向数据端口输出打印字符出打印字符inc dxinc dx; ;基地址加基地址加1 1成成为状状态端口端口print0:print0: sub cx,cxsub cx,cxprint1:print1: in al,dxin al,dx; ;查询状状态端口端口test al,80htest al,80h; ;最高位最高位D7D7反映打印机状反映打印机状态jnz print2jnz print2;D7=1;D7=1,可以接收打印数据,可以接收打印数据loop print1loop print1;D7=0;D7=0,不能接收打印数据,不能接

57、收打印数据dec bldec bl; ;超超时参数减参数减1 1jnz print0jnz print0; ;循循环检测stcstc; ;规定定时间内没有准内没有准备好好jmp print3jmp print3; ;退出打印退出打印例5.14:打印子程序1/2print2:print2: inc dxinc dx; ;基地址再加基地址再加1 1成成为控制端口控制端口mov al,0dhmov al,0dh; ;使最低位使最低位D0=1D0=1out dx,alout dx,alnopnop; ;延延时mov al,0chmov al,0ch; ;使最低位使最低位D0=0D0=0out dx,a

58、lout dx,al; ;产生生选通脉冲,将打印字符送入打印机通脉冲,将打印字符送入打印机clcclc; ;设置正常置正常标志志CF=0CF=0print3:print3: pop cxpop cxretret; ;返回返回printchar endpprintchar endp例5.14:打印子程序2/2第 5 章5.4.3 中断服务程序需需要要交交换换数数据据的的外外设设,采采用用中中断断请请求求向向处处理理器提出要求器提出要求处处理理器器执执行行事事先先设设计计好好的的中中断断服服务务程程序序,在在中断服务程序当中实现数据交换中断服务程序当中实现数据交换8086可可以以处处理理256种种

59、中中断断,分分为为内内部部、外外部部两种类型两种类型外部可屏蔽中断用于与外设进行数据交换外部可屏蔽中断用于与外设进行数据交换第 5 章1. 内部中断服务程序主主程程序序通通过过中中断断调调用用指指令令INT n执执行行内内部部中中断服务程序,其实质相当于子程序调用断服务程序,其实质相当于子程序调用编写内部中断服务程序与编写子程序雷同编写内部中断服务程序与编写子程序雷同n利用过程定义伪指令利用过程定义伪指令PROC / ENDPn但通常要执行但通常要执行STI指令开放可屏蔽中断指令开放可屏蔽中断n最后执行最后执行IRET指令返回调用程序指令返回调用程序n内部中断服务程序常用寄存器传递参数内部中断

60、服务程序常用寄存器传递参数设置中断向量设置中断向量:AH25H(INT 21H)获取中断向量获取中断向量:AH35H(INT 21H).data.dataintoffintoffdw ?dw ?; ;保存原偏移地址保存原偏移地址intsegintsegdw ?dw ? ; ;保存原段地址保存原段地址.code.codemov ax,3580hmov ax,3580h; ;获取中断取中断80H80H的中断向量的中断向量int 21hint 21hmov intoff,bxmov intoff,bx ; ;保存偏移地址保存偏移地址mov intseg,esmov intseg,es ; ;保存段基

61、地址保存段基地址例5.15a:1/5获取取中断向量:中断向量:AHAH3 35H5H(INT 21HINT 21H) 入口参数:入口参数:ALAL中断向量号中断向量号 出出口口参参数数:ES:BXES:BX中中断断服服务程程序序的的入入口口地地址址(段基地址:偏移地址)(段基地址:偏移地址)push dspush dsmov dx,offset newint80hmov dx,offset newint80hmov ax,seg newint80hmov ax,seg newint80hmov ds,axmov ds,axmov ax,2580hmov ax,2580h; ;设置中断置中断80

62、80H H的入口地址的入口地址int 21hint 21hpop dspop ds例5.15a:2/5设置中断向量:置中断向量:AHAH25H25H(INT 21HINT 21H) 入口参数:入口参数:ALAL中断向量号中断向量号 ES:BXES:BX中断服中断服务程序的段基地址:偏移地址程序的段基地址:偏移地址int 80hint 80h; ;调用中断用中断80h80h的服的服务程序,程序,显示信息示信息mov dx,intoffmov dx,intoff ; ;恢复中断恢复中断80H80H的入口地址的入口地址mov ax,intsegmov ax,intsegmov ds,axmov ds

63、,axmov ax,2580hmov ax,2580hint 21hint 21h.exit 0.exit 0; ;返回返回DOSDOS例5.15a:3/5设置中断向量:置中断向量:AHAH25H25H(INT 21HINT 21H) 入口参数:入口参数:ALAL中断向量号中断向量号 ES:BXES:BX中断服中断服务程序的段基地址:偏移地址程序的段基地址:偏移地址newint80hnewint80h procproc; ;内部中断服内部中断服务程序程序stisti; ;开中断开中断push axpush ax; ;保保护现场push bxpush bxpush cxpush cxpush s

64、ipush simov si,offset intmsgmov si,offset intmsg; ;获取取显示字符串首地址示字符串首地址mov cx,sizeof intmsgmov cx,sizeof intmsg; ;获取取显示字符串个数示字符串个数例5.15a:4/5disp:disp:mov al,cs:simov al,cs:si ; ;获取取显示字符示字符mov bx,0mov bx,0; ;显示一个字符示一个字符mov ah,0ehmov ah,0ehint 10hint 10hinc siinc siloop disploop disppop sipop si; ;恢复恢复现

65、场pop cxpop cxpop bxpop bxpop axpop axiretiret; ;中断返回中断返回intmsgintmsgdb I am Great !,0dh,0ahdb I am Great !,0dh,0ah ; ;显示信息示信息newint80hnewint80h endpendp例5.15a:5/5第 5 章2. 驻留中断服务程序驻驻留留TSR程程序序:程程序序执执行行结结束束,但但保保留留在在系系统主存中,可以让其他程序使用统主存中,可以让其他程序使用方法:利用方法:利用DOS功能功能31h代替代替4ch终止程序终止程序程序程序驻留返回:留返回:AHAH25H25H(

66、INT 21HINT 21H) 入口参数:入口参数:ALAL返回代返回代码 DXDX程序程序驻留的容量(留的容量(节,1 1节=16=16个字个字节).model tiny.model tiny.code.code.startup.startup; ;等价于等价于 org 100horg 100hjmp startjmp start; ;跳跳转到本程序的开始位置到本程序的开始位置newint80hnewint80h procproc; ;驻留的中断服留的中断服务程序程序.; ;同例同例题5.15a5.15a过程程newint80hnewint80h endpendp; ;中断服中断服务程序程序

67、结束束start:start:mov ax,csmov ax,cs; ;主程序开始位置主程序开始位置mov ds,axmov ds,axmov dx,offset newint80hmov dx,offset newint80hmov ax,2580hmov ax,2580hint 21hint 21h; ;设置置80h80h的中断向量的中断向量int 80hint 80h; ;调用一下看看用一下看看例5.15b:1/2mov dx,offset istmsgmov dx,offset istmsg; ;显示示驻留成功留成功mov ah,9mov ah,9int 21hint 21hmov d

68、x,(offset start)+15mov dx,(offset start)+15; ;计算算驻留程序的留程序的长度度( (需多加需多加1515个字个字节) )mov cl,4mov cl,4shr dx,clshr dx,cl; ;除以除以1616转换成成“节”mov ax,3100hmov ax,3100h; ;中断服中断服务程序程序驻留后,主程序返回留后,主程序返回DOSDOS系系统int 21hint 21histmsgistmsg db INT 80H is installed!,0dh,0ah,$db INT 80H is installed!,0dh,0ah,$endend例

69、5.15b:2/2第 5 章3. 外部可屏蔽中断服务程序编写可屏蔽中断服务程序,还要注意:编写可屏蔽中断服务程序,还要注意:n发送中断结束命令发送中断结束命令n不能采用寄存器传递参数不能采用寄存器传递参数n不要使用不要使用DOS系统功能调用系统功能调用INT 21Hn中断服务程序尽量短小中断服务程序尽量短小主程序除需要修改中断向量外,还要注意:主程序除需要修改中断向量外,还要注意:n控制控制CPU的中断允许标志的中断允许标志IFn设置中断屏蔽寄存器设置中断屏蔽寄存器IMR例例5.16 键盘中断服务程序键盘中断服务程序.code.codemov ax,35mov ax,350909h hint

70、21hint 21hpush espush espush bxpush bx; ;保存原中断向量内容保存原中断向量内容clicli; ;关中断关中断push dspush ds; ;设置新中断向量内容置新中断向量内容mov ax,25mov ax,250909h hmov dx,seg scancodemov dx,seg scancodemov ds,dxmov ds,dxmov dx,offset scancodemov dx,offset scancodeint 21hint 21hpop dspop ds例5.16:1/in al,21hin al,21h; ;读出出IMR IMR p

71、ush axpush ax; ;保存原保存原IMRIMR内容内容and al,0fdhand al,0fdh; ;允允许键盘中断(中断(D1D1)out 21h,alout 21h,al; ;设置新置新IMRIMR内容内容mov byte ptr esccode,0mov byte ptr esccode,0stisti; ;开中断开中断waiting:waiting: cmp byte ptr esccode,81hcmp byte ptr esccode,81h; ;循循环等待按下并等待按下并释放放ESCESC键jne waitingjne waiting; ;中断服中断服务程序程序设置置

72、esccodeesccode单元内容元内容.; ;恢复、返回恢复、返回例5.16:2/scancodescancodeprocprocstisti; ;键盘中断服中断服务程序程序push axpush axpush bxpush bxin al,60hin al,60h; ;读取取扫描描码push axpush axin al,61hin al,61h; ;通通过PB7PB7应答答键盘or al,80hor al,80hout 61h,alout 61h,al; ;使使PB7=1PB7=1and al,7fhand al,7fhout 61h,alout 61h,al; ;使使PB7=0PB7

73、=0pop axpop axcmp al,81hcmp al,81hjne scan1jne scan1; ;不是不是ESCESC键断开断开扫描描码,显示示例5.16:3/push dspush ds; ;是是ESCESC键断开断开扫描描码,则设置置esccodeesccode单元元mov bx,datamov bx,data; ;设置数据段地址置数据段地址 mov ds,bxmov ds,bxmov esccode,almov esccode,al; ;设置置esccodeesccode单元元为其其扫描描码pop dspop dsscan1:scan1:push axpush ax; ;显示

74、示扫描代描代码shr al,1shr al,1; ;先先显示高示高4 4位位shr al,1shr al,1shr al,1shr al,1shr al,1shr al,1cmp al,0ahcmp al,0ahjb scan2jb scan2add al,7add al,7scan2:scan2:add al,30hadd al,30h; ;转换成成ASCIIASCII码例5.16:4/mov bx,0mov bx,0mov ah,0ehmov ah,0ehint 10hint 10hpop axpop ax; ;后后显示低示低4 4位位and al,0fhand al,0fhcmp al,

75、0ahcmp al,0ahjb scan3jb scan3add al,7add al,7scan3:scan3:add al,30hadd al,30h; ;转换成成ASCIIASCII码mov ah,0ehmov ah,0ehint 10hint 10h例5.16:5/mov ax,0e20hmov ax,0e20h ; ;显示两个空格示两个空格int 10hint 10hmov ax,0e20hmov ax,0e20hint 10hint 10hmov al,20hmov al,20h; ;发送送EOIEOI命令命令out 20h,alout 20h,alpop bxpop bxpop

76、axpop axiretiret; ;中断返回中断返回scancodescancode endpendp例5.16:6/第5章 教学要求1.理理解解条条件件控控制制和和循循环环控控制制伪伪指指令令,熟熟悉悉带带参参数数的过程定义和过程声明、过程调用伪指令的过程定义和过程声明、过程调用伪指令2.了了解解宏宏操操作作符符、宏宏汇汇编编、条条件件汇汇编编和和重重复复汇汇编编、源源程程序序包包含含、代代码码连连接接和和子子程程序序库库等等程程序序设设计计方法方法3.了了解解程程序序直直接接控控制制、查查询询和和中中断断的的输输入入输输出出程程序设计序设计4.掌掌握握伪伪指指令令:PROTO PROTO / / INVOKEINVOKE,MACRO/ENDMMACRO/ENDM、LOCALLOCAL,INCLUDEINCLUDEPUBLICPUBLICEXTERNEXTERN

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号