版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章子程序结构汇编语言过程定义伪操作子程序的调用与返回保存与恢复寄存器子程序的参数传送子程序的嵌套与递归主要内容:汇编语言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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年饰品商铺租赁与品牌合作与市场拓展合同3篇
- 2025版互联网数据中心相关方环境管理协议3篇
- 二零二五版钢筋焊接工艺用工合同模板范文2篇
- 二零二五版模具维修改型与产业融合合同4篇
- 2025年道路工程质量检测与验收合同3篇
- 2025年度个人股份代持及转让法律文件3篇
- 2025年度采矿权出让合同范本:矿产资源勘查开发技术规范3篇
- 2025年度冰箱智能互联技术合作协议3篇
- 二零二五年度新能源用地抵押借款合同3篇
- 二零二五版定制家具销售与售后服务协议7篇
- 2024年社区警务规范考试题库
- 2024年食用牛脂项目可行性研究报告
- 消防安全隐患等级
- 温室气体(二氧化碳和甲烷)走航监测技术规范
- 部编版一年级语文下册第一单元大单元教学设计
- 《保单检视专题》课件
- 北京地铁13号线
- 2023山东春季高考数学真题(含答案)
- 职业卫生法律法规和标准培训课件
- 高二下学期英语阅读提升练习(二)
- 民事诉讼证据清单模板
评论
0/150
提交评论