- 0
- 0
- 约1.05万字
- 约 98页
- 2025-10-23 发布于江西
- 举报
教学重点;5.1高级语言特性;5.1.1条件控制伪指令;条件表达式中的操作符;;单分支结构
.IFAX0
negax
.ENDIF
movresult,ax
;双分支结构
.IFax==5
movbx,ax
movax,0
.ELSE
decax
.ENDIF; .data
_a sbyte?
_b sbyte?
_c sbyte?
tag byte?
.code
.startup
moval,_b
imulal
movbx,ax ;bx中为b2
moval,_a
imul_c
movcx,4
imulcx ;ax中为4ac; .ifswordptrbx=ax ;比较二者大小
movtag,1
;第一分支体:条件满足,tag←1
.else
movtag,0
;第二分支体:条件不满足,tag←0
.endif
.exit0 ;5.1.2循环控制伪指令;WHILE循环结构的流程图;UNTIL循环结构的流程图;;WHILE结构
xorax,ax
movcx,100
.whilecx!=0
addax,cx
deccx
.endw
movsum,ax; movcx,100
xorax,ax
leabx,array
.repeat
.ifswordptr[bx]=0
addax,[bx]
.else
.break
.endif
incbx
incbx
.untilcxz
movresult,ax;要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐
应该采用过程调用伪指令INVOKE
使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明;;汇编语言程序:lt503.asm
.modelsmall
checksumdPROTOc,:word,:word ;声明过程
.stack
.data
array db12h,25h,0f0h,0a3h,3
db68h,71h,0cah,0ffh,90h
count equ$-array ;数组的元素个数result db? ;校验和
.code
.startup
INVOKEchecksumd,count,offsetarray ;调用过程
movresult,al ;保存校验和
.exit0;checksumdPROCcUSESbxcx,\
countp:word,arrayp:word
movbx,arrayp ;BX←数组的偏移地址
movcx,countp ;CX←数组的元素个数
xoral,al
sumd: addal,[bx] ;求和:AL←AL+DS:[BX]
incbx
loopsumd
ret
checksumdendp
end;;lt503.asm的列表文件(lt503.lst)
...
INVOKEchecksumd,count,offsetarray
* movax,wordptrOFFSETarray
* pushax
* movax,+000Ah
* pushax
* callchecksumd
* addsp,04h
movresult,al
...;checksumdPROCcUSESbxcx,\
countp:word,arrayp:word
* pushbp ;起始代码
* movbp,sp
* pushbx ;保护bx和cx
* pushcx
movbx,arrayp ;arrayp=[BP+6]
movcx,countp ;countp=[BP+4]
...
ret
* popcx ;结尾代码
* popbx
* popbp
* ret0000h
checksumcendp;5.2宏结构程序设计;宏——具有宏名的一段汇编语句序列
——宏定义时书写
宏指令——这段汇编语句序列的缩写
——宏调用时书写
宏展开——宏指令处用这段宏代替的过程
——宏汇编时实现
宏的参数功能强大,颇具特色
配合宏,还有宏操作符和有关伪指令;宏定义;宏调用;宏展开;宏的参数;;宏定义
shlext macroshloprand,shlnum
pushcx
movcl,shlnum
shlshloprand,cl
popcx
en
原创力文档

文档评论(0)