汇编语言ppt课件_第1页
汇编语言ppt课件_第2页
汇编语言ppt课件_第3页
汇编语言ppt课件_第4页
汇编语言ppt课件_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

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

2、w 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.dataqvarqvardq 1234567887654321hdq 1234567887654321h.code.codemov al,byte ptr qvar6mov al,byte ptr qvar6mov byte ptr qvar7,almov byte ptr qvar7,

3、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 qvar2

4、mov 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 byte ptr qvar0,0mov byte ptr qvar0,01212 3434 5656 7878 8787 6565 4343 2121h h3434 565

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

6、 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 nonnegjns non

9、neg; ;分支条件:分支条件: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; ;条件满足条件满足Good Bad

10、;将;将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,mov dl,0 0;CF;CF0 0,即最高位为,即最高位为0 0,DLDL0 0jmp twojmp two; ;一定要跳过另一个分支体一定要跳过另一个分支体one:one:mov dl,mov dl,

12、1 1;DL;DL1 1two:two:mov ah,2mov ah,2int 21hint 21h; ;显示显示对比对比 双分支程序改为单分支程序双分支程序改为单分支程序shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjnc onejnc one;CF;CF0 0,即最高位为,即最高位为0 0,转移,转移mov dl,mov dl,1 1;CF;CF1 1,即最高位为,即最高位为1 1,DLDL1 1jmp twojmp two; ;一定要跳过另一个分支体一定要跳过另一个分支体one:one:mov dl,mov dl,0 0 ;DL;DL0 0two:two:mov

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

14、rtup.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 donejmp done;跳过第

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

16、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,0cmp ah,0 jz functio

17、n0 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=1fuction1YNAH=2fuction2Y

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

19、g1db 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,$tabletabledw disp1,disp2,disp3,disp4dw disp1,disp2,disp3,disp4dw disp5,disp6,disp7,disp8dw disp5,disp6,disp7,disp8; ;取得各个标号

20、的偏移地址取得各个标号的偏移地址此处等同于此处等同于 offset disp1start1: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码转换成数字码转换成数字dec axdec axshl ax,1shl ax,1

21、; ;等效于等效于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对应修改为对应修改为 ret第4章4.3 循环程序设计循环结

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

23、del small.model small.stack.stack.data.datasumsumdw ?dw ?.code.code.startup.startupxor ax,axxor ax,ax; ;被加数被加数AXAX清清0 0mov cx,100mov cx,100again:again:add ax,cxadd ax,cx; ;从从100,99,.,2,1100,99,.,2,1倒序累加倒序累加loop againloop againmov sum,axmov sum,ax; ;将累加和送入指定单元将累加和送入指定单元.exit 0.exit 0endend 计数控制循环计数控制

24、循环 循环次数固定循环次数固定; ;用二进制显示从键盘输入的一个字符的用二进制显示从键盘输入的一个字符的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,:; ;显示一个分号,用于分隔显示一个分号,用于分隔int 21hint 21hmov cx,8mov cx

25、,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 1,如果,如果CXCX未减至未减至0 0,则循环,则循环 计数控制循环计

26、数控制循环 循环次数固定循环次数固定.startup.startupmov ax,wordXmov ax,wordX; ;测试目标送测试目标送AXAXmov cx,16mov cx,16; ;循环计数器置初值循环计数器置初值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=1(测试位为(测试位为0 0),继续循环),继续循环je notfound

27、je 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; ;取一个字符取一个字符or al,alor al,al; ;是否为结尾符是否为结尾

28、符0 0jz donejz done; ;是,退出循环是,退出循环cmp al,Acmp al,A; ;是否为大写是否为大写A AZ Zjb nextjb nextcmp al,Zcmp al,Zja nextja nextor al,20hor al,20h; ;是,转换为小写字母(使是,转换为小写字母(使D5=1D5=1)mov bx,almov bx,al; ;仍保存在原位置仍保存在原位置next:next:inc bxinc bxjmp againjmp again; ;继续循环继续循环done:done:.exit 0.exit 0 条件控制循环条件控制循环 利用标志退出利用标志退出

29、大小写字母仅大小写字母仅 D5D5位不同位不同第4章冒泡法“冒泡法冒泡法”是一种排序算法,不是最优的算法,但它易于理解和实现是一种排序算法,不是最优的算法,但它易于理解和实现冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次大的元素排在除掉最后一个元素之外的元素依上述方法再进行比较,得到次大的元素排在后面;如此重复,直至完成就

30、实现元素从小到大的排序后面;如此重复,直至完成就实现元素从小到大的排序这需要一个双重循环程序结构这需要一个双重循环程序结构图示图示冒泡法的排序过程序号序号 数数比 较 遍 数1234 1 32 2 85 3 16 4 15 5 8321615885161583285158163285815163285第4章mov cx,countmov cx,count;CX;CX数组元素个数数组元素个数dec cxdec cx; ;元素个数减元素个数减1 1为外循环次数为外循环次数outlp:outlp:mov dx,cxmov dx,cx;DX;DX内循环次数内循环次数mov bx,offset arra

31、ymov 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; ;下一对元素下一对元素dec dxdec dxjnz inlpjnz inlp; ;内循环尾内循环尾loop out

32、lploop outlp; ;外循环尾外循环尾 计数控制双重循环计数控制双重循环; ;现有一个以现有一个以$ $结尾的字符串,要求剔除其中的空格结尾的字符串,要求剔除其中的空格.data.datastringstringdb db Let us have a try !Let us have a try !, ,$ $.code.code.startup.startupmov si,offset stringmov si,offset stringoutlp:outlp:cmp byte ptr di,cmp byte ptr di,$ $; ;外循环,先判断后循环外循环,先判断后循环jz d

33、onejz 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,alcmp byte ptr di,cmp byte ptr di,$ $; ;内循环,先循环后判断内循

34、环,先循环后判断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 程序定义伪指令程序定义伪指令过程名过程名proc near|farproc near|far.过程名过程名endpendp过程名(子程序名)为符合语法的标识符过程名(子程序名)为符合语法的标识符nNEARNEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用属性(段内近调用)的过程只能被相同代码段的其他程序调用nFARFAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用属性(段间远调用)的过程可以被相同或不同代码段的程

36、序调用对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为nearnear;在中型、;在中型、大型和巨型存储模式下,过程的缺省属性为大型和巨型存储模式下,过程的缺省属性为farfar对完整段定义格式,过程的缺省属性为对完整段定义格式,过程的缺省属性为nearnear用户可以在过程定义时用用户可以在过程定义时用nearnear或或farfar改变缺省属性改变缺省属性第4章也可用简化子程序定义方式主程序主程序 CALL PROGPROG: 子程序内容在此!子程序内容在此! RET不需要不需要PROC /ENDP不建议采用这

37、种方式!结构不好不建议采用这种方式!结构不好第4章Proto/invoke模式用于更高版本的用于更高版本的MASM中。中。主要用于多参数的调用情况下,特别适合于主要用于多参数的调用情况下,特别适合于Windows下汇编语言的编程下汇编语言的编程到到Windows编程时再讲编程时再讲子程序的常见格式subnameproc;具有缺省属性的具有缺省属性的subname过程过程push ax;保护寄存器:顺序压入堆栈保护寄存器:顺序压入堆栈push bx;ax/bx/cx仅是示例仅是示例push cx;过程体过程体pop cx;恢复寄存器:逆序弹出堆栈恢复寄存器:逆序弹出堆栈pop bxpop axr

38、et;过程返回过程返回subnameendp;过程结束过程结束第4章; ;子程序功能:实现光标回车换行子程序功能:实现光标回车换行crlfcrlfprocproc; ;过程开始过程开始push axpush ax; ;保护寄存器保护寄存器AXAX和和DXDXpush dxpush dxmov dl,0dhmov dl,0dh; ;显示回车显示回车mov ah,2mov ah,2int 21hint 21hmov dl,0ahmov dl,0ah; ;显示换行显示换行mov ah,2mov ah,2int 21hint 21hpop dxpop dx; ;恢复寄存器恢复寄存器DXDX和和AXAX

39、pop axpop axretret; ;子程序返回子程序返回crlfcrlfendpendp; ;过程结束过程结束ALdispALdispprocproc; ;实现实现alal内容的显示内容的显示push axpush ax; ;过程中使用了过程中使用了AXAX、CXCX和和DXDXpush cxpush 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位变成

40、位变成3 3cmp dl,39hcmp dl,39hjbe aldisp1jbe aldisp1add dl,7add dl,7; ;是是0Ah0Ah0Fh0Fh,还要加上,还要加上7 7aldisp1:aldisp1:mov ah,2mov ah,2; ;显示显示int 21hint 21hpop 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,7aldi

41、sp2:aldisp2:mov ah,2mov ah,2; ;显示显示int 21hint 21hpop dxpop dxpop cxpop cxpop axpop axretret; ;过程返回过程返回ALdispALdispendpendp.; ;主程序,同例主程序,同例4.84.8源程序源程序mov bx,offset array;mov bx,offset array;调用程序段开始调用程序段开始mov cx,countmov cx,countdisplp:displp:mov al,bxmov al,bxcall ALdispcall ALdisp; ;调用显示过程调用显示过程mov

42、 dl,mov dl,; ;显示一个逗号,分隔数据显示一个逗号,分隔数据mov ah,2mov ah,2int 21hint 21hinc bxinc bxloop displploop displp; ;调用程序段结束调用程序段结束.exit 0.exit 0.; ;过程定义过程定义endendHTOASCHTOASCprocproc; ;将将ALAL低低4 4位表达的一位位表达的一位1616进制数转换为进制数转换为ASCIIASCII码码and al,0fhand al,0fhcmp al,9cmp al,9jbe htoasc1jbe htoasc1add al,37hadd al,37

43、h; ;是是0AH0AH0FH0FH,加,加37H37Hretret; ;子程序返回子程序返回htoasc1:htoasc1:add al,30hadd al,30h; ;是是0 09 9,加,加30H30Hretret; ;子程序返回子程序返回HTOASCHTOASCendpendp第4章4.4.2 子程序的参数传递入口参数(输入参数):主程序提供给子程序入口参数(输入参数):主程序提供给子程序出口参数(输出参数):子程序返回给主程序出口参数(输出参数):子程序返回给主程序参数的形式:参数的形式: 数据本身(传值)数据本身(传值) 数据的地址(传址)数据的地址(传址)传递的方法:传递的方法:

44、 寄存器寄存器 变量变量 堆栈堆栈第4章例4.11 求校验和子程序计算数组元素的子程序计算数组元素的“校验和校验和”校验和是指不记进位的累加校验和是指不记进位的累加入口参数:入口参数:数组的逻辑地址(传址)数组的逻辑地址(传址)元素个数(传值)元素个数(传值)出口参数:出口参数:求和结果(传值)求和结果(传值)把参数存于约定的寄存器中,可以传值,也可以传址。把参数存于约定的寄存器中,可以传值,也可以传址。子程序对带有出口参数的寄存器不能保护和恢复(主程序视具体情况进行子程序对带有出口参数的寄存器不能保护和恢复(主程序视具体情况进行保护)保护)子程序对带有入口参数的寄存器可以保护,也可以不保护;

45、但最好一致子程序对带有入口参数的寄存器可以保护,也可以不保护;但最好一致入口参数:入口参数:CX元素个数,元素个数,DS:BX数组的段地址:偏移地址数组的段地址:偏移地址出口参数:出口参数:AL校验和校验和用寄存器传递参数.startup.startup; ;设置入口参数(含有设置入口参数(含有DSDS数组的段地址)数组的段地址)mov bx,offset arraymov bx,offset array;BX;BX数组的偏移地址数组的偏移地址mov cx,countmov cx,count;CX;CX数组的元素个数数组的元素个数call checksumacall checksuma; ;调

46、用求和过程调用求和过程mov result,almov result,al; ;处理出口参数处理出口参数.exit 0.exit 0checksumachecksumaprocprocpush bxpush bxPush cxPush cxxor al,alxor al,al; ;累加器清累加器清0 0suma:suma:add al,bxadd al,bx; ;求和求和inc bxinc bx; ;指向下一个字节指向下一个字节loop sumaloop sumapop cxpop cxPop bxPop bxretretchecksumachecksumaendpendpendend主程序和

47、子程序直接采用同一个变量名共享同一个变量,实现参数的传递主程序和子程序直接采用同一个变量名共享同一个变量,实现参数的传递不通模块间共享时,需要声明不通模块间共享时,需要声明入口参数:入口参数:count元素个数,元素个数,array数组名(含段地址:偏移地址)数组名(含段地址:偏移地址)出口参数:出口参数:result校验和校验和用变量传递参数; ;主程序主程序 call checksumbcall checksumb; ;子程序子程序checksumbchecksumbprocprocpush axpush axpush bxpush bxpush cxpush cxxor al,alxor

48、 al,al; ;累加器清累加器清0 0mov bx,offset arraymov bx,offset array;BX;BX数组的偏移地址数组的偏移地址mov cx,countmov cx,count;CX;CX数组的元素个数数组的元素个数sumb:sumb:add al,bxadd al,bx; ;求和求和inc bxinc bxloop sumbloop sumbmov result,almov result,al; ;保存校验和保存校验和pop cxpop cxpop bxpop bxpop axpop axretretchecksumbchecksumbendpendp主程序将子程

49、序的入口参数压入堆栈,子程序从堆栈中取出参数主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数子程序将出口参数压入堆栈,主程序弹出堆栈取得它们子程序将出口参数压入堆栈,主程序弹出堆栈取得它们入口参数:入口参数:顺序压入偏移地址和元素个数顺序压入偏移地址和元素个数出口参数:出口参数:AL校验和校验和用堆栈传递参数.startup.startupmov ax,offset arraymov ax,offset arraypush axpush axmov ax,countmov ax,countpush axpush axcall far checksumccall far checksum

50、cadd sp,4add sp,4mov result,almov result,al.exit 0.exit 0图示图示 要注意堆栈的分配情况,保证参数存取正确、子程序正确返回,并保持堆栈平衡要注意堆栈的分配情况,保证参数存取正确、子程序正确返回,并保持堆栈平衡checksumcchecksumcproc farproc farpush bppush bpmov bp,spmov bp,sp; ;利用利用BPBP间接寻址存取参数间接寻址存取参数push bxpush bxpush cxpush cxmov bx,bp+6 mov bx,bp+6 ;SS:BP+6;SS:BP+6指向偏移地址指

51、向偏移地址mov cx,bp+4 mov cx,bp+4 ;SS:BP+6;SS:BP+6指向元素个数指向元素个数xor al,alxor al,alsumc:sumc:add al,bx add al,bx inc bxinc bxloop sumcloop sumcpop cxpop cxpop bxpop bxpop bppop bpretretchecksumcchecksumcendpendp图示图示第4章堆栈区及参数 主程序实现平衡堆栈:主程序实现平衡堆栈: add sp,n 子程序实现平衡堆栈:子程序实现平衡堆栈: ret n第4章子程序的嵌套子程序内包含有子程序子程序内包含有子

52、程序的调用就是子程序嵌套的调用就是子程序嵌套没有什么特殊要求没有什么特殊要求ALdispALdispprocprocpush axpush axpush cxpush cx; ;实现实现alal内容的显示内容的显示push axpush ax; ;暂存暂存axaxmov cl,4mov cl,4shr al,clshr al,cl; ;转换转换alal的高的高4 4位位call htoasccall htoasc; ;子程序调用(嵌套)子程序调用(嵌套)pop axpop ax; ;转换转换alal的低的低4 4位位call htoasccall htoasc; ;子程序调用(嵌套)子程序调用

53、(嵌套)pop cxpop cxpop axpop axretretALdispALdispendpendp; ;将将ALAL低低4 4位表达的一位位表达的一位1616进制数转换为进制数转换为ASCIIASCII码码HTOASCHTOASCprocprocpush axpush axpush bxpush bxpush dxpush dxmov bx,offset ASCII;BXmov bx,offset ASCII;BX指向指向ASCIIASCII码表码表and al,0fhand al,0fh; ;取得一位取得一位1616进制数进制数xlat CS:ASCIIxlat CS:ASCII;

54、 ;换码:换码:ALCS:BXALCS:BXALAL,注意数据在代码段,注意数据在代码段CSCSmov dl,almov dl,al; ;显示显示mov ah,2mov ah,2int 21hint 21hpop dxpop dxpop bxpop bxpop axpop axretret; ;子程序返回子程序返回; ;子程序的数据区子程序的数据区ASCIIASCIIdb 30h,31h,32h,33h,34h,35h,36h,37hdb 30h,31h,32h,33h,34h,35h,36h,37hdb 38h,39h,41h,42h,43h,44h,45h,46hdb 38h,39h,41

55、h,42h,43h,44h,45h,46hHTOASCHTOASCendpendp这是一个具有局部变量的子程序。因为数据区与子程序都在代码段,所以利用了这是一个具有局部变量的子程序。因为数据区与子程序都在代码段,所以利用了换码指令换码指令XLATXLAT的另一种助记格式(写出指向缓冲区的变量名,目的是便于指明段超的另一种助记格式(写出指向缓冲区的变量名,目的是便于指明段超越前缀)。串操作越前缀)。串操作MOVSMOVS、LODSLODS和和CMPSCMPS指令也可以这样使用,以便使用段超越前缀指令也可以这样使用,以便使用段超越前缀 除采用段超越方法外,子程序与主程序的数据段不同时,我们还可以通

56、过修改除采用段超越方法外,子程序与主程序的数据段不同时,我们还可以通过修改DSDS值实现数据存取;但需要保护和恢复值实现数据存取;但需要保护和恢复DSDS寄存器寄存器第4章子程序的递归当子程序直接或间接地嵌套调用自身时称为递归调用,含有递归调用的子程当子程序直接或间接地嵌套调用自身时称为递归调用,含有递归调用的子程序称为递归子程序序称为递归子程序递归子程序必须采用寄存器或堆栈传递参数,递归深度受堆栈空间的限制递归子程序必须采用寄存器或堆栈传递参数,递归深度受堆栈空间的限制例例4.12:求阶乘:求阶乘010)!1(!NNNNN.model small.model small.stack 256.

57、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 N!.exit 0.exit 0图示图示; ;计算计算N!N!的近过程的近过程; ;入口参数:压入入口参数:压入 N N; ;出口参数:弹出出口参数:弹出 N!N!fact fact procprocpush axp

58、ush 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图示图示fact1:fact1:dec axdec ax;N-1;N-1push axpush axcall factcall fact; ;调用递归子程序求调用递归子程序求(N-1)!(N-1)!pop axpop axmul w

59、ord 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章子程序的重入子程序的重入是指子程序被中断后又被中断服务程序所调用,能够重入的子子程序的重入是指子程序被中断后又被中断服务程序所调用,能够重入的子程序称为可重入子程序。在子程序中,注意利用寄存器和堆栈传递参数和存程序称为可重

60、入子程序。在子程序中,注意利用寄存器和堆栈传递参数和存放临时数据,而不要使用固定的存储单元(变量),就能够实现重入。放临时数据,而不要使用固定的存储单元(变量),就能够实现重入。子程序的重入不同于子程序的递归。重入是被动地进入,而递归是主动地进子程序的重入不同于子程序的递归。重入是被动地进入,而递归是主动地进入;重入的调用间往往没有关系,而递归的调用间却是密切相关的。递归子入;重入的调用间往往没有关系,而递归的调用间却是密切相关的。递归子程序也是可重入子程序。程序也是可重入子程序。第4章例题4.13:从键盘输入有符号十进制数子程序从键盘输入一个有符号十进制数;子程序还包含将子程序从键盘输入一个

温馨提示

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

评论

0/150

提交评论