6@-第6章-子程序结构 汇编语言(清华)_第1页
6@-第6章-子程序结构 汇编语言(清华)_第2页
6@-第6章-子程序结构 汇编语言(清华)_第3页
6@-第6章-子程序结构 汇编语言(清华)_第4页
6@-第6章-子程序结构 汇编语言(清华)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第六章子程序结构汇编语言过程定义伪操作子程序的调用与返回保存与恢复寄存器子程序的参数传送子程序的嵌套与递归主要内容:汇编语言1.过程定义伪操作过程名PROCNEAR

(FAR

)

过程名ENDP(1)NEAR属性:调用程序和子程序在同一代码段中(段内调用)(2)FAR属性:调用程序和子程序不在同一代码段中(段间调用)...汇编语言codesegment

mainprocfar……

callsubr1……retmainendpsubr1procnear……

retsubr1

endpcodeends段内调用segxsegmentsubtprocfar……

retsubt

endp……

callsubt……segxendssegysegment……

callsubt……segyends段间调用汇编语言子程序调用:隐含使用堆栈保存返回地址

call

near

ptr

subp

(1)保存返回地址

(2)转子程序

call

far

ptr

subp

(1)保存返回地址

(2)转子程序子程序返回:ret2.子程序的调用与返回

(SP)→

(IP)(IP)(CS)(SP)→汇编语言3.保存与恢复寄存器subt

procfar

pushaxpushbxpushcxpushdx…………popdxpopcxpopbxpopaxretsubt

endp汇编语言(1)通过寄存器传送参数(2)通过存储器传送参数(3)通过地址表传送参数地址(4)通过堆栈传送参数或参数地址(5)多个模块之间的参数传送4.子程序的参数传送汇编语言例:十进制到十六进制的转换(通过寄存器传送参数)decihexsegment;1016assumecs:decihexmainprocfarpushdssubax,axpushaxrepeat:calldecibin

;102

callcrlf

;回车换行

callbinihex

;216

callcrlf

jmprepeatretmainendp………………;三个子程序decihexendsendmain汇编语言decibinprocnear

mov

bx,0newchar:movah,1

int21hsubal,30h

jlexit

cmpal,9

jgexit

cbw

xchgax,bx

mov

cx,10

mul

cx

xchgax,bxaddbx,ax

jmp

newcharexit:retdecibin

endpbinihexprocnear

mov

ch,4rotate:mov

cl,4

rol

bx,cl

moval,blandal,0fhaddal,30h

cmpal,3ah

jl

printitaddal,7printit:movdl,al

movah,2

int21h

dec

ch

jnzrotateretbinihex

endpcrlfprocnear

movdl,0dh

movah,2

int21h

movdl,0ah

movah,2

int21hretcrlf

endp汇编语言例:十六进制到十进制的转换(通过寄存器传送参数)hexidecsegment;1610assumecs:hexidec

mainprocfarstart:pushdssubax,axpushaxrepeat:callhexibin

;162

callcrlf

callbinidec

;210

callcrlf

jmprepeatretmainendp………………hexidecendsendstart汇编语言hexibinprocnear

mov

bx,0newchar:

movah,1

int21hsubal,30h

jlexit

cmpal,10

jladd_tosubal,27h

cmpal,0ah

jlexit

cmpal,10h

jgeexitadd_to:

mov

cl,4

shl

bx,cl

movah,0addbx,ax

jmp

newcharexit:rethexibin

endpbinidecprocnear

mov

cx,10000d

calldec_div

mov

cx,1000d

calldec_div

mov

cx,100d

calldec_div

mov

cx,10d

calldec_div

mov

cx,1d

calldec_div

retbinidec

endpdec_divprocnear

movax,bx

mov

dx,0divcx

mov

bx,dx

movdl,aladddl,30h

movah,2

int21hretdec_div

endp汇编语言例:累加数组中的元素(通过存储器传送参数)datasegment

ary

dw1,2,3,4,5,6,7,8,9,10countdw10sumdw?dataendscodesegmentmainprocfarassumecs:code,ds:datapushdssubax,axpushax

movax,data

mov

ds,ax

callproaddretmainendp……;proadd子程序codeendsendmainproaddprocnear

pushaxpushcxpushsileasi,ary

mov

cx,count

xorax,axnext:addax,[si]addsi,2loopnext

mov

sum,axpopsipopcxpopaxretproadd

endp汇编语言如果数据段定义如下:datasegment

ary

dw1,2,3,4,5,6,7,8,9,10countdw10sumdw?ary1dw10,20,30,40,50,60,70,80,90,100count1dw10sum1dw?dataends如果直接访问内存变量,那么累加数组ary和数组ary1中的元素不能用同一个子程序

proadd。汇编语言例:累加数组中的元素(通过地址表传送参数地址)datasegment

ary

dw1,2,3,4,5,6,7,8,9,10countdw10sumdw?

tabledw3dup(?)

;地址表dataendscodesegmentmainprocfarassumecs:code,ds:datapushdssubax,axpushax

movax,data

mov

ds,ax

movtable,offsetary

movtable+2,offsetcount

movtable+4,offsetsum

;建立地址表

mov

bx,offsettable

;地址表的地址->bx

callproaddretmainendp

汇编语言

3d

4d

5d

6d

7d

8d

9d

10d

10d

ary

2d

1dcountsumtable0000001400160018000000140016(bx)55dproaddprocnearpushaxpushcxpushsipushdi

mov

si,[bx]

mov

di,[bx+2]

mov

cx,[di]

mov

di,[bx+4]

xorax,axnext:addax,[si]addsi,2loopnext

mov[di],axpopdipopsipopcxpopaxretproadd

endpcodeendsendmain汇编语言stacksegment

dw100dup(?)

toslabelwordstackendsstart:

movax,stack

mov

ss,ax

movsp,offsettospushdssubax,axpushax……通过堆栈传送参数或参数地址:PSPDSESSSCSPSPDSESSSCSstacksegmentstack

dw100dup(?)

toslabelwordstackends汇编语言例:累加数组中的元素(通过堆栈传送参数地址)datasegment

ary

dw1,2,3,4,5,6,7,8,9,10countdw10sumdw?dataendsstacksegment

dw100dup(?)

toslabelwordstackends汇编语言code1segmentmainprocfarassumecs:code1,ds:data,ss:stackstart:

movax,stack

mov

ss,ax

movsp,offsettospushdssubax,axpushax

movax,data

mov

ds,ax

mov

bx,offsetarypushbx

mov

bx,offsetcountpushbx

mov

bx,offsetsumpushbx

callfarptr

proaddretmainendpcode1ends(ip)(cs)0016001400000(ds)

(sp)汇编语言code2segmentassumecs:code2proaddprocfar

pushbp

mov

bp,sppushaxpushcxpushsipushdi

movsi,[bp+0ah]

movdi,[bp+8]

mov

cx,[di]

movdi,[bp+6]code2endsendstart

xorax,axnext:addax,[si]addsi,2loopnext

mov[di],axpopdipopsipopcxpopaxpopbp

ret6proadd

endp(ip)(cs)0016001400000(ds)

(di)(si)(cx)(ax)(sp)(bp)(bp)

(bp)+0ah

(bp)+8

(bp)+6汇编语言结构伪操作STRUC:

定义一种可包含不同类型数据的结构模式格式:结构名

STRUC

字段名1

DB?

字段名2

DW?

字段名3

DD?……

结构名

ENDS

例:学生个人信息

STUDENT_DATA

STRUC

NAMEDB5DUP(?)IDDW0AGEDB?DEPDB10DUP(?)

STUDENT_DATA

ENDS汇编语言例:累加数组中的元素(通过堆栈传送参数地址)code2segmentassumecs:code2

stack_strc

struc

save_bp

dw?

save_cs_ip

dw2dup(?)par3_addrdw?par2_addrdw?par1_addrdw?

stack_strc

endsproaddprocfar…………proadd

endp

code2endsendstart汇编语言proaddprocfarpushbp

mov

bp,sppushaxpushcxpushsipushdi

mov

si,[bp].par1_addr

mov

di,[bp].par2_addr

mov

cx,[di]

mov

di,[bp].par3_addr

xorax,axnext:addax,[si]addsi,2loopnext

mov[di],axpopdipopsipopcxpopaxpopbpret6proadd

endp(ip)(cs)0016001400000(ds)

(di)(si)(cx)(ax)(sp)(bp)(bp)par3_addrpar2_addrpar1_addr汇编语言5.子程序的嵌套与递归子程序的嵌套:主程序

子程序A

子程序B递归子程序:n!……call

proc_A……proc_A

……callproc_B……retproc_B……ret汇编语言例:计算n!framestruc

save_bp

dw?

save_cs_ip

dw2dup(?)ndw?

result_addr

dw?frameendsdatasegmentn_vdw3resultdw?dataendsstacksegment

dw128dup(?)

toslabelwordstackends汇编语言codesegmentmainprocfarassumecs:code,ds:data,ss:stackstart:

movax,stack

mov

ss,ax

movsp,offsettospushdssubax,axpushax

movax,data

mov

ds,ax

mov

bx,offsetresultpushbx

mov

bx,n_vpushbxcallfarptrfactretmainendpcodeends汇编语言code1segmentassumecs:code1factprocfarpushbp

mov

bp,sppushbxpushax

mov

bx,[bp].result_addr

movax,[bp].n

cmpax,0jedonepushbx

decaxpushax

callfarptrfact

mov

bx,[bp].result_addr

movax,[bx]

mul[bp].n

jmpshortreturndone:movax,1return:

mov[bx],axpopaxpopbxpopbpret4factendpcode1ends

(AX)(BX)(BP)CODE中的(IP)CODE中的(CS)

3RESULT的地址第1帧

(AX)(BX)

(BP)CODE1中的(IP)CODE1中的(CS)

2RESULT的地址第2帧

(AX)(BX)(BP)CODE1中的(IP)CODE1中的(CS)

1RESULT的地址第3帧

(AX)(BX)(BP)CODE1中的(IP)CODE1中的(CS)

0RESULT的地址第4帧00FA00F200E400D600C8000000F200E400D6汇编语言ES0CEFHDS0CFFHSS0D00HCS0D10Hcode中的CS和IP0D10H001FHcode1中的CS和IP0D12H0018H汇编语言

(AX)(BX)(BP)CODE中的(IP)CODE中的(CS)

3RESULT的地址

(AX)(BX)(BP)CODE1中的(IP)CODE1中的(CS)

2RESULT的地址

(AX)(BX)(BP)CODE1中的(IP)CODE1中的(CS)

1RESULT的地址

(AX)(BX)(BP)CODE1中的(IP)CODE1中的(CS)

0RESULT的地址00FA00F200E400D600C8000000F200E400D6汇编语言factprocnearpushaxpushbp

mov

bp,sp

movax,[bp+6]

cmpax,0

jnefact1incax

jmpexitfact1:decaxpushax

callfactpopax

mulwordptr[bp+6]exit:

mov[bp+6],axpopbppopaxretfactendp例:计算n!mov

bx,n_vpushbxcallfactpopresult主程序:(BP)(AX)(IP)

0(BP)(AX)(IP)

1(BP)

(AX)(IP)

2(BP)(AX)(IP)

3汇编语言多个模块之间的参数传送:局部符号:在本模块中定义,在本模块中引用的符号外部符号:在某一模块中定义,在另一模块中引用的符号

PUBLIC符号EXTRN符

温馨提示

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

评论

0/150

提交评论