汇编语言宏指令

合集下载

《汇编语言程序设计》第7章 高级宏语言

《汇编语言程序设计》第7章 高级宏语言

7.1 宏指令
宏嵌套
1. 宏定义中可以嵌套宏调用 2. 宏定义中可以嵌套宏定义
7.1 宏指令
宏嵌套
1. 宏定义中可以嵌套宏调用 例7.4 非组合BCD码转换成ASCII码。
宏定义: TURN MACRO ADD AL,30H ENDM BTOA MACRO ADDR XCHG AL,ADDR TURN XCHG AL,ADDR ENDM 宏调用: BTOA DATA 宏展开: + XCHG AL,DATA + ADD AL,30H + XCHG AL,DATA
7.2 条件汇编指令
宏定义与宏结束指令
⑥IFNDEF CONT 此操作中的条件CONT是一个符号,如果这个符号未定义,或未经 EXTRN伪指令说明,则条件为真。 ⑦IFB <CONT> 如果尖括号中为空(不写任何字符),则条件为真。 ⑧IFNB <CONT> 如果尖括号中不为空,则条件为真。 ⑨IFIDN <CHR1>,<CHR2> CHR1和CHR2为字符串,如果两个字符串相同,则条件为真。两个 字符串必须分别用尖括号括起来。 ⑩IFDIF <CHR1>,<CHR2> CHR1和CHR2为字符串,如果两个字符串不相同,则条件为真。两 个字符串必须分别用尖括号括起来。
7.1 宏指令
宏定义与宏结束指令
3.宏指令的有效范围 宏指令的优先级最高。可以定义与指令助记符、伪操作 同名的宏,此时,同名机器指令或伪操作失效。只有用 PURGE伪操作取消宏定义,才能恢复同名机器指令或伪 操作的原始含义。 PURGE伪操作可同时取消多个宏定义,被取消的宏名之 间用逗号分隔。格式为:
7.3 重复汇编指令

第08章 条件汇编与宏指令

第08章 条件汇编与宏指令

8.1.1 宏定义与宏结束伪操作命令
1、宏定义的一般格式 MNAME MACRO [形参1],[形参2]...... : : } 宏体 : ENDM 功能:定义一个新指令(宏名字),并用这个新指令来代表宏体全部内容。 说明: 1)宏指令一定要先定义,后调用。因此,宏定义一定要放在它的第一次 调用之前。 2)宏指令名可以与伪指令、机器指令的助记符同名且具有比指令、伪指 令更高的优先权。如果需要对某一宏指令重新定义,则直接重新定义即可 。 3)允许对已定义好的宏定义取消定义,其取消宏定义伪指令格式: PURGE 宏指令名[,宏指令名] 宏定义一旦取消就不能再调用。
注意:%后的符号一定是直接用EQU或等号(=)赋值的符号常量,或者汇编时能计算 出值的表达式,而不能是变量名和寄存器名。
汇编语言 程序设计
四、感叹号操作符 !
• 当把“&”、“%”这样的符号当作一个普通字符使用时, 要想使宏功能不将它们当作特殊宏操作符看待,必须在它 们前面加上操作符!。 • 例如有宏定义: • DISP MACRO X • DB ‘ abc!&x=&x’ • ENDM • 若进行如下宏调用: • A EQU 5 • DISP %A • 则相应的宏扩展为: • DB ‘ abc &x=5’
SHIFT 4,AL,AX SHIFT 2,AR,BH SHIFT 5,HR,DX 则在汇编这些宏指令语句时,所得到的宏扩展为: 1 MOV CL,4 1 SAL AX,CL ;将AX内容算术左移位 1 MOV CL,2 1 SAR BH,CL ;将BH 内容算术右移2位 1 MOV CL,5 1 SHR DX,CL ;将DX内容逻辑右移5位
汇编语言 程序设计 • • •
宏中标号的处理

汇编语言——第3章宏汇编语言

汇编语言——第3章宏汇编语言

第三章宏汇编语言一:宏汇编语言格式3.1.1 指令语句格式指令语句的一般格式如下:[标号:]指令助记符操作数;注释1.标号:标号是机械指令语句寄存地址的符号表示,代表该指令目标代码的第一个字节地址,后面必需紧跟冒号“:” 。

2.指令助记符:指令助记符为语句的核心成份,表示了该语句的操作类型。

3.操作数:操作数表示指令助记符的操作对象。

4.注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。

3.1.2 伪指令语句格式伪指令语句格式如下:[符号名] 伪指令符操作数;注释1.符号名:符号名是伪指令语句的一个可选项。

2.伪指令符:伪指令符指定汇编程序要完成的具体操作,如数据概念伪指令DB、DW、DD,段概念伪指令SEGMENT,假定伪指令ASSUME等。

2.操作数:伪指令后面的操作数能够是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必需以“逗号”分隔。

4.注释:伪指令的注释必需以“;”开始,其作用同指令语句中的注释部份。

汇编语句表达式3.2.1 常量1.数值常量2. 字符串常量字符串常量是用单引号或双引号引发来的一个或多个字符。

字符串常量是以各字符的ASCⅡ码表示的。

如‘A’用41H 表示,字符串‘A1B2’用41H,31H,42H,32H表示。

3.2.2 变量1.变量(1)段属性(2)偏移地址属性(3)类型属性2.变量的概念表达式项是给变量或指定存储单元给予初值,它有以下几种形式:(1)数值表达式数据概念伪指令能够为一个或持续的存储单元设置数值初值。

【例】为数据段分派存储单元。

DATA SEGMENTA DB 11H,12H,13HB DW 1122H,3344HC DD HDATA ENDS上述变量的存储单元分派及初始化情形如下图所示。

数据段中数据存储分派图(2)字符串表达式字符串表达式中的字符串必需用引号引发来。

DB、DW、DD伪指令将字符串中的各字符均以ASCⅡ码形式寄存在相应的存储单元,但表示形式各不相同。

第三章 宏汇编语言

第三章  宏汇编语言
返回本章首页
3.2.1 常量
1.数值常量 . 2. 符号常量
返回本节
1.数值常量 .
数值类型常量有二进制、八进制、 数值类型常量有二进制、八进制、十进制和十六进制数 常量有二进制 字形式和字符串形式的常量。 字形式和字符串形式的常量。
表3.1
各种形式数字常量格式对照表 汇编语言大小写不敏感> <汇编语言大小写不敏感>
表达式: 表达式: 表达式项是给变量或指定存储单元赋予初值 , 表达式项 是给变量或指定存储单元赋予初值, 它 是给变量或指定存储单元赋予初值 有以下几种形式: 有以下几种形式: (1)数值表达式 ) (2) 字符串表达式 ) 两个伪指令) (3)地址表达式(只适用 )地址表达式(只适用DW和DD两个伪指令) 和 两个伪指令 (4)? 表达式 ) (5)带DUP的表达式 ) 的表达式
返回本节
2. 符号常量
• 对经常使用的数值常量可以先为它定义一个名字, 对经常使用的数值常量可以先为它定义一个名字, 然后在语句中用名字来表示该常量。 然后在语句中用名字来表示该常量。常数若使用 符号名来表示 有意义的符号名来表示,可以提高程序的可读性, 有意义的符号名来表示,可以提高程序的可读性, 同时更具有通用性。 同时更具有通用性。
3.关系运算符 .
关系运算符包括:相等( ),不等( ),小于( ), ),不等 ),小于 关系运算符包括:相等(EQ),不等(NE),小于(LT), 大于( ),小于等于( )及大于等于( )。 ),小于等于 大于(GT),小于等于(LE)及大于等于(GE)。 运算结果:若关系不成立,结果为 ;否则为0FFFFH。 运算结果:若关系不成立,结果为0;否则为 。 【例3.3】用关系运算符进行数值表达式运算。 】用关系运算符进行数值表达式运算。 NUM1 DB 10 LT 5 NUM2 DB 0AAAAH GT 7FFFH MOV AX,‘A‘ EQ 41H , MOV BX,NUM2 LT NUM1 , 结果: 结果:NUM1=0 ; NUM2=0FFH; (AX)=0FFFFH; (BX)=0

华中科技大学8086汇编讲义第三章宏汇编语言

华中科技大学8086汇编讲义第三章宏汇编语言

第三章宏汇编语言每种计算机语言都规定了自己的字符、基本词汇、典型语句和语法规则。

同样,汇编语言也有自己的字符、基本词汇、典型语句和语法规则。

字符:ASCII字符基本词汇:符号指令(MOV、ADD)伪指令(DB、SEGMENT等)典型语句:●机器指令语句——对应机器指令的一种操作。

●伪指令语句——无机器语言与之对应,不生成机器指令。

●宏指令语句——一条宏指令对应多条机器指令,产生一组目标代码。

语法规则:基本语法单位(常量、变量、标号、表达式)前面的例子已介绍了源程序的基本结构、格式、名字的定义、语句格式,下面将更深入地介绍有关语法规则。

3.1表达式汇编程序的语句及程序格式都比较固定,语句中除正确选择操作符之外,主要问题在于正确表示操作数地址,这涉及到寻址方式,可以归结到地址表达式的使用。

表达式:由常数、寄存器、标号、变量加上运算符构成的式子。

3.1.1.常量与数值表达式一.常量常量:从源程序翻译成目标程序期间已经有确定数值的量。

用途:赋值、作立即数、位移量。

由常量与运算符组成的式子。

数值表达式在汇编期间进行运算,结果为常量。

汇编期间允许对常量进行3种运算:1.算术运算包括:+、–、*、/、模除(MOD,取余数)、右移、左移。

2.逻辑运算●逻辑乘:AND(与)●逻辑加:OR(或)●按位加:XOR(异或)●逻辑非:NOT(非)3.关系运算包括:相等(EQ)、不等(NE)、小于(L T)、大于(GT)、小于等于(LE)、大于等于(GE)。

运算结果:关系不成立,结果为0;关系成立,结果为–1(0FFFFH)。

如:N = 50M = (N EQ 50)该关系成立,M =–1。

3.1.2.变量、标号与地址表达式一.变量变量:数据存贮单元的名字。

(存放地址的符号表示)。

变量有三个属性:段、EA、类型。

其中类型由定义时的伪指令确定(DB、DW、DD、DT)。

变量的定义:格式:[变量名] 数据定义伪指令表达式[,…]数据定义伪指令:DB、DW、DD、DQ、DT等。

8086汇编语言语句的类型和格式

8086汇编语言语句的类型和格式
表达式中常用的运算符有以下几种:
⑴ 算术运算符:+、-、*、/和取模运算。
⑵ 逻辑运算符:、、和。
⑶ 关系运算符:、、、、、。结果只有两个全 1或全0。
⑷ 分析运算符:利用分析运算符可以把一个存 储单元地址分解为段地址和偏移地址等。分析运算符 有 、 、、和等。
分析运算符表达式
带分析运算符的表达式
: ,2[] ;取一个字节加数 1 0F8H,60H,0,74H,3 ;被加数 第一条语句是指令语句,其中“:”是名字,“”是指令助记符, “,2[]”是操作数,“;”后面是注释部分;第二条语句是伪指 令语句,其中“1”是名字,“”是伪指令定义符,“0F8H, 60H,0,74H,3”是操作数,“;”后面是注释部分。
⑵ 定义变量的类型为,给变量分配字操作数。
⑶ 定义变量的类型为,给变量分配双字操作 数。
除了常数、表达式和字符串外,问号“?”也 可以作为数据定义伪指令的操作数,此时仅给变量保 留相应的存储单元,而不赋与变量某个确定的初值。
当同样的操作数重复多次时,可用重复操作符 “”表示,其形式为:
n (初值[,初值…0])
1) 名字
汇编语言语句的第一个组成部分是名字()。在指令语句 中,这个名字是一个标号。指令语句中的标号实质上是指“:”后 面指令所在的存储地址(逻辑地址)。供、和等指令作操作数使用, 以寻找转移目标地址。并非每条指令语句必须有标号,但如果 一条指令前面有一标号,则程序中其它地方就可以引用这个标 号。在例5.1中,、就是标号。标号后面有一个冒号。
• , K3
;()←20H,返回前面的数值
• , K4
;()←01H
• , K3
;()←40H
• , K4
;()←04H

汇编语言——宏

汇编语言——宏

【例7.14】形式参数还可以出现在变量定义伪操作的初值表 中,甚至是以字符串形式出现的初值。 msg MACRO num,pname 'HELLO, &pname'
var&num DB ENDM
汇编语言规定,字符串中的形参必须用分隔符“&”从其它 部分分离出来。对于下面两个宏调用, msg msg 1,John 2,Henrry
code
ENDS END main
【解】宏展开后的结果是: + + + + + + MOV MOV INT MOV MOV INT MOV INT AH,2 DL, '*' 21H AH,2 DL, '*' 21H AH,4CH 21H
由于宏展开是汇编程序翻译的一个步骤,宏展后的结果 并不是源程序,所以展开后不再写出完整的程序格式,只列 出有效指令部分。 可以看到,汇编程序对宏调用与已定义的常量及符号的 引用的处理是很类似的,定义部分在汇编处理结束后就已完 成它的作用。汇编程序翻译后得到的机器代码中没有宏、常 量等的定义,只是调用或引用部分被代换成宏体或定义的内 容。宏与常量定义及符号定义的差别在于,常量及符号定义 都必须在一行写完,对常量和符号的引用只能代换指令中的 操作数,或者操作数的一部分,宏调用则可以代换一段程序。 不仅如此,宏还允许代换的内容有个别地方不同,这是通过 带参数的宏实现的。
(3)宏定义仅仅用来告诉汇编程序,将来宏调用时复制 的对象是什么,宏定义中的程序段并不是程序的一部分,也 就是说,如果程序中定义了一个宏而没有调用它,汇编程序 将忽略宏定义。 (4)宏定义可以写在程序的任何地方,但习惯上总是把 宏定义写在程序的最前面。 宏定义与编辑器中的文字块的定义有相似之处,也有一 些差别。两者都需要以特定的方式说明开始和结束的位置。 文字块是文件的一部分,而宏体中的程序段必须经过宏调用 才能复制到源程序中正确的位置,没有被调用的宏体在汇编 程序翻译时会被忽略。

汇编语言——宏

汇编语言——宏

因此,对这一类错误提示,程序员只能自己按规则进行宏展 开,并判断展开后的结果是如何出的错。对于MASM汇编程 序比较熟悉的人,还可以借助于MASM处理源程序时产生的 一个.LST文件(只要在MASM提问“Source listing[NUL.LST]” 时输入一个合适的文件名即可产生清单文件),判断程序中 的错误,以及查看宏展开的结果。 另外,宏调用的优先级高于其它伪指令和指令,所以如 果用伪指令或指令助记符等内部保留字作为宏的名字,则汇 编程序会把这样的标识符当作宏进行处理,而使得源程序中 无法使用其原有的功能。汇编语言中还提供了一个PURGE伪 指令,用于在源程序适当的位置取消某个宏。比如:
code
Байду номын сангаас
ENDS END main
【解】宏展开后的结果是: + + + + + + MOV MOV INT MOV MOV INT MOV INT AH,2 DL, '*' 21H AH,2 DL, '*' 21H AH,4CH 21H
由于宏展开是汇编程序翻译的一个步骤,宏展后的结果 并不是源程序,所以展开后不再写出完整的程序格式,只列 出有效指令部分。 可以看到,汇编程序对宏调用与已定义的常量及符号的 引用的处理是很类似的,定义部分在汇编处理结束后就已完 成它的作用。汇编程序翻译后得到的机器代码中没有宏、常 量等的定义,只是调用或引用部分被代换成宏体或定义的内 容。宏与常量定义及符号定义的差别在于,常量及符号定义 都必须在一行写完,对常量和符号的引用只能代换指令中的 操作数,或者操作数的一部分,宏调用则可以代换一段程序。 不仅如此,宏还允许代换的内容有个别地方不同,这是通过 带参数的宏实现的。
【例7.16】设有如下宏定义: sum MACRO a,b LOCAL next MOV CX,a LEA BX,b XOR AX,AX next:ADD AX,[BX] ADD ENDM 并已知buf1和buf2是已定义的两个变量,展开下面的宏调用: sum 5,buf1 sum 7,buf2 BX,2 LOOP next

汇编语言中macro的用法

汇编语言中macro的用法

汇编语言中macro的用法在汇编语言中,`macro`是一个非常有用的工具,它可以帮助程序员简化代码的编写和调试过程。

本文将深入探讨`macro`的用法及其在汇编语言中的应用。

一、`macro`的概念`macro`是一种允许程序员在源代码中定义可重用代码片段的汇编指令。

它类似于高级语言中的函数或宏定义,可以在程序的不同部分调用,并在编译时将其展开为实际的汇编指令。

二、`macro`的语法在汇编语言中,我们可以使用`macro`关键字来定义一个`macro`指令。

其基本语法如下:```macro macro_name parameter1, parameter2, ..., parameterN; 宏代码部分endm```其中,`macro_name`是宏的名称,`parameter1`、 `parameter2`等是宏的参数,可以根据需要进行定义。

在宏代码部分,我们可以编写一系列的汇编指令,用于实现特定的功能。

三、`macro`的使用示例下面通过一个简单的示例来说明`macro`的使用方法。

假设我们需要编写一个汇编程序,用于计算一个数的平方。

这个功能可以通过一个`macro`来实现:```macro square numbermov ax, numbermul axendm```在上面的示例中,我们定义了一个名为`square`的`macro`,它接受一个参数`number`,将其存储在`AX`寄存器中,并使用`mul`指令计算`number`的平方。

在程序的其他部分,我们可以通过调用`square`宏来使用这个功能。

例如:```mov cx, 5square cx```上述代码片段通过`square`宏计算`CX`寄存器中的值的平方,并将结果存储在`AX`寄存器中。

四、`macro`的优势通过使用`macro`,我们可以实现以下几个优势:1. 代码重用:宏定义可以在程序的不同部分多次使用,避免了重复编写相同的代码片段,提高了代码的可维护性和可读性。

第03章 汇编语言程序设计5_宏汇编

第03章 汇编语言程序设计5_宏汇编


子程序
宏与子程序具有各自的特点, 宏与子程序具有各自的特点,程序员应该根据具 体问题选择使用那种方法 通常,当程序段较短或要求较快执行时, 通常,当程序段较短或要求较快执行时,应选用 当程序段较长或为减小目标代码时, 宏;当程序段较长或为减小目标代码时,要选用子 程序
宏的实例2 宏的实例2
dispmsg
macro message mov ah,9 lea dx,message int 21h endm … dispmsg string … mov ah,9 lea dx,string int 21h
;;宏定义 宏定义 ;;宏定义体 宏定义体
;宏调用(宏指令) 宏调用(宏指令) 宏调用 ;宏展开 宏展开
宏与子程序的比较 比较

仅是源程序级的简化 : 仅是源程序级的 简化: 宏 简化 在汇编时进行程序语 调用在汇编时 调用 在汇编时 进行程序语 句的展开, 不需要返回; 句的展开 , 不需要返回 ; 不减小目标程序, 不减小目标程序 , 执行速 度没有改变 通过形参、 通过形参 、 实参结合实现 参数传递, 简捷直观、 参数传递 , 简捷直观 、 灵 活多变
子程序
还是目标程序级的简化 : 还是目标程序级的 简化: 简化 子程序调用在执行时由 CALL指令转向 RET指令返 指令转向、 CALL指令转向、RET指令返 形成的目标代码较短, 回 ; 形成的目标代码较短 , 执行速度减慢 需要利用寄存器、 需要子程序的比较结论 比较 结论
1. 宏定义
宏定义由一对宏汇编伪指令 宏定义 由一对宏汇编伪指令MACRO和 ENDM来 和 来 由一对宏汇编伪指令 完成,格式如下: 完成,格式如下: 形参表] 宏名 MACRO [形参表 形参表 …… ;宏定义体 ENDM 其中宏名是符合语法的标识符, 其中宏名是符合语法的标识符 , 同一源程序中该 名字定义唯一。宏定义体中不仅可以是硬指令序 名字定义唯一 。 宏定义体 中不仅可以是硬指令序 列,还可以是伪指令语句序列 可选的形参表给出了宏定义中用到的形式参数, 可选的形参表给出了宏定义中用到的形式参数 , 每个形式参数之间用逗号分隔

汇编语言09

汇编语言09
dispmsg MACRO message mov dx,offset message mov ah,09h int 21h ENDM
MACRO ;;定义名为mainbegin的宏,无参数 mov ax,data1 ;;宏定义体 宏注释符 mov ds,ax ENDM ;;宏定义结束 MACRO retnum mov al,retnum mov ah,4ch int 21h ENDM ;;带有形参retnum ;;宏定义中使用参数
第9章
9.2.3 宏中的标号处理
1. 2.
把标号定义为形式参数 在宏定义中声明标号为局部标号 局部标号伪指令格式
LOCAL LAB1[,LAB2,…]
功能
LOCAL的作用就是要告诉汇编程序宏体中这些标号是局部的。
说明
LAB1,LAB2,…是宏体中出现的标号。它必须是宏定义 MACRO语句之后的第一条语句,即MACRO和LOCAL之间不能 有任何字符行。 汇编程序在宏扩展时,将对宏体中的局部标号产生唯一的标号。
MAC1 MACRO … MAC2 MACRO … MAC3 MACRO …EN源自M… ENDM … ENDM
当宏定义中嵌套 宏定义时,必须首先 调用最外层宏定义, 然后才能调用内层宏 定义。下面是一个宏 嵌套的例子。
例9.6 用嵌套的形式定义将AL中的数据转换为两个十六进制数的ASCII码的宏指令。 有如下宏调用: BHTOA1 MACRO MOV AH, AL AHHN MACRO LOACAL AHHN1 MOV CL, 4 SHR AH,CL CMP AH,10 JC AHHN1 ADD AH,7 AHHN1: ADD AH,30H ENDM ALLN MACRO LOCAL ALLN1 AND AL,0FH CMP AL,10 JC ALLN1 ADD AL,7 ALLN1: ADD AL,30H ENDM ENDM BHTOA1 AHHN ALLN 1 AHHN

arm 汇编指令macro mend用法

arm 汇编指令macro mend用法

ARM 汇编指令宏指令的使用方法一、ARM 汇编指令概述1. ARM 汇编指令是一种低级语言,用于编写嵌入式系统和嵌入式软件。

它是 ARM 处理器的指令集体系结构的一部分,可以直接控制处理器的行为。

2. ARM 汇编指令可以分为数据处理指令、分支指令、访存指令、特权指令等多种类型,其中宏指令是一种特殊的汇编指令,可以简化汇编语言的编写。

二、ARM 汇编宏指令概述1. ARM 汇编宏指令是一种用于编写汇编程序的高级语言结构,它可以通过宏展开的方式,将一组汇编指令替换成一个复杂的指令序列,从而提高程序的可读性和可维护性。

2. ARM 汇编宏指令在汇编程序中起到了类似函数的作用,可以实现代码的重用,降低了程序开发的难度。

三、ARM 汇编宏指令的基本语法1. ARM 汇编宏指令的语法包括宏定义和宏使用两个部分,宏定义用于定义一个宏指令,宏使用则用于在程序中使用定义好的宏指令。

2. ARM 汇编宏指令的基本语法如下:宏定义:.macro 宏名称参数列表宏内容.endm宏使用:宏名称参数列表四、ARM 汇编宏指令的定义与使用实例1. 定义一个简单的宏指令,用于实现两个寄存器的相加:.macro add_regs reg1, reg2, resultadd \result, \reg1, \reg2.endm2. 在程序中使用定义好的宏指令:mov r0, #1mov r1, #2add_regs r0, r1, r2五、ARM 汇编宏指令的高级用法1. 在实际的软件开发中,宏指令可以实现更加复杂的功能,例如实现循环、条件判断、异常处理等。

2. 通过合理的设计和使用宏指令,可以使汇编程序更加模块化和灵活,提高软件开发的效率和质量。

六、总结在 ARM 汇编程序中,宏指令是一种非常有用的工具,通过合理的设计和使用,可以使程序更加易读易维护,提高开发效率和质量。

掌握ARM 汇编宏指令的使用方法对于 ARM 汇编程序员来说是非常重要的一项技能。

第7章 高级宏汇编语言

第7章 高级宏汇编语言

二.不定重复伪操作(P264)
1.IRP (1)格式:IRP 形参,<参数表> 格式: 形参,<参数表> 格式 ,<参数表 … ENDM (2)说明:重复次数由参数表中的参数个数决定,参数表用<>括起 说明: <>括起 说明 重复次数由参数表中的参数个数决定,参数表用<> 参数间用,隔开,每重复一次, 来,参数间用,隔开,每重复一次,依次用参数表中的参数来代 替形参一次。 替形参一次。 Ex7.17 :IRP x,<1,2,3,4,5,6,7,8,9,10> DB x ENDM
PUSH BX
展开后
Ex7.19
PUSH CX PUSH DX
§3.条件汇编(P265)
根据条件判断是否把一段程序包括在汇编语言程序内, 根据条件判断是否把一段程序包括在汇编语言程序内,这用条 件汇编来实现

一.条件伪操作的一般格式 条件伪操作的一般格式 IF XX … [ELSE] … ENDIF 二.条件伪操作可以在宏定义体内、体外,也允许嵌套任 条件伪操作可以在宏定义体内、体外, 条件伪操作可以在宏定义体内 意次。 意次。 Ex: p266 7.21 宏指令 宏指令MAX把三个变元中的最大值放在 把三个变元中的最大值放在 AX中 中
Ahex db ‘A’ A result db ? data ends code segment cs:code,ds: assume cs:code,ds:data main proc far start: start: mov ax,data mov ds,ax hexbin ahex,result ah,4 mov ah,4ch 21h int 21h main endp code ends
形参
宏调用 MULTIPLY CX,VAR,XYZ[ BX ] , ,

A51的汇编控制指令即宏指令

A51的汇编控制指令即宏指令

A51汇编器是运行于IBM PC系列及其兼容机上的交叉汇编软件,其主要功能是将MCS-51系列单片机汇编语言源程序翻译成符合Intel目标文件格式的可再定位的目标代码,经过L51连接器的连接和装配,产生可被DS51仿真器调试或其它任何一种与Intel 目标文件格式兼容的仿真器使用的绝对目标代码.一:A51的符号:在A51中可使用符号表示数值(EQU),地址和寄存器名,符号具有段类型,作用域,值域和可变性等属性.符号的段属性:指出符号所位于的地址空间.段类型有:NUMBER 无类型符号DATA DATA段符号(可直接寻址的内部RAM空间)IDATA IDATA段符号(可间接寻址的内部RAM空间)XDATA XDATA段符号(外部数据存储空间)BIT BIT段符号(内部RAM低地址区的可位寻址的空间)CODE CODE段符号(程序存储器空间)REGISTER 寄存器符号作用域:指出符号是外部的,局部的还是全局的.(PUBLIC,EXTRN关键字说明) 二:标号:定义标号时,标号名后必须接冒号”:”,以示区别,每行只能定义一个标号,标号一经定义,其值为当前地址计数器的当前值,因此标号代表了指令和数据的地址,不能重复定义.三:特殊的汇编符号:A51宏汇编语言定义了代表CPU寄存器的特殊符号,这些是保留的关键字,AR0---AR7:表示当前工作寄存器的R0—R7的绝对地址,它的值取决于指令所选择的工作寄存器组.四:运算符:有三种1):算术运算符包括:+,-(正负号),加---+,减,乘,除,MOD(取模),()—括号,改变运算顺序.2):二进制运算符号:用来对二进制数进行按位取反,移位或逻辑运算.包括:NOT(按位取反),HIGH(取右边操作数的高8位,LOW(取右边操作数的低8位)SHR(右移位),SHL(左移位),AND(逻辑与),OR(逻辑或),XOR(逻辑异或). 3):关系运算符:>=,<=,<>,=,<,>.所有运算符的优先级顺序:()→NOT,HIGH,LOW→+,-(正负号)→*,/,MOD→+,-(加减)→SHR,SHL→AND,OR,XOR→>=,<=,<>,>,<,=.数值表达式:数值表达式由运算符和操作数组成,一个操作数又可以是表达式,与符号具有段属性一样,表达式也具有段类型属性,表达式的类型依赖于操作数的类型.表达式的类型如下:BIT,NUMBER,CODE,DATA,IDATA,XDATA.大多数的表达式是无类型的,当表达式中包含有段类型的操作数或者是子表达式时,运算结果的段类型遵循下面的原则:对于单目运算符:(+/-/HIGH/LOW/NOT)表达式的结果与操作数具有相同的类型. 对于所有的双目运算符(除+/-),表达式的结果均为无类型的结果.对加减运算,只有当其中的一个操作数具有段类型的时候,运算结果才具有相同的段类型,如果两个操作数具有段类型,即使他们的段类型一样,结果也是无类型的(NUMBER).总结:只有当操作数加上或者是减去一个无类型时,才可能产生一类型,其他所有的组合均产生无类型的表达式.A51提供了伪指令,可以利用这些伪指令在汇编程序中定义符号,保留和初始化存储空间,定位目标代码等功能,伪指令中除DB,DW外均不产生目标代码,但可以改变汇编器的状态,并将有关信息(如段定义)加到目标文件中.伪指令分四类:1):定义符号:SEGMENT,EQU,SET,DATA,IDATA,XDATA,BIT,CODE2):保留和初始化存储空间:DS,DB,DW,DBIT3):程序链接:PUBLIC,EXTRN,NAME4):汇编状态控制和段选择:ORG,END,RSEG,CSEG,DSEG,XSEG,ISEG,BSEG,USING一:定义符号的伪指令1)SEGMENT格式: 段名符号 SEGMENT 段类型 [再定位类型]SEGMENT指令可声明一个可再定位(区别于CSEG,DSEG,XSEG,BSEG,ISEG等定义的在相对应的空间固定地址定义的绝对段—在连接的过程中不允许重新定位)的段符号和一个可选的再定位类型,段符号可以用来定义段,L51连接器可将多个模块内的具有相同段名和再定位类型的几个段合成为一个段.段类型说明了段所处的地址空间.如果是编写的汇编程序要与C源程序接口,即被C源程序调用,则全部的汇编子程序所命名的定义的代码段的段名必须是可用SEGMENT来定义的,而且名字的命名的方法也应该参照C51编译器产生的局部段的段名的转换规则.段名的作用主要是在汇编的时候用RSEG来激活的,在连接定位的时候用到的.与段名相应的是用于存储和传递参数的别名,可以在汇编源程序中直接应用局部段的别名,这个别名主要是在传递函数参数的时候用的.在汇编程序中要用PUBLIC 声明被其他模块引用的全局符号.DATA (可直接寻址的内部RAM空间)IDATA (可间接寻址的内部RAM空间)XDATA (外部数据存储空间)BIT (内部RAM低地址区的可位寻址的空间)CODE (程序存储器空间)可选的再定位类型定义了L51连接时的定位方式,再定位类型:UNIT:定义一个可开始于任一单元的段对于BIT型的段,一个单元是一个位,其它所有的段一个单元是一个字节.PAGE:定义一个起始地址必须是256的整数倍的段,段的绝对地址由L51自己计算,该类型只允许用于XDATA和CODE类型段.INPAGE:定义一个由L51连接后必须包含在256B的块中,只适用于XDATA和CODE 段.INBLOCK:定义一个L51连接后必须包含在2KB中的段,只适用于CODE段. OVERLAYABLE:定义一个可与其他段交叠的覆盖段,其段名符号必须按C51或者PL/M51的规则命名.C51把局部数据段和局部位段定义成?DT?FUNCTIONNAME?MODULENAME和?BI?FUNCTIONNAME?MODULENAME这是在small模式下.其他的模式略有不同。

汇编语言宏指令语句

汇编语言宏指令语句
示。
参数传递
在宏调用时,将参数值传递给宏的参 数占位符,以便在宏体中使用这些值。
可选参数
可选参数是指在宏定义中未指定的参 数,可以在宏调用时选择是否传递。
参数替换
在宏体中,可以使用参数占位符来表 示参数,并在宏调用时将参数值替换 到相应的占位符位置。
03
汇编语言宏指令语句的分类
数据宏指令语句
总结词:定义数据
可视化
可视化编程工具的发展将为汇编 语言宏指令语句提供更好的支持, 使编程更加直观和方便。
THANKS
感谢观看
宏调用
宏调用
在程序中,使用宏名称和参数列表来调用宏 。
参数替换
在宏体中,可以使用参数占位符来表示参数,并在 宏调用时将参数值替换到相应的占位符位置。
宏展开
在程序预处理阶段,将宏定义的指令语句展 开到程序中相应的位置,以实现代码复用。
宏参数
位置参数
位置参数是指在宏定义中按照顺序指定 的参数,可以在宏体中使用占位符来表

02
汇编语言宏指令语句基础
宏定义
01
02
03
04
宏定义
在汇编语言中,宏是一 种预处理指令,用于定 义一个或多个宏指令语 句,以便在程序中重复 使用。
宏名称
宏的名称是自定义的标 识符,用于在程序中引 用宏。
宏参数
宏可以接受参数,以便 在宏调用时传递值。
宏体
宏体包含宏定义的指令 语句,这些语句将在宏 调用时被替换。
操作数宏引用
在指令中使用操作数宏,例如:`MOV AX, @REG`。
控制流宏指令语句实例
无条件跳转宏
使用`JMP`指令,可以定义无条件跳转宏, 例如:`JMP label`。

汇编语言入门教程PPT-第七章宏定义

汇编语言入门教程PPT-第七章宏定义

mainbegin @data
;建立DS内容
dispmsg msg1
;显示msg1字符串
dispmsg msg2
;显示msg2字符串
mainend
;返回DOS
end start
• &——替换操作符,用于将参数与其 他字符分开。如果参数紧接在其他 字符之前或之后,或者参数出现在 带引号的字符串中,就必须使用该 伪操作符
;宏定义 dstring macro string
db ’&string&’,0dh,0ah,’$’ endm
;宏调用
传递注释符
dstring < This is a example. >
第七章第一高章级汇基编础语知言识技术
第七章第一高章级汇基编础语知言识技术
第七章第一高章级汇基编础语知言识技术
第七章第一高章级汇基编础语知言识技术
第七章第一高章级汇基编础语知言识技术
例 宏指令GOTO L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)可以 根据不同情况产生无条件转移指令或比较和条件转移指令。
dstring < 0 !< Number !< 10 >
转义注释符
;宏展开
1
db ’This is a example.’, 0dh,0ah,’$’
1
db ’0 < Number < 10’, 0dh,0ah, ’$’
与宏有关 的伪指令
• 局部标号伪指令 LOCAL 标号列表 宏定义体采用了标号,应使用LOCAL加以说明 它必须是宏定义MACRO语句之后的第一条语句
;; 有参数
endif
int 21h

宏汇编 汇编语言第5章

宏汇编 汇编语言第5章

需要利用寄存器、存 储单元或堆栈等传递 参数

比较 结论
子程序
相同点:简化源程序的设计和结构 不同点: ※ 对目标程序的长度影响不同。 ※ 对目标程序执行速度的影响不同。 ※ 传递参数的方式不同;传递参数过程中如出现错误,错误 的性质不同。(宏:语法;子程序:逻辑) 宏与子程序具有各自的特点,程序员应该根据具体问题选择 使用那种方法 通常,当程序段较短或要求较快执行时,应选用宏;当程序 段较长或为减小目标代码时,要选用子程序
例如:对上面的宏定义的调用形式为:

FILLSEG DATA ; DATA为数据段的段名
┆ 说明:(1)汇编时,汇编程序对每个宏调用作宏展开 ––– 用宏 定义体取代源程序中的宏指令名,用实参代替宏定义中的形参。 取代时,实参和形参是一一对应的。 若实参个数>形参个数,则 多余实参不考虑 , 若实参个数 <形参个数,则多余形参作“空” 处理。 (2)取代后,所得到的语句应该是有效的,否则汇编程序将会指 示出错。 (3)每调用一次就把宏定义体展开一次,因而它占有的存储空间 与调用次数有关。
比较

仅是源程序级的简化: 宏调用在汇编时进行 程序语句的展开,不 需要返回;不减小目 标程序,执行速度没 有改变
子程序
还是目标程序级的简 化:子程序调用在执 行时由CALL指令转向、 RET指令返回;形成的 目标代码较短,执行 速度减慢
通过形参、实参结合 实现参数传递,简捷 直观、灵活多变
表达符操作%示例。 DA MACRO A, B, C, D DW A, B, C DB D DUP(0) 则相应的宏展开为: 1 DW 12, 5, 30 1 DB 15 DUP(0) 1 DW X+2, 5, X+Y 1 DB Y-5 DUP (0)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ENDM 宏调用:
… ADD X , Y , Z
;使用宏ADD
PURGE ADD …
;使用指令ADD
当然,最后能不能达成所愿,还要具体看编译器是怎么来支持 的!
6. 宏定义的嵌套 宏定义的嵌套有两种情况:宏定义体中含宏调用;宏定义体中 含宏定义。 (1)宏定义体中宏调用 宏汇编语言允许在宏定义体中使用宏调用,但限制条件是:必 须先定义后调用。 例如: DIF MACRO X , Y ; X – Y 送 AX
??0001: …
(2) 清除宏定义的为指令PURGE
格式: PURGE 宏名表
例如:

AAA MACRO

ENDM


;宏AAA可以有效使用的区间

PURGE AAA


;宏AAA不可有效地使用

例:利用宏指令修改某些助记符意义
宏定义:
ADD MACRO OP1 , OP2 , RESULT

例如,把通过DOS的1功能调用从键盘读入一个字符的程序片 段定义为一个宏:
GETCH MACRO
MOV AH , 1 INT 21H ;从键盘键入一个字符时,该字符存入AL
ENDM
在定义宏指令后,就可以通过宏指令来表示对应的程序片段, 这成为宏调用。其格式为:
宏指令名 [实参表]
在对源程序汇编时,汇编程序把程序中的宏指令替换成对应的 宏定义体,这称为宏展开或宏扩展。如:
(2)表达式运算符 % 在宏调用时,使用该运算符把其后表达式的结果作为宏参替换,
而非表达式自身。 宏MSGGEN的定义方式如上例。 则调用 MSGGEN MSG , %(2 + 3) , ‘TOM’ 展开为:
MSG5 DB ‘HELLO MR.TOM’ , 0DH , 0AH , 24H
5. 与宏有关的伪指令 (1)局部标号说明伪指令 LOCAL 格式:LOCAL 标号表 标号表由标号构成,标号间用逗号分隔。 汇编程序在每次展开时,总把由LOCAL伪指令说明的标号用 唯一的符号(??0000至??FFFF)代替,从而避免标号重 定义错误。 例如:定义一个取绝对值的宏
SAL AL , CL 如上述代码要多次使用,就可以定义为: SHIFT MACRO
MOV CL , 4 SAL AL , CL ENDM
但是,如果每次的移位次数不同了,则可定义为: SHIFT MACRO X ;X为参数
MOV CL , X SAL AL , CL ENDM 这是,调用方式可为: SHIFT 4 ;移4位 SHIFT 6 ;移6位,显然,有参数时使用起来更灵活。 2. 宏指令的参数可以是操作码 例如:有下面的宏定义:
(2)宏定义体中定义宏指令
宏定义体中还允许包含宏定义,但是只有在调用了外围的宏后, 才能调用内层的宏。
MOV AX , X
SUB AX , Y
ENDM
DIFSQR MACRO OPR1 , OPR2 , RESULT; ( X – Y)2 送 AX
PUSH DX
PUSH AX
|
POP AX
DIF OPR1 , OPR2 ;注意堆栈 |
POP DX
IMUL AX
|
ENDM
MOV RESULT , AX
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
4. 两个特殊的宏运算符 (1)强迫替换运算符 & 在宏定义中,若参数在其它字符的紧前或紧后,或者参数出现 在带引号的字符串中时,就必须使用该运算符,以区分参数。 例:在下面宏指令JUMP中,参数CON作为操作码一部分。 JUMP MACRO CON , LAB
J&CON LAB ENDM 则调用时,JUMP NZ HEAR -> JNZ HEAR JUMP Z , THERE -> JZ THERE
例:在下面宏指令MSGGEN中,两个参数合并成一个标号, 一个参数用在字符串中。 MSGGEN MACRO LAB , NUM , XYZ
LAB&NUM DB ‘HELLO MR.&XYZ’ , 0DH , 0AH , 24H MSGGEN 则调用 MSGGEN MSG , 1 , TAYLOR 展开为:MSG1 DB ‘HELLO MR.TAYLOR’ , 0DH , 0AH , 24H
……
….
GETCH
对应为 --->
MOV AH , 1
……
INT 21H

尽管都实现了调用,但是宏调用和子程序的调用是有差别的:
宏调用更多地是表示一种替换!
(二)宏指令的用途 1. 缩短源代码 2. 扩充指令集 3. 更改某些指令助记符的意义 (宏指令的优先级高于指令和伪指令)
(三)宏指令中参数的使用 宏指令可以不带参数,但往往带有参数的宏指令更具灵活性。 1. 指令的参数可以是常数、寄存器和存储单元,还可以是表达 式。 例: MOV CL , 4
“SHIFT 6 , BX , AR” 或 “SHIFT 8 , SI , HR ”等等。
3. 宏调用参数个数可以与定义时不一致 正常情况下,宏调用时使用的实参个数应该与宏定义时的形参 个数一致,但汇编程序并不要求他们它们必须相等。 若实参个数多于形参个数,那么多余的实参被忽略; 若实参个数少于形参的个数,那么多余的形参用“空”代替。
参数还可以是操作码的一部分:
SHIFT MACRO X , Y , Z
MOV CL , X
S&Z Y , CL
;&起符连接作用
ENDM
调用:SHIFT 4 , AL , AL 展开为:
MOV CL , 4 ;4为参数X
SAL AL , CL ;第1个“AL”为参数Z,第2个“AL”为参数Y
该宏的调用方式还可以是:
MANDM MACRO OPR , X , Y MOV AX , X OPR AX , Y MOV X , AX
ENDM 该宏定义的意思是?????
改宏被调用和展开的时候,意义就明确了。如: MANDM MOV , [BX] , [SI] MANDM ADD , [BX] , ES:[1234H]
相关文档
最新文档