汇编语言11
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.1 宏汇编
例7.10 宏定义: int21 macro mov int endm disp macro mov int21 endm 宏调用: disp functn ah,functn 21h char dl,char 02h
‘?’
7.1 宏汇编
例7.11 宏定义体内不仅可以使用宏调用,也可以包含宏定义。 宏定义: defmac macro macname,operator macnam macro x,y,z push ax mov ax,x operator ax,y mov z,ax pop ax endm endm 宏调用: defmac addition,add … defmac subtract,sub … defmac logor,or
调用宏库: include dir\XXX.mac
7.1 宏汇编
7.1.7 purge伪操作 purge伪操作用来删除不用的宏定义。 purge macro_name [, macro_name, …]
7.2 重复汇编
7.2.1 重复伪操作 重复伪操作格式: rept expression … endm
7.1 宏汇编
例7.4 变元可以是操作码的一部分,但在宏定义体中必须用&作为分隔符。 宏定义: leap macro j&cond endm 宏调用: leap … leap nz,here z,there cond,lab lab
7.1 宏汇编
例7.5 宏定义: fo macro jmp endm 宏调用: fo word_var p1 ta&p1
例7.15 用宏定义及重复伪操作把tab, tab+2, tab+4, … , tab+8的内容存入堆栈。 宏定义: push_tab macro k push endm 宏调用: i=0 rept 5 push_tab % I i=i+2 endm tab+k
7.2 重复汇编
7.16 要求建立一个8字的数组,其中每个字的内容是下一个字的地址,在最后一 个字的内容是第一个字的地址。 array label rept word 7 dw endm dw array $+2
ifb ifnb ifidn ifiidif <argument> 如自变量为空,则满足条件。 <argument> 如果自变量不为空,则满足条件。 <arg-1>,<arg-2> 如果字符串<arg-1>和字符串<arg-2>相同,则满足条件。 <arg-1>,<arg-2> 如果字符串<arg-1>和字符串<arg-2>不相同,则满足条件
7.1 宏汇编
宏调用: 1 PUSH DX PUSH AX
MULTIPLY
… MULTIPLY 宏展开: 1 1 1 PUSH DX PUSH AX MOV AX,CX
CX,VAR,XYZ[BX]
1
1
240,BX,SAVE 1 1 1 1
MOV AX,240
IMUL BX MOV SAVE,AX POP AX POP DX
7.1 宏汇编
例7.6 变元是ascii串 宏定义: msggen macro lab,num,xyz ‘hello mr. &xyz’
lab&num db endm 宏调用:
msggen msg,1,taylor
7.1 宏汇编
例7.7 在变元中使用%操作符。 % 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’
7.3 条件汇编
例7.22 宏指令branch产生一条转向x的转移指令。当它相对与x的距 离小于128字节时产生jmp short x;否则产生jmp near ptr x(x必须 位于转移指令之后,即低地址区)。 宏定义: branch macro x if ($-x) lt 128 jmp short x else jmp near ptr x endif endm 宏展开: branch aa
7.2 重复汇编
7.2.2 不定重复伪操作 1. irp伪操作 格式: irp … endm dummy,<argument list>
7.2 重复汇编
例7.17 irp x,<1,2,3,4,5,6,7,8,9,10> db endm x
例7.18 irp Biblioteka Baidueg,<ax,bx,cx,dx> push reg endm
7.1 宏汇编
7.1.2 宏定义中的参数 例7.2 宏定义可以无变元 宏定义: savereg macro push ax push bx push cx push dx push si push di endm 宏调用:
savereg
7.1 宏汇编
例7.3 变元可以是操作码 宏定义: foo macro mov p2 endm 宏调用: foo word_var,inc,ax p1,p2,p3 ax,p1 p3
到的语句应该是有效的,否则汇编程序将会指示出错。)
7.1 宏汇编
例7.1 用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数作为结果。 宏定义: MULTIPLY MACRO OPR1,OPR2,RESULT PUSH DX
PUSH AX
MOV AX,OPR1 IMUL OPR2 MOV RESULT,AX POP AX POP DX ENDM
局部标号表中的每个局部标号建立唯一的标号(用??0000~??FFFF)。
7.1 宏汇编
absol macro local cmp jge neg endm 宏调用: … absol ... absol oper next oper,0 next oper
next:
var
bx
7.1 宏汇编
7.1.4 在宏定义内使用宏 例7.9 宏定义中允许使用宏调用,其限制条件是:必须先定义以后。 宏定义: 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
汇编语言程序设计
第7章 高级汇编语言技术
7.1 宏汇编 子程序的缺点:为转子及返回、保存即恢复寄存器以及参数的传递等增加程 序的开销。 宏汇编:子程序较短或需要传递较多参数的时候,利用宏汇编更有利。 7.1.1 宏定义、宏调用和宏展开 宏定义格式:macro_name MACRO [哑元列表] ENDM 哑元列表:给出宏定义中所用的形式参数,每个哑元之间用逗号隔开。 宏调用格式:macro_name [实元列表]
7.2 重复汇编
2. irpc 格式: irpc … endm 变量列表必须是字符串。每次重复用字符串中的下一个字符取代重复块中的哑元。 dummy,string(或<string>)
7.2 重复汇编
例7.19 irpc x,01234567 db endm x+1
例7.20 irpc k,abcd push endm k&x
7.3 条件汇编
7.3.1 条件伪操作ifndef的使用举例 例7.25 divide macro dividend,divisor,quotient local comp,out cntr = 0 ifndef divident cntr = 1 endif ifndef cntr = 1 endif ifndef cntr = 1 endif divisor if exitm endif mov mov sub comp: cmp jb sub inc jmp out: mov endm quotient,cx ax,bx out ax,bx cx comp cont
重复伪操作并不一定要用在宏定义体内。
7.2 重复汇编
例7.3 x=0 rept 10 x=x+1 db
x
endm
例7.14 把字符A到Z得ASCII码填入数组TABLE char=‘A’ table label byte rept 26 db char char = char + 1 endm
7.2 重复汇编
7.2 重复汇编
7.3.1 条件伪操作if的使用举例 例7.21 宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段。 宏定义: max macro k,a,b,c local next,out mov ax,a if k-1 if k-2 com c,ax jle next mov ax,c endif 宏调用: next: cmp b,ax max 1,p jle out max 2,p,q mov ax,b endif max 3,p,q,r out: endm
7.1 宏汇编
7.1.5 列表伪操作 masm提供.xall, .lall, .sall来控制汇编清单中宏展开的理出情况。 .xall为默认情况,指示清单中只列出产生目标码的宏展开; .lall列出包括注释在内的所有宏展开; .sall不列出任何展开信息。
7.1 宏汇编
7.1.6 宏库的建立与调用 把自己编程中常用的宏定义建立成一个独立的文件,这个只包含若干宏定义的文 件可称为宏库,通常用扩展名mac或inc来表示。
7.3 条件汇编
例7.23 宏定义可允许递归调用,此时条件伪操作可用来结束宏递归。 宏指令power可用来实现x和2n相乘。这只需要x左移n次即可实现,可 以设count为递归次数的计数器,当该数与n相等时就可以结束递归调用。 宏定义: power macro x,n sal x,1 count = count + 1 if count – n power x,n endif endm 宏调用: count = 0 power ax,3
实元列表:为实元,每个实元之间用逗号隔开。
7.1 宏汇编
宏展开:当源程序被汇编时,汇编程序将对每个宏调用作宏展开,即用宏定 义体取代源程序中的宏指令名,用实元取代宏定义中的哑元,实元与哑元一一对 应,若实元个数大于哑元的个数,则多余的实元不予考虑,若实元格式小于哑元 个数,则多余的哑元作“空”处理。(注意:宏展开后,实元取代哑元后,所得
在汇编程序的第一遍扫视期间满则条件。
if2 在汇编程序的第二遍扫视期间满足条件。 ifdef symbol 如果符号已在程序中定义,或者已用extrn伪操作说明该符号是在外部定 义的,则满足条件。 ifndef symbol 如符号未定义或未通过extrn说明为外部符号则满足条件。
7.3 条件汇编
7.3 条件汇编
汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外,这 里就用到条件伪操作。
条件伪操作的一般格式: ifxx … [else] … endif argument
7.3 条件汇编
if ife if1 expression 汇编程序求出表达式,如此值不为0,则满足条件。 expression 如求出表达式的值为0,则满足条件。
1
1 1 1
IMUL VAR
MOV XYZ[BX],AX POP AX POP DX
7.1 宏汇编
注意:在程序中,宏定义必须出现在宏定义调用之前,也就是说必须先定义 后调用。因此,往往把宏定义在程序中所有段的代码之前,即在程序一开始先列 出你的程序中所有用的所有宏定义,以便在程序中调用。
宏和子程序的区别: 子程序是在程序执行期间有主程序调用的,它只占有它自身大小的一个空间; 而宏调用则是在宏汇编期间展开的,每调用一次就把宏定义体展开一次,因而它 占有的存储空间与调用次数有关,调用次数越多则占有的存储空间也就越大。 但是宏调用可以省掉子程序调用返回的开销。 代码较长时不用宏汇编,代码较短且变元较多时用宏汇编。
7.1 宏汇编
7.1.3 local伪操作 例7.8 宏定义体内允许使用标号 宏定义: absol macro oper cmp oper,0 jge next neg oper next: endm 多次调用absol后,next被多重定义。 local list of local labels