高级汇编及串操作.ppt_第1页
高级汇编及串操作.ppt_第2页
高级汇编及串操作.ppt_第3页
高级汇编及串操作.ppt_第4页
高级汇编及串操作.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

VIP免费下载

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

文档简介

第7章 高级汇编语言技术 P132,1.宏汇编 2.重复汇编 3.条件汇编,1.宏汇编,(1)引入的原因 模块化程序设计中,使用子程序存在的一些缺点。如为转子及返回,保存及恢复寄存器和参数的传送所增加的开销,如所消耗的时间和所占用的存储空间。,(2)宏定义 宏-源程序中一段有独立功能的程序代码。 只需定义一次,就可多次调用,调用时只需用一个宏指令语句。 结构: macro name MACRO dummy parameter list ENDM 哑元表(dummy parameter list)给出形式参数,每个哑元之 间用逗号隔开。,(3)宏调用 经宏定义定义后的宏指令在源程序中的调用的操作。 格式: macro name actual parameter list 实元表(actual parameter list) 中每一项为实 元,之间用逗号隔开。,(4)宏展开 源程序在汇编时,汇编程序对每一个宏调用用宏定义体取代源程序中的宏指令名,并且用实 元取代宏定义中的哑元。 注:取代时,实元和哑元是一一对应的。每对应上的作“空”处理或不予考虑。,例:用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数作为结果。,宏定义 multiply MACRO op1,op2,result push dx push ax mov ax,op1 imul op2 mov result,ax pop ax pop dx ENDM,宏调用 multiply cx,var,xyzbx multiply 240,bx,save ,宏展开 push dx push ax mov ax,cx imul var mov xyzbx,ax pop ax pop dx push dx push ax mov ax,240 imul bx mov save,ax pop ax pop dx ,优点: 避免了子程序因为参数传递带来的麻烦。 缺点: 宏汇编可能占用较大的空间,代码较长 的功能段往往使用子程序而不用宏汇编; 那些较短且变元较多的功能段则使用宏 汇编。,(5)宏定义中的参数,A.宏定义可无变元 例 宏定义 save macro push ax push bx push cx endm 宏调用 save,B.变元可以是操作码 例 宏定义 foo macro p1,p2,p3 mov ax,p1 p2 p3 endm 宏调用 foo word_var,inc,ax 宏展开 mov ax,word_var inc ax,C.变元是操作码的一部分,用&作为分隔符 宏定义 leap macro cond,lab j&cond lab endm 宏调用 leap z,there leap nz ,here 宏展开 jz there jnz here ,D.变元是ASCII串 宏定义 mess macro lab,num,xyz lab&num db hellow mr.&xyz endm 宏调用 mess msg,1,taylor 宏调用 msg1 db hellow mr.taylor,E.变元使用%操作符,格式 % expression 宏定义 msg macro count,string msg&count db string endm errmsg macro text cntr=cntr+1 msg % cntr,text endm 宏调用 . cntr=0 errmsg syntax error errmsg invalid operand 宏调用 msg1 db syntax error msg2 db invalid operand,(6)LOCAL 伪操作,原因 宏定义体内允许使用标号,为防止多次调 用引起展开后出现标号的多重定义,采用 local伪操作。 格式 local list of local labels,例:,宏定义 absol macro oper local next cmp oper,0 jge next neg oper next: endm 宏调用 absol var absol bx 宏展开 . cmp var,0 jge ?0000 neg var ?0000 cmp bx,0 jge ?0001 neg bx ?0001 ,(7)宏定义内使用宏,条件: 必须先定义后调用 宏定义体内允许宏调用,宏使用和包含宏定义,例 宏定义 DIF macro x,y mov ax,x sub ax,y endm DIFSQR macro opr1,opr2,result push dx push ax dif opr1,opr2 imul ax mov result,ax pop ax pop dx endm 宏调用 difsqr var1,var2,var3 宏展开 push dx push ax mov ax,var1 sub ax,var2 imul ax mov var3,ax pop ax pop dx,(8)列表伪操作,MASM提供.XALL,.LALL,.SALL .XALL 为默认情况,指示清单只列出产生目标码的宏展开。 .LALL 列出包括注释在内的所有展开 .SALL 不列出任何展开信息,(9) 宏库的建立与调用,宏库-包含若干宏定义的文件称为宏库,通常扩 展名为MAC或INC 如: macro.mac 宏的调用 在程序开头用INCLUDE说明 如: include macro.mac,(10) PURGE 伪操作,该命令用来删除调用程序中不用的宏定义,程序汇编时就会忽略该宏,也不会展开. 格式 PURGE macro_name,macro_name,.,2.重复汇编,目的: 为连续重复完成相同或几乎完全相同的一组代码。,(1)重复伪操作 格式 REPT expression . ENDM expression的值确定重复块的重复次数,例 x=0 rept 10 x=x+1 db x endm 汇编后: db 1 db 2 db 3 db 10,(2) 不定重复伪操作 A.IRP伪操作 格式 IRP dummy, ENDM 不一定要用在宏定义中.,例 irp reg, push reg endm 汇编后 push ax push bx push cx push dx,B.IRPC 伪操作 格式 IRPC dummy,string(或) ENDM 与IRP类似,但变量表必须是字符串。,例 irpc k,abcd push k&x endm 汇编后: push ax push bx push cx push dx,3.条件汇编,目的: 根据条件把一段源程序包括在汇编语言源程序内或把它排除在外。 格式 IFxx argument ELSE ENDIF,A.条件伪操作IF的使用 IF expression 汇编程序求出表达式的值, 如此值为不为0,则满足条件.,例 宏定义 max macro k,a,b,c local next,out mov ax,a if k-1 if k-2 cmp c,ax jle next mov ax,c endif next: cmp b,ax jle out mov ax,b endif out: endm,宏调用: max 1,p max 2,p,q 宏展开: max 1,p mov ax,p ?0001: mov ax,p max 2,p,q ?0002: cmp q,ax jle ?0003 mov ax,q ?0003:,B. IF1 在汇编程序的第一遍扫视期间 满足条件. IFNDEF symbol 如符号未定义或未通过 EXTRN说明为外部符号则 满足条件. IFBargument 如自变量为空,则满足条件。 IFIDNarg-1,arg-2 如字符串arg-1和字符串arg-2 相同, 则满足条件,串操作类指令 P121(第六章),串操作指令 : 数据传送类指令每次只能传送一个数据,若要传送大批数据就需要重复编程,这样就浪费了大量的时间和空间。为此8086提供了一组处理主存中连续存放数据串的指令,这就是串操作指令。,1传送指令MOVS DDST,SDST 语句格式: MOVSB字节串传送 MOVSW字串传送 功能:将以SI为指针的源串(DS:SI)中的一个字节(或字)存储单元中的数据传送至以(ES:DI)为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。 即:(DS:SI)ES:DI。 当DF=0时,(SI)和(DI)增量。 当DF=1时,(SI)和(DI)减量。,2串比较指令CMPS DDST,SDST 语句格式: CMPSB字节串比较 CMPSW字串比较 功能:将SI所指的源串(DS:SI)中的一个字节(或字)存储单元中的数据与目的串(ES:DI)所指的中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。 即:(SI)(DI)。 修改串指针,使之指向串中的下一个元素。 当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。,3.串搜索指令SCAS DDST 语句格式: SCASB字节串搜索 SCASW字串搜索 功能:AL(字节)或AX(字)中的内容与DI所指的目的串(ES:DI)中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存。 即: 字节操作:(AL)(DI),字操作:(AX)(DI)。 修改指针使之指向串中的下一个元素。 当DF=0时,(DI)增量。当DF=1时,(DI)减量。,4从源串中取数指令LODS SDST 语句格式: LODSB从字节串中取数 LODSW从字串中取数 功能:将SI所指的源串(DS:SI)中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。 即: 字节操作:(SI)AL,字操作:(SI)AX。 修改指针SI,使它指向串中的下一个元素。 当DF=0时,(SI)增量。当DF=1时,(SI)减量。,5往目的串中存数指令STOS DDST 语句格式: STOSB往字节串中存数 (2)STOSW往字串中存数 功能:将AL或AX中的数据送入DI所指的(ES:DI)目的串中的字节(或字)存储单元中。 即: 字节操作:(AL)DI,字操作:(AX)DI。 修改指针DI,使之指向串中的下一个元素。 当DF=0时,(DI)增量)。当DF=1时,(DI)减量。,6重复前缀指令REP REPZ REPNZ (1)REP REP前缀用在

温馨提示

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

评论

0/150

提交评论