汇编语言程序设计第六章课件.ppt

上传人:qwe****56 文档编号:70014682 上传时间:2023-01-14 格式:PPT 页数:25 大小:216KB
返回 下载 相关 举报
汇编语言程序设计第六章课件.ppt_第1页
第1页 / 共25页
汇编语言程序设计第六章课件.ppt_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《汇编语言程序设计第六章课件.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计第六章课件.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

15、t push bx mov bx,offset sum push bx call far ptr proadd mov ax,4c00h int 21hmain endpcode1 ends14code2 segment assume cs:code2proaddproadd proc far proc far push push bpbp movmov bpbp,sp,sp push ax push cx push si push di mov si,bpbp+0ah mov di,bpbp+8 mov cx,di mov di,bpbp+6code2 ends end start xor

16、ax,axnext:add ax,si add si,2 loop next mov di,ax pop di pop si pop cx pop ax pop bp ret 6ret 6proaddproadd endpendp(ip)(cs)sumsumcountcountarrayarray (di)(si)(cx)(ax)(sp)(bpbp)(bp)(bpbp)+0ah(bpbp)+8(bpbp)+6tos15多个模块之间的参数传送:多个模块之间的参数传送:局部符号:局部符号:在本模块中定义,在本模块中引用的符号在本模块中定义,在本模块中引用的符号外部符号:外部符号:在某一模块中定义,

17、在另一模块中引用的符号在某一模块中定义,在另一模块中引用的符号 PUBLIC PUBLIC 符号符号 EXTRN EXTRN 符号符号:类型类型 extrnextrn proaddproadd:far:far code1 segmentcode1 segmentstart:start:call far call far ptrptr proaddproadd code1 endscode1 ends end start end start;proadd1.asmpublic public proaddproadd code2 segmentcode2 segmentproaddproadd p

18、roc far proc far ret retproaddproadd endpendpcode2 endscode2 ends end end ;proadd2.asm16例:例:;proadd1.asmextrnextrn proaddproadd:far:fardata segment common ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw?data endscode1 segment main proc far assume cs:code1,ds:datastart:mov ax,data mov ds,ax call far p

19、tr proadd mov ah,4ch int 21hmain endpcode1 ends end start17;proadd2.asmpublic public proaddproadddata segment common ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw?data ends code2 segment proadd proc far assume cs:code2,ds:data mov ax,data mov ds,ax push ax push cx push si lea si,ary mov cx,count xo

20、r ax,ax next:add ax,si add si,2 loop next mov sum,ax pop si pop cx pop ax retproadd endpcode2 ends end18子程序的嵌套:子程序的嵌套:主程序主程序 子程序子程序A A 子程序子程序B B递归子程序:递归子程序:n!n(n-1)(n-2)1 3!3 21=65.子程序的嵌套与递归调用子程序的嵌套与递归调用 call call proc_Aproc_Aproc_Aproc_A call call proc_Bproc_BCall Call proc_Aproc_Aretretproc_Bproc_

21、B retret19例:计算例:计算 n!frame frame strucstruc save_bpsave_bp dwdw?save_cs_ipsave_cs_ip dwdw 2 dup(?)2 dup(?)n n dwdw?result_addrresult_addr dwdw?frame endsframe ends;-data segmentdata segment n_v n_v dwdw 3 3 result result dwdw?data endsdata ends;-stack segmentstack segment dwdw 128 dup(?)128 dup(?)to

22、stos label word label wordstack endsstack endsmov ax,bp.nmov bx,bp.result_addr 0!=1 n!=n(n-1)!20code segmentcode segmentmain proc farmain proc far assume assume cs:codecs:code,ds:datads:data,ss:stackss:stackstart:start:movmov ax,stack ax,stack ;用户堆栈地址用户堆栈地址 movmov ssss,ax,ax movmov sp,offset sp,offs

23、et tostos push push dsds ;保存返回保存返回DOSDOS地址地址 sub ax,axsub ax,ax push ax push ax movmov ax,data ax,data ;数据段地址数据段地址 movmov dsds,ax,ax movmov bxbx,offset result ,offset result ;结构数据入栈结构数据入栈 push push bxbx movmov bxbx,n_v,n_v push push bxbx call far call far ptrptr fact fact ret retmain main endpendpco

24、de endscode ends21code1 segment assume cs:code1fact proc farfact proc far push bp mov bp,sp push bx push ax mov bx,bp.result_addr movmov ax,ax,bp.nbp.n cmpcmp ax,0 ax,0 jeje done done push bx dec ax push ax call far call far ptrptr fact fact movmov bxbx,bp.result_addrbp.result_addr movmov ax,ax,bxbx

25、 mulmul bp.nbp.n jmp short returndone:done:movmov ax,1 ax,1return:movmov bxbx,ax,ax pop ax pop bx pop bp ret 4fact fact endpendpcode1 ends (AX)(BX)(BP)CODE中的(IP)CODE中的(CS)3 3RESULT的地址第第1 1帧帧 (AX)(BX)(BP)CODE1中的(IP)CODE1中的(CS)2 2RESULT的地址第第2 2帧帧 (AX)(BX)(BP)CODE1中的(IP)CODE1中的(CS)1 1RESULT的地址第第3 3帧帧 (

26、AX)(BX)(BP)CODE1中的(IP)CODE1中的(CS)0 0RESULT的地址第第4 4帧帧00FA00FA00F200F200E400E400D600D600C800C8000000F200E400D622fact proc nearfact proc near push ax push ax push push bpbp movmov bpbp,sp,sp movmov ax,bp+6 ax,bp+6 cmpcmp ax,0 ax,0 jnejne fact1 fact1 inc ax inc ax jmpjmp exit exitfact1:fact1:decdec ax a

27、x push ax push ax call factcall fact pop axpop ax mulmul word ptrbp+6 word ptrbp+6exit:exit:movmov bp+6,ax bp+6,ax pop pop bpbp pop ax pop ax ret ret fact fact endpendp例:计算例:计算n!movmov bxbx,n_v,n_vpush push bxbxcall factcall factpop resultpop result主程序:主程序:(BP)(AX)(IP)0(BP)(AX)(IP)1(BP)(AX)(IP)2(BP)

28、(AX)(IP)323例:将字符串反序输出例:将字符串反序输出revers proc near push ax push bx push dx push bp mov bp,sp mov bx,bp+10 mov al,bx cmp al,$jne re_call jmp returnre_call:inc bx push bx call revers pop bx mov dl,bx mov ah,2 int 21hreturn:pop bp pop dx pop bx pop ax retrevers endpmov bx,offset strpush bxcall reverspop bxmov dl,bxmov ah,2int 21h主程序:主程序:str db happy!,$(bp)(bp)(dx)(bx)(ax)返址h的地址第1帧24第六章作业第六章作业Page 240 6.3 6.4 6.7 6.825

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁