汇编语言(课堂PPT)_第1页
汇编语言(课堂PPT)_第2页
汇编语言(课堂PPT)_第3页
汇编语言(课堂PPT)_第4页
汇编语言(课堂PPT)_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

1、.第第 4 4 章章.教学重点综合应用第综合应用第2章硬指令和第章硬指令和第3章伪指令,第章伪指令,第4章从程序章从程序结构角度展开程序设计,重结构角度展开程序设计,重点掌握:点掌握:分支结构程序设计分支结构程序设计循环结构程序设计循环结构程序设计子程序结构程序设计子程序结构程序设计第4章.4.1 顺序程序设计顺序程序完全按指令书写的前后顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、顺序执行每一条指令,是最基本、最常见的程序结构最常见的程序结构例4.1 计算例4.2 移位例题 代码转换.model small.model small.stack.stack.data.dataX X

2、dw 5dw 5Y Ydw 6dw 6Z Zdw 7dw 7W Wdw ?dw ?.code.code.startup.startupmov ax,Xmov ax,Xadd ax,Yadd ax,Yadd ax,Zadd ax,Zmov W,axmov W,ax.exit 0.exit 0endend.data.dataqvarqvar dq 1234567887654321hdq 1234567887654321h.code.codemov al,mov al,byte ptr qvar6byte ptr qvar6mov mov byte ptr qvar7byte ptr qvar7,a

3、l,almov al,byte ptr qvar5mov al,byte ptr qvar5mov byte ptr qvar6,almov byte ptr qvar6,almov al,byte ptr qvar4mov al,byte ptr qvar4mov byte ptr qvar5,almov byte ptr qvar5,almov al,byte ptr qvar3mov al,byte ptr qvar3mov byte ptr qvar4,almov byte ptr qvar4,al图示图示.mov al,byte ptr qvar2mov al,byte ptr qv

4、ar2mov byte ptr qvar3,almov byte ptr qvar3,almov al,byte ptr qvar1mov al,byte ptr qvar1mov byte ptr qvar2,almov byte ptr qvar2,almov al,byte ptr qvar0mov al,byte ptr qvar0mov byte ptr qvar1,almov byte ptr qvar1,almov mov byte ptr qvar0,0byte ptr qvar0,01212 3434 5656 7878 8787 6565 4343 2121h h3434

5、5656 7878 8787 6565 4343 2121 0000h h移位后移位后图示图示第4章.64位数据左移8位123456788765432100qvar0qvar1qvar2qvar3qvar4qvar5qvar6qvar7.;查表法,实现一位;查表法,实现一位1616进制数转换为进制数转换为ASCIIASCII码显示码显示.model small.model small.stack 256.stack 256.data.dataASCIIASCII db 30h,31h,32h,33h,34h,35hdb 30h,31h,32h,33h,34h,35hdb 36h,37h,38h

6、,39hdb 36h,37h,38h,39h ;0;09 9的的ASCIIASCII码码db 41h,42h,43h,44h,45h,46hdb 41h,42h,43h,44h,45h,46h;A;AF F的的ASCIIASCII码码hexhexdb 0bhdb 0bh; ;任意设定了一个待转换的一位任意设定了一个待转换的一位1616进制数进制数.code.code.startup.startupmov bx,offset ASCIImov bx,offset ASCII;BX;BX指向指向ASCIIASCII码表码表mov al,hexmov al,hex;AL;AL取得一位取得一位1616

7、进制数,正是进制数,正是ASCIIASCII码表中位移码表中位移and al,0fhand al,0fh; ;只有低只有低4 4位是有效的,高位是有效的,高4 4位清位清0 0 xlatxlat; ;换码:换码:ALDS:BXALDS:BXALALmov dl,almov dl,al; ;入口参数:入口参数:DLALDLALmov ah,2mov ah,2;02;02号号DOSDOS功能调用功能调用int 21hint 21h ; ;显示一个显示一个ASCIIASCII码字符码字符.exit 0.exit 0endend第4章.4.2 分支程序设计分支程序根据条件是真或假决定执行与否分支程序根

8、据条件是真或假决定执行与否判断的条件是各种指令,如判断的条件是各种指令,如CMP、TEST等等执行后形成的状态标志执行后形成的状态标志转移指令转移指令Jcc和和JMP可以实现分支控制;还可以实现分支控制;还可以采用可以采用MASM 6.x提供的条件控制伪指令提供的条件控制伪指令实现实现单分支:求绝对值等双分支:例4.3等多分支:例4.4等.单分支程序设计条件成立跳转,条件成立跳转,否则顺序执行分否则顺序执行分支语句体;注意支语句体;注意选择正确的条件选择正确的条件转移指令和转移转移指令和转移目标地址目标地址第4章.;计算;计算AXAX的绝对值的绝对值cmp ax,0cmp ax,0jns no

9、nnegjns nonneg ; ;分支条件:分支条件:AX0AX0neg axneg ax; ;条件不满足,求补条件不满足,求补nonneg:nonneg: mov result,axmov result,ax; ;条件满足条件满足;计算;计算AXAX的绝对值的绝对值cmp ax,0cmp ax,0jl yesnegjl yesneg; ;分支条件:分支条件:AXAX0 0jmp nonnegjmp nonnegyesneg:yesneg: neg axneg ax; ;条件不满足,求补条件不满足,求补nonneg:nonneg: mov result,axmov result,ax; ;条

10、件满足条件满足Good Bad.;将;将AXAX中存放的无符号数除以中存放的无符号数除以2 2,如果是奇数,则,如果是奇数,则加加1 1后除以后除以2 2test ax,01htest ax,01h; ;测试测试AXAX最低位最低位jz evenjz even; ;最低位为最低位为0 0:AXAX为偶数为偶数add ax,1add ax,1; ;最低位为最低位为1 1:AXAX为奇数,需要加为奇数,需要加1 1even:even: rcr ax,1rcr ax,1;AXAX;AXAX2 2; ;如果采用如果采用SHRSHR指令,则不能处理指令,则不能处理AXAXFFFFHFFFFH的特殊情况的

11、特殊情况.双分支程序设计条件成立跳转执行第条件成立跳转执行第2个分支语句体,否个分支语句体,否则顺序执行第则顺序执行第1个分个分支语句体。注意第支语句体。注意第1个分支体后一定要有个分支体后一定要有一个一个JMP指令跳到第指令跳到第2个分支体后个分支体后第4章.shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjc onejc one;CF;CF1 1,即最高位为,即最高位为1 1,转移,转移mov dl,0mov dl,0;CF;CF0 0,即最高位为,即最高位为0 0,DL0DL0jmp twojmp two; ;一定要跳过另一个分支体一定要跳过另一个分支体one:o

12、ne: mov dl,1mov dl,1;DL1;DL1two:two: mov ah,2mov ah,2int 21hint 21h; ;显示显示对比对比 双分支程序改为单分支程序双分支程序改为单分支程序.shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFj jn nc onec one;CF;CF0 0,即最高位为,即最高位为0 0,转移,转移mov dl,mov dl,11;CF;CF1 1,即最高位为,即最高位为1 1,DLDL11jmp twojmp two; ;一定要跳过另一个分支体一定要跳过另一个分支体one:one: mov dl,mov dl,00 ;D

13、L;DL00two:two: mov ah,2mov ah,2int 21hint 21h; ;显示显示 双分支程序改为单分支程序双分支程序改为单分支程序对比对比.mov dl,0mov dl,0;DL0;DL0shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjnc twojnc two;CF;CF0 0,最高位为,最高位为0 0,转移,转移mov dl,1mov dl,1;CF;CF1 1,最高位为,最高位为1 1,DL1DL1two:two: mov ah,2mov ah,2int 21hint 21h; ;显示显示 编写分支程序,需留心分支的开始和结束编写分支程序

14、,需留心分支的开始和结束.startup.startupmov al,_bmov al,_bimul alimul almov bx,axmov bx,ax;BX;BX中为中为b b2 2mov al,_amov al,_aimul _cimul _cmov cx,4mov cx,4imul cximul cx;AX;AX中为中为4ac4ac(DXDX无有效数据)无有效数据).cmp bx,axcmp bx,ax; ;比较二者大小比较二者大小jge yesjge yes; ;条件满足?条件满足?mov tag,0mov tag,0;第一分支体:条件不满足,第一分支体:条件不满足,tag0jmp

15、 donejmp done;跳过第二个分支体跳过第二个分支体yes:yes:mov tag,1mov tag,1;第二分支体:条件满足,第二分支体:条件满足,tag1done:done: .exit 0.exit 0.; ;寄存器寄存器ALAL中是字母中是字母Y Y或或y y,则令,则令AHAH0 0;否则;否则令令AHAH1 1cmp al,Ycmp al,Y;AL;AL是大写是大写Y Y否?否?jz nextjz next; ;是,转移是,转移cmp al,y cmp al,y ;AL;AL是小写是小写y y否?否?jz nextjz next; ;是,转移是,转移mov ah,-1mov

16、 ah,-1; ;不是不是Y Y或或y y,则,则AHAH1 1,结束,结束jmp donejmp done; ;一定要跳过另一个分支体一定要跳过另一个分支体next:next: mov ah,0mov ah,0; ;是是Y Y或或y y,则,则AHAH0 0,结束,结束done:done: .多分支程序设计多个条件对应各自的分支语句体,哪个条多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行。多分支可以件成立就转入相应分支体执行。多分支可以化解为双分支或单分支结构的组合,例如:化解为双分支或单分支结构的组合,例如: or ah,ahor ah,ah; ;等效于等效于cmp ah,

17、0cmp ah,0 jz function0 jz function0;ah;ah0 0,转向,转向function0function0 dec ah dec ah; ;等效于等效于cmp ah,1cmp ah,1 jz function1 jz function1;ah;ah1 1,转向,转向function1function1 dec ah dec ah; ;等效于等效于cmp ah,2cmp ah,2 jz function2 jz function2;ah;ah2 2,转向,转向function2function2第4章图示图示第4章.多分支结构AH=0fuction0YNAH=1fu

18、ction1YNAH=2fuction2YN第4章.地址表形成多分支需要在数据段事先安排一个按顺序排需要在数据段事先安排一个按顺序排列的转移地址表列的转移地址表输入的数字作为偏移量。因为只有输入的数字作为偏移量。因为只有2个个字节字节16位偏移地址,所以偏移量需要位偏移地址,所以偏移量需要乘乘2关键是要理解间接寻址方式关键是要理解间接寻址方式JMP指令指令地址表地址表分支分支1地址地址分支分支2地址地址.Table db disp1, disp2, disp3, disp4, .data.datamsgmsgdb Input number(18):,0dh,0ah,$db Input numb

19、er(18):,0dh,0ah,$msg1msg1db Chapter 1 : .,0dh,0ah,$db Chapter 1 : .,0dh,0ah,$msg2msg2db Chapter 2 : .,0dh,0ah,$db Chapter 2 : .,0dh,0ah,$.msg8msg8db Chapter 8 : . ,0dh,0ah,$db Chapter 8 : . ,0dh,0ah,$tabletable dw disp1,disp2,disp3,disp4dw disp1,disp2,disp3,disp4dw disp5,disp6,disp7,disp8dw disp5,di

20、sp6,disp7,disp8; ;取得各个标号的偏移地址取得各个标号的偏移地址此处等同于此处等同于 offset disp1.start1:start1: mov dx,offset msgmov dx,offset msg ; ;提示输入数字提示输入数字mov ah,9mov ah,9int 21hint 21hmov ah,1mov ah,1; ;等待按键等待按键int 21hint 21hcmp al,1cmp al,1; ;数字数字 1 8 8?ja start1ja start1and ax,000fhand ax,000fh ; ;将将ASCIIASCII码转换成数字码转换成数字

21、.dec axdec axshl ax,1shl ax,1; ;等效于等效于add ax,axadd ax,axmov bx,axmov bx,axjmp tablebxjmp tablebx; ;(段内)间接转移:(段内)间接转移:IPtable+bxIPtable+bxstart2:start2: mov ah,9mov ah,9int 21hint 21h.exit 0.exit 0disp1:disp1:mov dx,offset msg1mov dx,offset msg1; ;处理程序处理程序1 1jmp start2jmp start2.可以改为可以改为 call tablebx

22、对应修改为对应修改为 ret第4章.4.3 循环程序设计循环结构一般是根据某一条件判断为循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体真或假来确定是否重复执行循环体循环指令和转移指令可以实现循环控循环指令和转移指令可以实现循环控制;还可以采用制;还可以采用MASM 6.x提供的循环提供的循环控制伪指令实现控制伪指令实现循环指令LOOPE:例4.6转移指令:例4.7多重循环:例4.8等循环指令LOOP:例4.5等第4章.循环结构 结束结束 初始化初始化 循环的初始状态循环的初始状态 循环体循环体 循环的工作部分循环的工作部分及修改部分及修改部分 计数控制循环计数控制循环条件控制循

23、环条件控制循环修改部分修改部分控制条件控制条件Y YN N.model small.model small.stack.stack.data.datasumsumdw ?dw ?.code.code.startup.startupxor ax,axxor ax,ax; ;被加数被加数AXAX清清0 0mov cx,mov cx,100100again:again:add ax,cxadd ax,cx; ;从从100,99,.,2,1100,99,.,2,1倒序累加倒序累加loop againloop againmov sum,axmov sum,ax; ;将累加和送入指定单元将累加和送入指定单

24、元.exit 0.exit 0endend 计数控制循环计数控制循环 循环次数固定循环次数固定.; ;用二进制显示从键盘输入的一个字符的用二进制显示从键盘输入的一个字符的ASCIIASCII码码mov ah,1mov ah,1; ;从键盘输入一个字符从键盘输入一个字符int 21hint 21hmov bl,almov bl,al;BLAL;BLAL字符的字符的ASCIIASCII码码;DOS;DOS功能会改变功能会改变ALAL内容,故字符内容,故字符ASCIIASCII码存入码存入BLBLmov ah,2mov ah,2mov dl,:mov dl,:; ;显示一个分号,用于分隔显示一个分号

25、,用于分隔int 21hint 21h.mov cx,mov cx,8 8;CX8;CX8(循环次数)(循环次数)again:again:shl bl,1shl bl,1; ;左移进左移进CFCF,从高位开始显示,从高位开始显示mov dl,0mov dl,0;MOV;MOV指令不改变指令不改变CFCFadc dl,30hadc dl,30h ;DL0;DL030H30HCFCF;CF;CF若是若是0 0,则,则DL0DL0;若是;若是1 1,则,则DL1DL1mov ah,2mov ah,2int 21hint 21h; ;显示显示loop againloop again;CX;CX减减1

26、1,如果,如果CXCX未减至未减至0 0,则循环,则循环 计数控制循环计数控制循环 循环次数固定循环次数固定.startup.startupmov ax,wordXmov ax,wordX ; ;测试目标送测试目标送AXAXmov cx,mov cx,1616; ;循环计数器置初值循环计数器置初值mov dl,-1mov dl,-1; ;计位器置初值计位器置初值again:again:inc dlinc dltest ax,1test ax,1ror ax,1ror ax,1; ;循环指令不影响循环指令不影响ZFZFloope againloope again;CX0;CX0且且ZF=1ZF=

27、1(测试位为(测试位为0 0),继续循环),继续循环je notfoundje notfoundmov byteY,dlmov byteY,dljmp donejmp donenotfound:notfound: mov byteY,-1mov byteY,-1 ;ZF=1;ZF=1,1616个位均为个位均为0 0done:done:.exit 0.exit 0 计数控制循环计数控制循环 最大循环次数固最大循环次数固定,满足条件退出定,满足条件退出.mov bx,offset stringmov bx,offset stringagain:again: mov al,bxmov al,bx ;

28、 ;取一个字符取一个字符or al,alor al,al; ;是否为结尾符是否为结尾符0 0jz donejz done; ;是,退出循环是,退出循环cmp al,Acmp al,A; ;是否为大写是否为大写A AZ Zjbjb next nextcmp al,Zcmp al,Zjaja next nextor al,20hor al,20h; ;是,转换为小写字母(使是,转换为小写字母(使D D5 5=1=1)mov bx,almov bx,al ; ;仍保存在原位置仍保存在原位置next:next:inc bxinc bxjmp againjmp again; ;继续循环继续循环done:

29、done:.exit 0.exit 0 条件控制循环条件控制循环 利用标志退出利用标志退出大小写字母仅大小写字母仅 D D5 5位位不同不同第4章.冒泡法“冒泡法冒泡法”是一种排序算法,不是最优的算是一种排序算法,不是最优的算法,但它易于理解和实现法,但它易于理解和实现冒泡法从第一个元素开始,依次对相邻的两冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比

30、较,得到次大外的元素依上述方法再进行比较,得到次大的元素排在后面;如此重复,直至完成就实的元素排在后面;如此重复,直至完成就实现元素从小到大的排序现元素从小到大的排序这需要一个双重循环程序结构这需要一个双重循环程序结构图示图示.冒泡法的排序过程序号序号 数数比 较 遍 数1234 1 32 2 85 3 16 4 15 5 8321615885161583285158163285815163285第4章.movmov cxcx,count,count;CX;CX数组元素个数数组元素个数dec cxdec cx; ;元素个数减元素个数减1 1为外循环次数为外循环次数outlp:outlp:mov

31、mov dxdx,cx,cx;DX;DX内循环次数内循环次数mov bx,offset arraymov bx,offset arrayinlp:inlp: mov al,bxmov al,bx; ;取前一个元素取前一个元素cmp al,bx+1cmp al,bx+1 ; ;与后一个元素比较与后一个元素比较jna nextjna next; ;前一个不大于后一个元素,则不进行交换前一个不大于后一个元素,则不进行交换xchg al,bx+1xchg al,bx+1; ;否则,进行交换否则,进行交换mov bx,almov bx,alnext:next: inc bxinc bx; ;下一对元素下

32、一对元素dec dxdec dxjnz inlpjnz inlp; ;内循环尾内循环尾loop outlploop outlp; ;外循环尾外循环尾 计数控制双重循环计数控制双重循环.; ;现有一个以现有一个以$ $结尾的字符串,要求剔除其中的空格结尾的字符串,要求剔除其中的空格.data.datastringstringdb Let us have a try !,$db Let us have a try !,$.code.code.startup.startupmov si,offset stringmov si,offset stringoutlp:outlp:cmp byte ptr

33、 di,$cmp byte ptr di,$; ;外循环,先判断后循环外循环,先判断后循环jz donejz done; ;为为$ $结束结束cmp byte ptr si, cmp byte ptr si, ; ;检测是否是空格检测是否是空格jnz nextjnz next; ;不是空格继续循环不是空格继续循环.mov di,simov di,si; ;是空格,进入剔除空格分支是空格,进入剔除空格分支; ;该分支是循环程序段该分支是循环程序段inlp:inlp:inc diinc dimov al,dimov al,di ; ;前移一个位置前移一个位置mov di-1,almov di-1,

34、alcmp byte ptr di,$cmp byte ptr di,$; ;内循环,先循环后判断内循环,先循环后判断jnz inlpjnz inlpjmp outlpjmp outlpnext:next:inc siinc si; ;继续对后续字符进行处理继续对后续字符进行处理jmp outlpjmp outlpdone:done:.exit 0.exit 0; ;结束结束 条件控制双重循环条件控制双重循环第4章.4.4 子程序设计把功能相对独立的程序段单独编写和把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程调试,作为一个相对独立的模块供程序使用,就形成子程序序使用,就形成

35、子程序子程序可以实现源程序的模块化,可子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率简化源程序结构,可以提高编程效率子程序设计要利用过程定义伪指令参数传递是子程序设计的重点和难点子程序可以嵌套;一定条件下,还可以递归和重入.4.4.1 4.4.1 程序定义伪指令程序定义伪指令过程名过程名 procproc near|far near|far.过程名过程名 endpendp过程名过程名(子程序名)为符合语法的标识符(子程序名)为符合语法的标识符nNEARNEAR属性(段内近调用)的过程只能被相同代码段的其属性(段内近调用)的过程只能被相同代码段的其他程序调用他程序调用nFARF

36、AR属性(段间远调用)的过程可以被相同或不同代码属性(段间远调用)的过程可以被相同或不同代码段的程序调用段的程序调用对简化段定义格式,在微型、小型和紧凑存储模对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为式下,过程的缺省属性为nearnear;在中型、大型和;在中型、大型和巨型存储模式下,过程的缺省属性为巨型存储模式下,过程的缺省属性为farfar对完整段定义格式,过程的缺省属性为对完整段定义格式,过程的缺省属性为nearnear用户可以在过程定义时用用户可以在过程定义时用nearnear或或farfar改变缺省属性改变缺省属性.子程序的常见格式subname proc ;具

37、有缺省属性的具有缺省属性的subname过程过程push ax;保护寄存器保护寄存器:顺序压入堆栈:顺序压入堆栈push bx;ax/bx/cx仅是示例仅是示例push cx;过程体过程体pop cx;恢复寄存器恢复寄存器:逆序弹出堆栈:逆序弹出堆栈pop bxpop axret;过程返回过程返回subname endp;过程结束过程结束第4章.; ;子程序功能:实现光标回车换行子程序功能:实现光标回车换行dpcrlfdpcrlfprocproc; ;过程开始过程开始push axpush ax; ;保护寄存器保护寄存器AXAX和和DXDXpush dxpush dxmov dl,mov dl

38、,0dh0dh; ;显示回车显示回车mov ah,2mov ah,2int 21hint 21hmov dl,mov dl,0ah0ah; ;显示换行显示换行mov ah,2mov ah,2int 21hint 21hpop dxpop dx; ;恢复寄存器恢复寄存器DXDX和和AXAXpop axpop axretret; ;子程序返回子程序返回dpcrlfdpcrlfendpendp; ;过程结束过程结束.ALdispALdispprocproc; ;实现实现alal内容的显示内容的显示push axpush ax; ;过程中使用了过程中使用了AXAX、CXCX和和DXDXpush cxp

39、ush cxpush dxpush dxpush axpush ax; ;暂存暂存axaxmov dl,almov dl,al; ;转换转换alal的高的高4 4位位mov cl,4mov cl,4shr dl,clshr dl,clor dl,30hor dl,30h;al;al高高4 4位变成位变成3 3cmp dl,39hcmp dl,39hjbe aldisp1jbe aldisp1add dl,7add dl,7; ;是是0Ah0Ah0Fh0Fh,还要加上,还要加上7 7aldisp1:aldisp1: mov ah,2mov ah,2; ;显示显示int 21hint 21h.po

40、p dxpop dx; ;恢复原恢复原axax值到值到dxdxand dl,0fhand dl,0fh; ;转换转换alal的低的低4 4位位or dl,30hor dl,30hcmp dl,39hcmp dl,39hjbe aldisp2jbe aldisp2add dl,7add dl,7aldisp2:aldisp2: mov ah,2mov ah,2; ;显示显示int 21hint 21hpop dxpop dxpop cxpop cxpop axpop axretret; ;过程返回过程返回ALdispALdispendpendp.; ;主程序,同例主程序,同例4.84.8源程序源

41、程序mov bx,offset arraymov bx,offset array; ;调用程序段开始调用程序段开始mov cx,countmov cx,countdisplp:displp: mov al,bxmov al,bxcall ALdispcall ALdisp; ;调用显示过程调用显示过程mov dl,mov dl,; ;显示一个逗号,分隔数据显示一个逗号,分隔数据mov ah,2mov ah,2int 21hint 21hinc bxinc bxloop displploop displp; ;调用程序段结束调用程序段结束.exit 0.exit 0.; ;过程定义过程定义end

42、end.HTOASCHTOASCprocproc; ;将将ALAL低低4 4位表达的一位位表达的一位1616进制数转换为进制数转换为ASCIIASCII码码and al,0fhand al,0fhcmp al,9cmp al,9jbe htoasc1jbe htoasc1add al,37hadd al,37h; ;是是0AH0AH0FH0FH,加,加37H37Hretret; ;子程序返回子程序返回htoasc1:htoasc1: add al,30hadd al,30h; ;是是0 09 9,加,加30H30Hretret; ;子程序返回子程序返回HTOASCHTOASCendpendp第

43、4章.4.4.2 子程序的参数传递入口参数入口参数(输入参数):主程序提供(输入参数):主程序提供给子程序给子程序出口参数出口参数(输出参数):子程序返回(输出参数):子程序返回给主程序给主程序参数的形式:参数的形式: 数据本身(传值)数据本身(传值) 数据的地址(传址)数据的地址(传址)传递的方法:传递的方法: 寄存器寄存器 变量变量 堆栈堆栈第4章.例4.11 求校验和子程序计算数组元素的子程序计算数组元素的“校验和校验和”校验和是指不记进位的累加校验和是指不记进位的累加入口参数入口参数:数组的逻辑地址(传址)数组的逻辑地址(传址)元素个数(传值)元素个数(传值)出口参数出口参数:求和结果

44、(传值)求和结果(传值).把参数存于约定的寄存器中,可以传把参数存于约定的寄存器中,可以传值,也可以传址。值,也可以传址。子程序对带有出口参数的寄存器不能子程序对带有出口参数的寄存器不能保护和恢复(主程序视具体情况进行保护和恢复(主程序视具体情况进行保护)保护)子程序对带有入口参数的寄存器可以子程序对带有入口参数的寄存器可以保护,也可以不保护;但最好一致保护,也可以不保护;但最好一致入口参数:入口参数:CX元素个数,元素个数,DS:BX数组的段地址:偏移地址数组的段地址:偏移地址出口参数:出口参数:AL校验和校验和用寄存器传递参数.startup.startup; ;设置入口参数(含有设置入口

45、参数(含有DSDS数组的段地址)数组的段地址)mov mov bxbx,offset array,offset array;BX;BX数组的偏移地址数组的偏移地址mov mov cxcx,count,count;CX;CX数组的元素个数数组的元素个数call checksumacall checksuma ; ;调用求和过程调用求和过程mov result,mov result,alal; ;处理出口参数处理出口参数.exit 0.exit 0.checksumachecksumaprocprocxor al,alxor al,al; ;累加器清累加器清0 0suma:suma:add add

46、 alal, ,bxbx ; ;求和求和inc bxinc bx; ;指向下一个字节指向下一个字节looploop suma sumaretretchecksumachecksumaendpendpendend.主程序和子程序直接采用同一个变量主程序和子程序直接采用同一个变量名共享同一个变量,实现参数的传递名共享同一个变量,实现参数的传递不通模块间共享时,需要声明不通模块间共享时,需要声明入口参数:入口参数:count元素个数,元素个数,array数组名(含段地址:偏移地址)数组名(含段地址:偏移地址)出口参数:出口参数:result校验和校验和用变量传递参数.; ;主程序主程序 call c

47、hecksumbcall checksumb; ;子程序子程序checksumbchecksumb procprocpush axpush axpush bxpush bxpush cxpush cxxor al,alxor al,al; ;累加器清累加器清0 0mov bx,offsetmov bx,offset array array;BX;BX数组的偏移地址数组的偏移地址mov cx,mov cx,countcount;CX;CX数组的元素个数数组的元素个数.sumb:sumb:add al,bxadd al,bx ; ;求和求和inc bxinc bxloop sumbloop sum

48、bmov mov resultresult,al,al; ;保存校验和保存校验和pop cxpop cxpop bxpop bxpop axpop axretretchecksumbchecksumbendpendp.主程序将子程序的入口参数压入堆栈,主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数子程序从堆栈中取出参数子程序将出口参数压入堆栈,主程序子程序将出口参数压入堆栈,主程序弹出堆栈取得它们弹出堆栈取得它们入口参数:入口参数:顺序压入偏移地址和元素个数顺序压入偏移地址和元素个数出口参数:出口参数:AL校验和校验和用堆栈传递参数.startup.startupmov ax,off

49、set arraymov ax,offset arraypush axpush axmov ax,countmov ax,countpush axpush axcall checksumccall checksumcadd sp,4add sp,4mov result,almov result,al.exit 0.exit 0图示图示 要注意堆栈的分配情况,保证参数存取正要注意堆栈的分配情况,保证参数存取正确、子程序正确返回,并保持堆栈平衡确、子程序正确返回,并保持堆栈平衡.checksumcchecksumcprocprocpush bppush bpmov bp,spmov bp,sp;

50、;利用利用BPBP间接寻址存取参数间接寻址存取参数push bxpush bxpush cxpush cxmov bx,bp+6mov bx,bp+6 ;SS:BP+6;SS:BP+6指向偏移地址指向偏移地址mov cx,bp+4mov cx,bp+4 ;SS:BP+6;SS:BP+6指向元素个数指向元素个数xor al,alxor al,alsumc:sumc:add add alal,bx ,bx inc bxinc bxloop sumcloop sumcpop cxpop cxpop bxpop bxpop bppop bpretretchecksumcchecksumcendpend

51、p图示图示第4章.堆栈区及参数 主程序实现平衡堆栈:主程序实现平衡堆栈: add sp,n 子程序实现平衡堆栈:子程序实现平衡堆栈: ret n第4章.子程序的嵌套子程序内包含有子程序子程序内包含有子程序的调用就是子程序嵌套的调用就是子程序嵌套没有什么特殊要求没有什么特殊要求.ALdispALdispprocprocpush axpush axpush cxpush cx; ;实现实现alal内容的显示内容的显示push axpush ax; ;暂存暂存axaxmov cl,4mov cl,4shr al,clshr al,cl; ;转换转换alal的高的高4 4位位call htoascca

52、ll htoasc ; ;子程序调用(嵌套)子程序调用(嵌套)pop axpop ax; ;转换转换alal的低的低4 4位位call htoasccall htoasc ; ;子程序调用(嵌套)子程序调用(嵌套)pop cxpop cxpop axpop axretretALdispALdispendpendp.; ;将将ALAL低低4 4位表达的一位位表达的一位1616进制数转换为进制数转换为ASCIIASCII码码HTOASCHTOASC procprocpush axpush axpush bxpush bxpush dxpush dxmov bx,offset ASCIImov bx

53、,offset ASCII;BX;BX指向指向ASCIIASCII码表码表and al,0fhand al,0fh; ;取得一位取得一位1616进制数进制数xlat CS:ASCIIxlat CS:ASCII; ;换码:换码:ALCS:BXALCS:BXALAL,注意数据在代码段,注意数据在代码段CSCS.mov dl,almov dl,al; ;显示显示mov ah,2mov ah,2int 21hint 21hpop dxpop dxpop bxpop bxpop axpop axretret; ;子程序返回子程序返回; ;子程序的数据区子程序的数据区ASCIIASCIIdb 30h,31

54、h,32h,33h,34h,35h,36h,37hdb 30h,31h,32h,33h,34h,35h,36h,37hdb 38h,39h,41h,42h,43h,44h,45h,46hdb 38h,39h,41h,42h,43h,44h,45h,46hHTOASCHTOASC endpendp这是一个具有局部变量的子程序。因为数据区这是一个具有局部变量的子程序。因为数据区与子程序都在代码段,所以利用了换码指令与子程序都在代码段,所以利用了换码指令XLATXLAT的另一种助记格式(写出指向缓冲区的变的另一种助记格式(写出指向缓冲区的变量名,目的是便于指明段超越前缀)。串操作量名,目的是便于指明

55、段超越前缀)。串操作MOVSMOVS、LODSLODS和和CMPSCMPS指令也可以这样使用,以便指令也可以这样使用,以便使用段超越前缀使用段超越前缀 除采用段超越方法外,子程序与主程序的数除采用段超越方法外,子程序与主程序的数据段不同时,我们还可以通过修改据段不同时,我们还可以通过修改DSDS值实现数值实现数据存取;但需要保护和恢复据存取;但需要保护和恢复DSDS寄存器寄存器第4章.子程序的递归当子程序直接或间接地嵌套调用自身当子程序直接或间接地嵌套调用自身时称为递归调用,含有递归调用的子时称为递归调用,含有递归调用的子程序称为递归子程序程序称为递归子程序递归子程序必须采用寄存器或堆栈传递归

56、子程序必须采用寄存器或堆栈传递参数,递归深度受堆栈空间的限制递参数,递归深度受堆栈空间的限制例例4.12:求阶乘:求阶乘010)!1(!NNNNN.model small.model small.stack 256.stack 256.data.dataN Ndw 3dw 3resultresultdw ?dw ?.code.code.startup.startupmov bx,Nmov bx,Npush bxpush bx; ;入口参数:入口参数:N Ncall factcall fact; ;调用递归子程序调用递归子程序pop resultpop result; ;出口参数:出口参数:N

57、N!.exit 0.exit 0图示图示.; ;计算计算N!N!的近过程的近过程; ;入口参数:压入入口参数:压入 N N; ;出口参数:弹出出口参数:弹出 N!N!fact fact procprocpush axpush axpush bppush bpmov bp,spmov bp,spmov ax,bp+6 mov ax,bp+6 ; ;取入口参数取入口参数 N Ncmp ax,0cmp ax,0jne fact1jne fact1;N;N0,N!0,N!N N(N-1)!(N-1)!inc axinc ax;N;N0,N!0,N!1 1jmp fact2jmp fact2图示图示.f

58、act1:fact1:dec axdec ax;N-1;N-1push axpush axcall factcall fact; ;调用递归子程序求调用递归子程序求(N-1)!(N-1)!pop axpop axmul word ptr bp+6mul word ptr bp+6; ;求求 N N(N-1)!(N-1)!fact2:fact2:mov bp+6,axmov bp+6,ax; ;存入出口参数存入出口参数 N!N!pop bppop bppop axpop axretretfactfactendpendp图示图示.递归子程序调用时调用时进栈进栈返回时返回时出栈出栈13!2!1!第4

59、章.子程序的重入子程序的重入是指子程序被中断后又被中断子程序的重入是指子程序被中断后又被中断服务程序所调用,能够重入的子程序称为可服务程序所调用,能够重入的子程序称为可重入子程序。在子程序中,注意利用寄存器重入子程序。在子程序中,注意利用寄存器和堆栈传递参数和存放临时数据,而不要使和堆栈传递参数和存放临时数据,而不要使用固定的存储单元(变量),就能够实现重用固定的存储单元(变量),就能够实现重入。入。子程序的重入不同于子程序的递归。重入是子程序的重入不同于子程序的递归。重入是被动地进入,而递归是主动地进入;重入的被动地进入,而递归是主动地进入;重入的调用间往往没有关系,而递归的调用间却是调用间

60、往往没有关系,而递归的调用间却是密切相关的。递归子程序也是可重入子程序。密切相关的。递归子程序也是可重入子程序。第4章.例题4.13:从键盘输入有符号十进制数子程序从键盘输入一个有符号十进制子程序从键盘输入一个有符号十进制数;子程序还包含将数;子程序还包含将ASCII码转换为码转换为二进制数的过程二进制数的过程输入时,负数用输入时,负数用“”引导,正数直引导,正数直接输入或用接输入或用“”引导引导子程序用子程序用寄存器传递出口参数寄存器传递出口参数,主程,主程序调用该子程序输入序调用该子程序输入10个数据个数据转换算法.data.datacountcount= 10= 10arrayarray

温馨提示

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

评论

0/150

提交评论