汇编语言5实用教案_第1页
汇编语言5实用教案_第2页
汇编语言5实用教案_第3页
汇编语言5实用教案_第4页
汇编语言5实用教案_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、教学(jio xu)重点在掌握基本的汇编语言程序设计方法之后,进一步学习如何提高编程效率的各种( zhn)实用方法:高级语言特性宏结构模块化第1页/共65页第一页,共66页。5.1 高级(goj)语言特性 MASM 6.0引入高级语言的程序设计特性 条件控制(kngzh)伪指令 .IF .ELSE .ENDIF 循环控制(kngzh)伪指令 .WHILE .ENDW .REPEAT .UNTIL 过程声明和过程调用伪指令 .PROTO .INVOKE第2页/共65页第二页,共66页。要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐应该采用过程调用伪指令INVOKE使用INVOKE

2、伪指令的前提(qint)是需要用PROTO伪指令对过程进行声明5.1.3 过程声明(shngmng)和过程调用伪指令过程名 PROC调用距离 语言类型 作用(zuyng)范围 USES 寄存器列表, 参数:类型LOCAL 参数表;汇编语言语句过程名 ENDP第5章过程声明伪指令:用于事先声明过程的结构过程名PROTO 调用距离 语言类型, 参数:类型过程调用伪指令INVOKE 过程名,参数,.如何调用如何调用第3页/共65页第三页,共66页。;汇编语言程序:lt503.asm.model smallchecksumd PROTO c,:word,:word;声明过程.stack.dataarr

3、aydb 12h,25h,0f0h,0a3h,3db 68h,71h,0cah,0ffh,90hcountequ $-array;数组的元素个数resultdb ?;校验(xio yn)和.code.startupINVOKE checksumd,count,offset array;调用过程mov result,al;保存校验(xio yn)和.exit 0例5 5. .3 31/21/2列表列表(li bio)文件文件第4页/共65页第四页,共66页。checksumd PROC c USES bx cx,countp:word,arrayp:wordmov bx,arrayp ;BX数组

4、的偏移地址(dzh)mov cx,countp ;CX数组的元素个数xor al,alsumd: add al,bx;求和:ALAL+DS:BXinc bxloop sumdretchecksumd endpend例5 5. .3 32/22/2列表列表(li bio)文件文件第5页/共65页第五页,共66页。;lt503.asm的列表(li bio)文件(lt503.lst).INVOKE checksumd,count,offset array *mov ax,word ptr OFFSET array *push ax *mov ax,+000Ah *push ax *call chec

5、ksumd *add sp,04hmov result,al.例5 5. .3 31/21/2指示该语句由汇编程序自动生成指示该语句由汇编程序自动生成第6页/共65页第六页,共66页。checksumd PROC c USES bx cx,countp:word,arrayp:word *push bp;起始(q sh)代码 *mov bp,sp *push bx;保护bx和cx *push cxmov bx,arrayp;arrayp=BP+6mov cx,countp;cuontp=BP+4.ret *pop cx;结尾代码 *pop bx *pop bp *ret 0000hchecks

6、umc endp例5 5. .3 32/22/2进入调试程序观察进入调试程序观察第7页/共65页第七页,共66页。5.2 宏结构(jigu)程序设计宏汇编(hubin)重复汇编(hubin)条件汇编(hubin)统称宏结构宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化(jinhu)源程序的方法第8页/共65页第八页,共66页。宏具有宏名的一段汇编语句序列宏定义时书写宏指令这段汇编语句序列的缩写宏调用时书写宏展开宏指令处用这段宏代替的过程宏汇编时实现宏的参数(cnsh)功能强大,颇具特色配合宏,还有宏操作符和有关伪指令5.2.1 宏汇编(hubin)第5章第9页/共

7、65页第九页,共66页。宏名macro 形参表宏定义(dngy)体endmmainbeginMACRO ;定义名为mainbegin的宏,无参数(cnsh)mov ax,data;宏定义体mov ds,axENDM;宏定义结束mainendMACRO retnum;带有形参retnummov al,retnum;宏定义中使用参数(cnsh)mov ah,4chint 21hENDM宏注释符第10页/共65页第十页,共66页。宏名实参表start:mainbegin;宏调用,建立DS内容dispmsg string;宏调用,显示字符串mainend 0;宏调用,返回DOSend start 宏调

8、用的实质是在汇编过程中进行宏展开(zhn ki) 宏展开(zhn ki)的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代第11页/共65页第十一页,共66页。宏展开在汇编时,用宏定义体的代码序列替代宏指令(zhlng)的过程。start: mainbegin;宏指令(zhlng) 1mov ax,data ;宏展开 1mov ds,axmainend 0;宏指令(zhlng) 1mov al,0;宏展开 1mov ah,4ch 1int 21h第12页/共65页第十二页,共66页。宏的参数(cnsh)使用非常灵活

9、宏定义时,可以(ky)无参数,例如5.4a的mainbegin可以(ky)带有一个参数,例如5.4a的mainend也可以(ky)具有多个参数;例如5.5a的shlext参数可以(ky)是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以(ky)是表达式;例如5.5b的shift和shrot宏定义体可以(ky)是任何合法的汇编语句,既可以(ky)是硬指令序列,又可以(ky)是伪指令序列;例如5.6的dstring第13页/共65页第十三页,共66页。;宏定义(dngy)shlextmacro shloprand,shlnumpush cxmov cl,shlnumshl shlopra

10、nd,clpop cxendm;宏指令shlext ax,6;宏展开 1push cx 1mov cl,06 1shl ax,cl 1pop cx例5.5a5.5a第14页/共65页第十四页,共66页。;统一4条移位指令(zhlng)的宏指令(zhlng)shiftmacro soprand,snum,sopcodepush cxmov cl,snums&sopcode& soprand,clpop cxendm;统一移位和循环移位8条指令(zhlng)的宏指令(zhlng)shrotmacro sroprand,srnum,sropcodepush cxmov cl,srnu

11、msropcode sroprand,clpop cxendm例5.5b5.5b替换(t hun)操作符第15页/共65页第十五页,共66页。;宏定义(dngy)dstring macro stringdb &string&,0dh,0ah,$endm;宏调用dstring dstring 0 ! Number !;宏展开 1db This is a example., 0dh,0ah,$ 1db 0 Number 10, 0dh,0ah, $例5.65.6转义(zhun y)注释符传递(chund)注释符第16页/共65页第十六页,共66页。宏操作符 ;宏注释符,用于表示(b

12、iosh)在宏定义中的注释。采用这个符号的注释,在宏展开时不出现 &替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符第5章第17页/共65页第十七页,共66页。宏操作符 字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证(bozhng)字符串的完整 !转义操作符,用于指示其后的一个字符作为一般字符,不含特殊意义 %表达式操作符,用在宏调用中,表示将后跟的一个表达式的值作为实参,而不是将表达式本身作为参数第5章第18页/共65页第十八页,共66

13、页。与宏有关(yugun)(yugun)的伪指令局部标号伪指令LOCAL 标号列表宏定义体采用(ciyng)了标号,应使用LOCAL加以说明它必须是宏定义MACRO语句之后的第一条语句宏定义删除伪指令PURGE 宏名表不需要某个宏定义时,可以把它删除宏定义退出伪指令EXITM伪指令EXITM表示结束当前宏调用的展开第5章第19页/共65页第十九页,共66页。;宏定义(dngy)absol macro oprdlocal nextcmp oprd,0jge nextneg oprdnext:endm例5.75.7;宏调用(dioyng)(dioyng)absol word ptr bxabsol

14、 word ptr bxabsol bxabsol bx;宏展开 1 1cmp word ptr bx,0cmp word ptr bx,0 1 1jge ?0000jge ?0000 1 1neg word ptr bxneg word ptr bx 1 1?0000:?0000: 1 1cmp bx,0cmp bx,0 1 1jge ?0001jge ?0001 1 1neg bxneg bx 1 1?0001:?0001:单独占一行第20页/共65页第二十页,共66页。比较(bjio)仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变通过形

15、参、实参结合实现(shxin)参数传递,简捷直观、灵活多变还是目标程序级的简化:子程序调用在执行时由CALLCALL指令转向、RETRET指令返回;形成的目标代码 较 短 , 执 行 速 度(sd)(sd)减慢需要利用寄存器、存储单元或堆栈等传递参数宏宏子程序子程序第21页/共65页第二十一页,共66页。 宏与子程序具有各自的特点,程序员应该根据具体问题选择(xunz)使用那种方法 通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序比较(bjio)结论宏宏子程序子程序第22页/共65页第二十二页,共66页。5.2.2 重复(chngf)汇编 重复汇编指在

16、汇编过程中,重复展开一段(基本)相同的语句 重复汇编没有名字,不能被调用 重复汇编常用在宏定义体中,也可以在一般(ybn)汇编语句中使用 重复汇编伪指令有三个: REPEAT按参数值重复 FOR按参数个数重复 FORC按参数的字符个数重复 最后,用ENDM结束第5章第23页/共65页第二十三页,共66页。REPEAT REPEAT 重复(chngf)(chngf)次数 重复(chngf)(chngf)体ENDMENDMchar = Achar = AREPEAT 26REPEAT 26 db char db char char = char +1 char = char +1ENDMENDM

17、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第24页/共65页第二十四页,共66页。FOR FOR 形参, ,实参表 重复(chngf)(chngf)体ENDMENDMFOR regad, FOR regad, push regad push regadE

18、NDMENDM 1 1push axpush ax 1 1push bxpush bx 1 1push cxpush cx 1 1push dxpush dx第25页/共65页第二十五页,共66页。FORC FORC 形参, , 字符串 重复(chngf)(chngf)体ENDMENDMFORC regad,dcbaFORC regad,dcba pop &regad&x pop &regad&xENDMENDM 1 1pop dxpop dx 1 1pop cxpop cx 1 1pop bxpop bx 1 1pop axpop ax第26页/共65页第二十

19、六页,共66页。5.2.3 条件(tiojin)汇编 条件汇编伪指令在汇编过程中,根据条件决定汇编的语句(yj) IFxx 表达式 ;满足,汇编分支语句(yj)体1分支语句(yj)体1 ELSE;不满足,汇编分支语句(yj)体2分支语句(yj)体2 ENDIF;条件汇编结束第5章第27页/共65页第二十七页,共66页。pdatamacro num IF num lt 100;如果num 100,则汇编(hubin)如下语句db num dup (?) ELSE;否则,汇编(hubin)如下语句db 100 dup (?) ENDIFendmpdata 12 ;宏调用db 12 dup(?) ;

20、宏汇编(hubin)结果pdata 102 ;宏调用db 100 dup(?) ;宏汇编(hubin)结果例5.105.10第28页/共65页第二十八页,共66页。宏结构的作用宏汇编、重复汇编和条件(tiojin)汇编为源程序的编写提供了很多方便,灵活运用它们可以编写出非常良好的源程序来汇编系统中有些以圆点起始的 伪指令(如.startup、.exit等)实际上是一种宏结构第29页/共65页第二十九页,共66页。dstringMACRO string;定义字符串db &string&,0dh,0ah,$ENDMmainbeginMACRO dsseg;设置(shzh)数据段地址

21、mov ax,dssegmov ds,axENDMdispmsgMACRO messagemov dx,offset messagemov ah,09hint 21hENDM第30页/共65页第三十页,共66页。mainendMACRO retnum;返回(fnhu)DOS,可不带参数ifb mov ah,4ch;没有参数else mov ax,4c00h+(retnum AND 0ffh); 有参数endifint 21hENDM第31页/共65页第三十一页,共66页。.model small.stack 256.datamsg1equ this bytedstringmsg2equ thi

22、s bytedstring.codestart:mainbegin data;建立DS内容dispmsg msg1;显示(xinsh)msg1字符串dispmsg msg2;显示(xinsh)msg2字符串mainend;返回DOSend start第32页/共65页第三十二页,共66页。将程序分段、采用(ciyng)子程序或宏结构都是进行模块化程序设计本节介绍开发大型程序时采用(ciyng)的方法:源程序文件的包含目标模块连接子程序库5.3 模块化程序设计(chn x sh j)例题例题(lt) 5.12(lt) 5.12将键盘输入的数据按升序输出将键盘输入的数据按升序输出第33页/共65页

23、第三十三页,共66页。把源程序分放在几个文本文件中,在汇编时通过包含伪指令INCLUDE结合成一体INCLUDE 文件名可将常用的子程序形成.ASM汇编语言源文件可将常用的宏定义存放在.MAC宏库文件中可将常量定义、声明语句(yj)组织在.INC包含文件中例5.12a 宏库文件 lt512a.mac 主程序文件 lt512a.asm 子程序文件 sub512a.asm5.3.1 源程序文件(wnjin)的包含1第34页/共65页第三十四页,共66页。dispcharmacro char;显示(xinsh)char字符mov dl,charmov ah,2int 21hendmdispmsgma

24、cro message;显示(xinsh)message字符串mov dx,offset messagemov ah,9int 21hendmLt512a.maLt512a.mac c第35页/共65页第三十五页,共66页。include lt512a.mac.dispmsg msg1;提示输入数据(shj)mov bx,offset bufcall input;数据(shj)输入cmp cx,0je start4;没有输入数据(shj)则退出mov count,cx.;显示输入的数据(shj).;数据(shj)排序.;显示经排序后的数据(shj)start4: .exit 0include

25、sub512a.asmendLt512a.asmLt512a.asm第36页/共65页第三十六页,共66页。子程序源文件有3个子(g zi)程序ALdisp;显示2位16进制数子程序(例4.10)sorting ;排序子程序(例4.8)input;键盘输入子程序还包含一个宏convert ;将DX两位ASCII码转换为两位16进制数sub512a.asub512a.asmsm让我们(w men)(w men)重点分析键盘输入子程序 input input第37页/共65页第三十七页,共66页。;键盘输入子程序;入口(r ku)参数:ds:bx=存放数据的缓冲区;出口参数:cx=数据个数inpu

26、tprocpush axpush dxxor cx,cx;数据个数清0input01: xor dx,dx;输入字符清0input02: mov ah,1;键盘输入一个字符int 21hinputinput之一继续:继续:inputinput之二之二第38页/共65页第三十八页,共66页。input10: cmp al,0dhje input30;是回车,结束整个数据的输入cmp al, je input20;是空格和逗号,确认输入了一个(y )数据cmp al,je input20cmp al,08hje input17;是退格,丢弃本次输入的数据,出错inputinput之二继续:继续:i

27、nputinput之三之三第39页/共65页第三十九页,共66页。cmp al,0;有效数字(yu xio sh z)判断(图5.2b)jb input17 ;小于0,不是有效数字(yu xio sh z),出错cmp al,fja input17 ;大于f,不是有效数字(yu xio sh z)cmp al,ajb input11sub al,20h ;af转换成大写AFjmp input12input11:cmp al,Fja input17 ;字符小于a、大于F,出错cmp al,Ajae input12;是AF,有效字符cmp al,9ja input17 ;是09,有效字符input

28、input之三继续:继续:inputinput之四之四第40页/共65页第四十页,共66页。input12: cmp dl,0;有效(yuxio)字符的处理jne input13mov dl,al;dl=0,输入了一个数据的低位,则dlaljmp input02;转到字符输入input13: cmp dh,0jne input17;dl0,dh0输入3位数据,出错mov dh,dl;dl0,dh0输入了一个数据的高位mov dl,al;dhdl,dlaljmp input02;转到字符输入inputinput之四继续:继续:inputinput之五之五第41页/共65页第四十一页,共66页。i

29、nput17:mov dl,7;输入错误处理mov ah,2int 21hmov dl,?mov ah,2int 21hjmp input01;转到输入一个(y )数据inputinput之五继续:继续:inputinput之六之六第42页/共65页第四十二页,共66页。;转换正确的输入数据(图5.2c)input20: convertjmp input01 ;转到输入一个(y )数据input30:convertpop dxpop axret;返回,出口参数已设定inputendpinputinput之六继续:继续:convertconvert之一之一第43页/共65页第四十三页,共66页。

30、;将DX两位ASCII码转换(zhunhun)为两位16进制数(图5.2c)convert macrolocal input21,input22local input24,input25cmp dl,0;dl=0,没有要转换(zhunhun)的数据,退出je input25convertconvert之一继续:继续:convertconvert之二之二第44页/共65页第四十四页,共66页。cmp dl,9jbe input21sub dl,7;字符(z f)AF,则减7input21: and dl,0fh;转换低位cmp dh,0;dh=0,没有高位数据je input24cmp dh,9

31、jbe input22sub dh,7input22: shl dh,1shl dh,1shl dh,1shl dh,1;转换高位or dl,dh;合并高、低位convertconvert之二继续:继续:convertconvert之三之三第45页/共65页第四十五页,共66页。源文件包含的操作步骤:源文件包含的操作步骤: 分别编辑生成各个文件分别编辑生成各个文件 汇编汇编(hubin)(hubin)、连接主程序、连接主程序文件文件input24: mov bx,dl;存入(cn r)缓冲区inc bxinc cx;数据加1input25:endmconvertconvert之三第46页/共6

32、5页第四十六页,共66页。把常用子程序写成独立的源程序文件,单独汇编,形成子程序的目标文件.OBJ主程序也经过独立汇编之后形成目标文件连接程序将所有目标文件连接起来,最终产生可执行文件需要遵循的原则: 声明共用的变量、过程等 实现正确(zhngqu)的段组合 处理好参数传递问题5.3.2 目标代码(di m)文件的连接2第47页/共65页第四十七页,共66页。声明共用的变量(binling)、过程 各个(gg)模块间共用的变量、过程等要说明 PUBLIC 标识符 ,标识符.;定义标识符的模块使用 EXTERN 标识符:类型 ,标识符:类型.;调用标识符的模块使用 标识符是变量名、过程名等 类型

33、是byte / word / dword(变量)或near / far(过程) 在一个源程序中,public/extern语句可以有多条 各模块间的public/extern伪指令要互相配对,并且指明的类型互相一致第5章第48页/共65页第四十八页,共66页。实现正确(zhngqu)的段组合 子程序文件必须定义在代码段中,也可以具有局部的数据变量 采用简化段定义格式,只要采用相同的存储模式,容易实现正确的近或远调用 完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合类型都是public。实际的程序开发中,各个模块往往由不同的程序员完成,不易实现段同

34、名或类别相同,所以索性定义成远调用(far类型) 定义数据段时,同样也要注意(zh y)这个问题。当各个模块的数据段不同时,要正确设置数据段DS寄存器的段基地址第5章第49页/共65页第四十九页,共66页。处理(chl)好参数传递问题 少量参数可用寄存器或堆栈直接传送数据本身 大量数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址 还可利用变量传递参数,但是要采用public/extern声明为公共(全局)变量 这些也是子程序间的参数传递方法(fngf) 另外,第7章混合编程介绍了更好的堆栈传递参数方法(fngf),可以采用第5章第50页/共65页第五十页,共66页。例5.12b 主程序l

35、t512b.asm并入宏定义(dngy) 子程序文件sub512b.asm,要加上段定义(dngy)语句、声明语句等,但不需要起始点和结束点模块连接模块连接(linji)(linji)的操作步骤:的操作步骤: 分别编辑生成各个文件分别编辑生成各个文件 分别汇编各个文件分别汇编各个文件 连接连接(linji)(linji)各个目标文件,各个目标文件,形成形成可执行文件可执行文件第51页/共65页第五十一页,共66页。.;宏定义(dngy).codepublic count;定义(dngy)count共用extern ALdisp:near,sorting:near,input:far;声明其他模

36、块中的子程序.startup.exit 0;去掉(lt512a.asm中的)包含语句endLt512b.asLt512b.asm m第52页/共65页第五十二页,共66页。.model small;定义同样的存储模式extern count:word;在其他模块定义了字变量count.code;子程序在代码段中public aldisp,sorting,input;3个子程序是共用(n yn)的Aldispproc;仍然作为近调用sorting proc;仍然作为近调用inputproc far;修改为远调用.mov count,cx;提供出口参数.inputendpend;结束汇编sub51

37、2b.asub512b.asmsm第53页/共65页第五十三页,共66页。把常用子程序写成独立的源文件,单独汇编形成OBJ文件后,存入(cn r)子程序库主程序也单独汇编形成OBJ文件主程序连接时,调入子程序库中的子程序模块,产生最终的可执行文件例5.12c 主程序文件 lt512c.asm 子程序文件 sub512c1.asm 子程序文件 sub512c2.asm 子程序文件 sub512c3.asm5.3.3 子程序库的调入3第54页/共65页第五十四页,共66页。子程序库 子程序库文件(.LIB)是子程序模块的集合,其中存放着各子程序的名称、目标代码及有关定位信息 存入库的子程序的编写与

38、目标文件连接方法中的要求一样,只是为方便调用,更加严格 子程序文件编写完成后,汇编形成目标文件;然后利用库管理工具程序LIB.EXE,把子程序目标模块逐一(zhy)加入到库中LIB 库文件名 + 子程序目标文件名 库管理程序LIB帮助创建、组织和维护子程序模块库,例如增加、删除、替换、合并库文件等第5章第55页/共65页第五十五页,共66页。.;宏定义.codeextern ALdisp:near,sorting:near,input:near;声明(shngmng)其他模块中的子程序.startup.exit 0endLt512c.asmLt512c.asm第56页/共65页第五十六页,共66页。.model small.codepublic aldispAldispproc.Aldisp endpendsub512c1.asmsub512c1.asm第57页/共65页第五十七页,共66页。.model small.codepublic sortings

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论