汇编语言程序设计第六章课件.ppt
《汇编语言程序设计第六章课件.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计第六章课件.ppt(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 子程序结构子程序结构/即即c c中函数中函数 过程定义伪操作过程定义伪操作 子程序的调用与返回子程序的调用与返回 保存与恢复寄存器保存与恢复寄存器 子程序的参数传送子程序的参数传送 子程序的嵌套与递归子程序的嵌套与递归11.过程定义伪操作过程定义伪操作 过程名过程名 PROC PROC NEARNEAR (FARFAR )过程名过程名 ENDPENDP(1 1)NEARNEAR属性:调用程序和子程序在同一代码段中属性:调用程序和子程序在同一代码段中 (段内调用)(段内调用)(2 2)FARFAR属性:调用程序和子程序不在同一代码段中属性:调用程序和子程序不在同一代码段中 (段间调
2、用)(段间调用).2code segmentcode segment main proc farmain proc far call call subr1subr1 ret retmain main endpendpsubr1subr1 proc proc nearnear retretsubr1subr1 endpendpcode endscode endssegxsegx segment segmentsubtsubt proc proc farfar retretsubtsubt endpendp callcall subtsubt segxsegx ends endssegysegy
3、segment segment callcall far far ptrptr subtsubt segysegy ends ends3子程序调用:子程序调用:隐含使用堆栈保存返回地址隐含使用堆栈保存返回地址 callcall nearnear ptrptr subpsubp (1)保存返回地址保存返回地址 (2)转子程序转子程序 callcall farfar ptrptr subpsubp (1)保存返回地址保存返回地址 (2)转子程序转子程序子程序返回:子程序返回:retret2.子程序的调用与返回子程序的调用与返回(SP)(IP)(IP)(CS)(SP)43.保存与恢复寄存器保存与恢复
4、寄存器subtsubt proc far proc far push ax push ax push push bxbx push push cxcx push push dxdx pop pop dxdx pop pop cxcx pop pop bxbx pop ax pop ax ret retsubtsubt endpendp5(1)通过寄存器传送参数通过寄存器传送参数(2)通过存储器传送参数通过存储器传送参数(3)通过地址表传送参数地址通过地址表传送参数地址(4)通过堆栈传送参数或参数地址通过堆栈传送参数或参数地址(5)多个模块之间的参数传送多个模块之间的参数传送4.子程序的参数传送
5、子程序的参数传送6例:十六进制到十进制的转换(例:十六进制到十进制的转换(通过寄存器传送参数通过寄存器传送参数)hexidec segment ;1610 assume cs:hexidec main proc farstart:push ds sub ax,ax push axrepeat:call hexibin ;162 call crlf call binidec ;210 call crlf jmp repeat retmain endphexidec ends end start7hexibinhexibin proc near proc near movmov bxbx,0,0n
6、ewchar:mov ah,1 int 21h sub al,30h jl exit cmp al,10 jl add_to sub al,27h cmp al,0ah jl exit cmp al,10h jge exitadd_to:mov cl,4 shl bx,cl mov ah,0 add bxbx,ax jmp newchar exit:rethexibinhexibin endpendpbinidecbinidec proc near proc near mov cx,10000d call call dec_divdec_div mov cx,1000d call call d
7、ec_divdec_div mov cx,100d call call dec_divdec_div mov cx,10d call call dec_divdec_div mov cx,1d call call dec_divdec_div retbinidecbinidec endpendpdec_divdec_div proc near proc near movmov ax,ax,bxbx movmov dxdx,0,0 div div cxcx movmov bxbx,dxdx movmov dl,al dl,al add dl,30h add dl,30h movmov ah,2
8、ah,2 intint 21h 21h ret retdec_divdec_div endpendp 1 a b 5 31 61 62 358例:累加数组中的元素(例:累加数组中的元素(通过存储器传送参数通过存储器传送参数)data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw?data endscode segmentmain proc far assume cs:code,ds:data mov ax,data mov ds,ax call call proaddproadd mov ax,4c00h int 21hmain
9、endpcode ends end mainproaddproadd proc near proc near push ax push cx push si lea si,aryary mov cx,countcount xor ax,axnext:add ax,si add si,2 loop next mov sumsum,ax pop si pop cx pop ax retproaddproadd endpendp9如果数据段定义如下:如果数据段定义如下:data segmentdata segment aryary dwdw 1,2,3,4,5,6,7,8,9,10 1,2,3,4,
10、5,6,7,8,9,10 count count dwdw 10 10 sum sum dwdw?ary1 ary1 dwdw 10,20,30,40,50,60,70,80,90,100 10,20,30,40,50,60,70,80,90,100 count1 count1 dwdw 10 10 sum1 sum1 dwdw?data endsdata ends 如果直接访问内存变量,那么累加如果直接访问内存变量,那么累加数组数组aryary和和数组数组ary1ary1中的元素不能用同一个子程序中的元素不能用同一个子程序 proaddproadd。10例:累加数组中的元素(例:累加数组中的
11、元素(通过地址表传送参数地址通过地址表传送参数地址)data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw?table dw 3 dup(?)data endscode segmentmain proc far assume cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax mov table,offset ary mov table+2,offset count mov table+4,offset sum mov bx,offse
12、t table call proadd retmain endp 11proaddproadd proc near proc near push ax push cx push si push di mov si,bx mov di,bx+2 mov cx,di mov di,bx+4 xor ax,axnext:add ax,si add si,2 loop next mov di,ax pop di pop si pop cx pop ax retproaddproadd endpendpcode ends end main 30d 40d 50d 60d 70d 80d 90d100d
13、10d ary 20d 10dcountsumtable00000000001400140016001600180018000000000014001400160016(bxbx)(sisi)(didi)550d550d12例:累加数组中的元素(例:累加数组中的元素(通过堆栈传送参数地址通过堆栈传送参数地址)/好处好处不需借助变量不需借助变量data segmentdata segment aryary dwdw 10,20,30,40,50,60,70,80,90,100 10,20,30,40,50,60,70,80,90,100 count count dwdw 10 10 sum su
14、m dwdw?data endsdata endsstack segment stack segment dwdw 100 dup(?)100 dup(?)tostos label word label wordstack endsstack ends13code1 segmentmain proc far assume cs:code1,ds:data,ss:stackstart:mov ax,stack mov ss,ax mov sp,offset tos mov ax,data mov ds,ax mov bx,offset ary push bx mov bx,offset coun
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 第六 课件
限制150内