高级汇编语言技术(2).ppt
汇编语言 PPT课件
;宏定义
shlext macro shloprand,shlnum
push cx
mov cl,shlnum
shl shloprand,cl
pop cx
endm
;宏指令
shlext ax,6
;宏展开
1
push cx
1
mov cl,06
1
shl ax,cl
1
pop cx
例5.5a
;统一4条移位指令的宏指令
xor al,al
sumd: add al,bx ;求和:AL←AL+DS:BX
inc bx
loop sumd
ret
checksumd endp end
列表文件
第5章
5.2 宏结构程序设计
宏汇编 重复汇编 条件汇编 ——统称宏结构
宏 Macro 是汇编语言的一个特点, 它是与子程序类似又独具特色的另一 种简化源程序的方法
例5.10
;;如果num < 100,则汇编如下语句 ;;否则,汇编如下语句
pdata 12 db 12 dup
pdata 102 db 100 dup
;宏调用① ;宏汇编结果①
;宏调用② ;宏汇编结果②
宏汇编、重复汇编和条件汇编
为源程序的编写提供了很多方便,
灵活运用它们可以编写出非常
宏
良好的源程序来
例题5.4-2/3 mainend MACRO retnum ;;返回DOS,可不带参数
ifb <retnum> mov ah,4ch ;;没有参数
else mov ax,4c00h+ retnum AND 0ffh
;; 有参数 endif int 21h ENDM
汇编语言和高级语言
的程 序翻译成与之等价的机器语言程序的 翻译程序,它是完成汇编工作的程序。 汇编语言程序是指用汇编语言写 的程序。
计算机如何读懂高级语言
• 高级语言是面向用户的语言。无论何种机型的计算机,只要配备上相应的高级 语言的编译或解释程序,则用该高级语言编写的程序就可以通用。 • 计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算 机时,通过“翻译程序”翻译成机器语言形式的目标程序,计算机才能识别和执 行。这种“翻译”通常有两种方式,即编译方式和解释方式。 • 编译方式是:事先编好一个称为编译程序的机器语言程序,作为系统软件存放 在计算机内,当用户由高级语言编写的源程序输入计算机后,编译程序便把源程 序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该 目标程序,以完成源程序要处理的运算并取得结果。 • 解释方式是:源程序进入计算机时,解释程序边扫描边解释作逐句输入逐句翻 译,计算机一句句执行,并不产生目标程序。PASCAL、FORTRAN、COBOL 等高级语言执行编译方式;BASIC语言则以执行解释方式为主;而PASCAL、C 语言是能书写编译程序的高级程序设计语言。 • 每一种高级(程序设计)语言,都有自己人为规定的专用符号、英文单词、语法 规则和语句结构(书写格式)。高级语言与自然语言(英语)更接近,而与硬件功能 相分离(彻底脱离了具体的指令系统),便于广大用户掌握和使用。
汇编语言和高级语言
讲解人:刘景景 制作者:306宿舍
本节主要教学内容
• • • • 了解汇编语言和高级语言的概念。 明确汇编程序和汇编语言程序的关系。 掌握计算机如何读懂高级语言。 熟悉最常见的五种高级语言及其优缺点
汇编语言和高级语言的概念
汇编语言是一种功能很强的程序设计语言,也是利用计算 机所有硬件特性并能直接控制硬件的语言。它是面向机器的程序 设计语言。 高级语言是相对于汇编语言而言的,它是较接近自然语言和 数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解 的方式编写程序。高级语言并不是特指的某一种具体的语言,而 是包括很多编程语言,c,c++,pascal,python,lisp,prolog等等,这 些语言的语法、命令格式都不相同。
汇编语言_PPT课件
可以像下例一样声明结构数组,其中AllPoints的每个元素都被初
始化为<0,0>:
NumPoints=3 AllPoints COORD NumPoints DUP(<0,0>)
循环遍历数组 使用间接寻址或变址寻址来操纵结构数组时通常要使用循环。
调用mPutChar:
mPutChar ‘A’
1 push eax 2 1 mov al,’A’ 3 call WriteChar 4 1 pop eax
左边的“1”表示宏展开的层次。
宏的例子
mWriteStr宏 mReadStr宏 mGotoxy宏
冲突的检查:一定要确保作位参数传递的寄存器值不与宏内使用的寄存器
开销。但使用宏也有一个缺点:大量使用宏会增大程序的体积,因
为对宏的每次调用都要在程序中插入宏的一份新的拷贝。
下面的NewLine宏只包含一条调用Crlf库过程的语句:
NemLine MACRO call Crlf
ENDM
这个定义一般放在数据段之前,在接下来的代码段中,我们调用该 宏:
.code NewLine
声明结构变量
我们可以声明结构的一个实例,称为结构变量(structure variables),并用特定值进行初始化,如果声明的时候使用尖括号
<>(或大括号{}),编译器将保留默认的域初始值;或者还可以向特 定的域中插入新值。例如
.data
point1 COORD <5,10>
point2 COORD <>
的文本文件中,对于后者要使用INCLUDE伪指令使之在编译时被插
汇编与高级语言
汇编与高级语言1.汇编基础知识1.1.寄存器说明:●ESP和EBP对高级语言的函数实现起着非常重要的作用。
●FS是SEH(Structured Exception Handling)中起重要作用的一个段寄存器,它的0偏移指向异常结构连表的表头,Windows在进行结构化异常处理时,就是从FS:[0]开始遍历异常结构并调用其中的异常处理函数的。
1.2.堆栈堆是一块内存区域,一般用于内存的动态分配和释放,比如用New方法分配一个指针,此时即在程序地址空间的堆中分配了一块内存。
又比如Delphi的对象也是在堆中创建的。
栈是一种先进后出的列表数据结构,在高级语言的编程中使用广泛,在低级语言中更是不可或缺的基础概念。
栈也是一个内存区域,不过它具有快速灵活的特点,CPU直接提供指令去访问栈。
从汇编的角度来看,栈具有如下的性质:●栈有两个基础动作,压栈(PUSH)和出栈(POP)。
●栈是向下增长的,即每压一次栈,栈顶的地址就减少一次,也可以说ESP的值就减小一次。
●栈是线程相关的,每一个线程都拥有一个栈。
●程序利用ESP可以很灵活地访问栈,不一定要执行PUSH和POP栈顶才会改变,直接操作ESP也可以改变栈顶,也就是说ESP决定了栈顶的值。
●栈是有最大值的,通过编程环境可以设置,超出最大值就会发生栈溢出。
看一个简单的例子,下面的指令是一条压栈指令,意思是将EAX的值压入栈中:PUSH EAX根据上面的性质,这条指令等价于下面的指令:SUB ESP, 4MOV ESP, EAX用下面的图表示指令的操作过程:2.调用规则2.1.从汇编的角度看函数调用汇编语言没有变量的概念,因此对函数的调用,第一个要解决的问题是参数要如何传递,有的将参数放在栈中,有的将参数放在寄存器中,对于参数压栈的还要确定是从最左边的参数开始压栈,还是从最右边开始,所有这些,就构成了调用规则的内容。
第二个问题是函数如何被调用,其实很简单,就是一个跳转指令JMP,跳到函数的首地址去,并从那里开始执行指令。
宏汇编2
例7.1 用宏指令定义两个字操作数相乘,得 到一个16位的第三个操作数,作为结果。
宏定义:MULT MACRO OPR1, OPR2, RESULT 宏定义 push DX push AX mov AX, OPR1 IMUL OPR2 mov RESULT, AX pop AX pop DX ENPM
宏调用: 宏调用 MULT1 CX, VAR, xyz[BX]
MULT1 240, BX, SAVE
宏展开: 宏展开 + push DX + push AX + mov AX, CX + IMUL VAR + mov xyz[BX], AX + pop AX + pop DX
+ push DX + push AX + mov AX, 240 + IMUL BX + mov SAVE, AX + pop AX + pop DX
第二节 重复汇编
有时汇编语言程序需要连续地重复完成相 同的或者几乎完全相同的一组代码, 同的或者几乎完全相同的一组代码,这时可使 用重复汇编。 用重复汇编。
一、重复伪操作 格式:REPT expression 格式 ⋮ ENDM 其中:表达式的值用来确定重复块的重复次数 , 其中 表达式的值用来确定重复块的重复次数, 表达式的值用来确定重复块的重复次数 表达式中如包含外部或未定义的项则汇 编指示出错。 编指示出错。 重复伪操作并不一定要用在宏定义体内。 重复伪操作并不一定要用在宏定义体内。
注 : &是一个操作符, 它在宏定义体中可以作为 是一个操作符, 是一个操作符 哑元的前缀,展开时可以把 前、后两个符 哑元的前缀,展开时可以把&前 号合并而形成一个符号,这个符号可以是操 号合并而形成一个符号, 作码、操作数或是一个字符串。 作码、操作数或是一个字符串。
IBM—PC(80x86)汇编语言与接口技术-第2章 80x86计算机组织
• 80386是1985年研制出的一个32位微处理器, 内部及外部数据总线均为32位,地址线也为32 位,因此它可处理4G(232)字节的物理存储 空间。
• 1989年Intel公司又研制出新一代的微处理器 80486,80486芯片内除了有一个与80386相同 结构的主处理器外,还集成了一个浮点处理部 件FPU以及一个8K字节的高速缓冲存储器 (cache),使80486的计算速度和总体性能比 80386有了明显的提高。
• Intel公司在1982年推出了80286微处理器,它仍 然是16位结构。80286的内部及外部数据总线都 是16位的,但它的地址线是24位的,可寻址16M 字节的存储空间。
80286有两种工作方式,即实模式和保护模式: 实模式与8086工作方式相同,但速度比8086快。
保护模式除了仍具有16M字节的存储器物理地址空 间外,她还能为每个任务提供1G字节的虚拟存储 器地址空间。保护方式把操作系统及各任务所分配 到的地址空间隔离开,避免程序之间的相互干扰, 保证系统在多任务环境下正常工作。
• 8086是1978年Intel公司推出的16位微处理器。
(1)8086有16位数据总线,处理器与外部传送数据 时,一次可传送16位二进制数。
(2)8086有20位地址总线,寻址空间提高到1M字节。
(3)8086采用了流水线技术,可以实现处理器的内 部操作与存储器或I/O接口之间的数据传送操作重叠 进行,从而提高了处理器的性能。
2.2 基于微处理器的 计算机系统的构成
硬件:
中央处理机 CPU
总线控制 逻辑 系 统 总 线
存储器
接口
...
接口
大容量 存储器
...
I/O设备
I/O子系统
第4章 汇编语言程序设计及仿真调试(2)
1/39
增强型8051单片机实用开发技术
1、设置起始地址ORG 设置起始地址ORG
ORG nn ORG伪指令总是出现在每段源程序或数据块的开始。 ORG伪指令总是出现在每段源程序或数据块的开始。它可使程序 伪指令总是出现在每段源程序或数据块的开始 员把程序、子程序或数据块存放在存贮器的任何位置。 员把程序、子程序或数据块存放在存贮器的任何位置。 ORG 0000H LJMP MAIN ┇ 在实际应用中, 在实际应用中,一般仅设置中断服务子程序的入口地址和主程序 的起始存放地址,其他的程序或常数依次存放即可, 的起始存放地址,其他的程序或常数依次存放即可,汇编程序会自动 进行存储空间的分配。 进行存储空间的分配。
4/39
增强型8051单片机实用开发技术
5、XDATA指令(Extenal Data) XDATA指令(Extenal 指令
格式: 格式: 符号名 XDATA 表达式 XDATA 指令用于将一个外部 RAM 的地址赋给指定的符号名。 的地址赋给指定的符号名。 数值表达式的值在0000H~0FFFFH之间,对于 ~ 之间, 数值表达式的值在 之间 对于STC12C5A60S2单片 单片 片内集成了1024字节的 字节的XRAM,地址范围是 机,片内集成了 字节的 ,地址范围是0000H~03FFH。表 。 达式必须是一个简单表达式。 达式必须是一个简单表达式。如: MYDATA XDATA 0020H
访问表格常数时,常用 指令。 访问表格常数时,常用MOVC A, @A+DPTR指令。 指令
3/39
增强型8051单片机实用开发技术
3、为标号赋值EQU 为标号赋值EQU
〈标号:〉 标号:〉 EQU 项或汇编符号 其功能是将一个数或特定的汇编符号赋给语句中的字符名称。 其功能是将一个数或特定的汇编符号赋给语句中的字符名称。 注意,字符名称为一自定的符号,而不是标号, 注意,字符名称为一自定的符号,而不是标号,字符名称后无 字符名称可用来作数据地址、立即数或者位地址, “:”。字符名称可用来作数据地址、立即数或者位地址,其值可 以是一个8位数 也可以是16位数 位数, 位数。 以是一个 位数,也可以是 位数。 使用EQU伪指令可以把抽象的数字或地址表示成有一定意义的 伪指令可以把抽象的数字或地址表示成有一定意义的 使用 符号,增强程序的可读性。需要注意的是,在同一程序中, 符号,增强程序的可读性。需要注意的是,在同一程序中,用EQU 伪指令对标号赋值后,该标号的值在整个程序中不能再改变。 伪指令对标号赋值后,该标号的值在整个程序中不能再改变。
高级语言和汇编语言
高级语言和汇编语言
高级语言简介
高级语言,它是在低级语言的基础上,采用接近于人类自然语言的单词和符号来表示一组低级语言程序,使编程变得更加简单,易学,且写出的程序可读性强。
高级语言的优点
1、高级语言接近算法语言,易学、易掌握,一般工程技术人员只要几周时间的培训就可以胜任程序员的工作;
2、高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;
3、高级语言远离机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好,重用率高;
高级语言的缺点。
第七章 高级汇编语言技术
<tag> movsb
movif movif movif
a
27
第七章作业
Page 278
7.1 7.5 7.9 7.16
7.3 7.7 7.14 7.17
28
11
宏库的建立与调用:
; MACRO.MAC
macro1 MACRO [哑元表] …… ENDM MACRDM
macro2
……
macroN
; EXP.ASM
include 路径\MACRO.MAC …… macro1 [实元表] …… macro2 [实元表] purge macroN …… macroN [实元表] ……
26
divisor
quotient
cnt
例:宏定义
movif macro ifidn rep exitm endif tag <&tag>, <b> movsb
ifidn rep exitm endif
ifb rep endif endm
<&tag>, <w> movsw
宏调用:
movif b w
根据条件把一段源程序包括在汇编语言程序内 或者排除在外。
一般格式: IF
自变量 ; 为条件 ; 自变量满足条件则汇编此块
……
[ELSE]
…… ENDIF
; 自变量不满足条件则汇编此块
22
IF IFE
表达式 表达式
IF1
IF2 IFDEF 符号
IFNDEF
IFB IFNB IFIDN IFDIF
cntr=0 宏调用: …… errmsg …… errmsg
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调用之前
宏库的建立: 由定义即可
16
7.1.7 PURGE伪操作
宏指令名可与指令助记符和伪指令名同名,但这时宏
push dx
push ax
宏展开:
mov ax, opr1
imul opr2 mov result, ax pop ax pop dx ENDM
指令的优先级最高,而同名的指令和伪操作便失效。 伪指令PURGE可取消宏定义,恢复指令的原来功效。 格式: PURGE 宏指令名[,宏指令名,…]
PURGE可取消多个宏定义,而各宏指令名之间应以逗号分 隔。
功能:取消宏定义,使该宏定义为空。
17
例7.1 两个字相乘
宏定义:
multiply MACRO opr1,opr2,result
* macro_name 宏指令名(宏名),调用时用。 第一个符号必须是字母(注意与名称的差异)
* [哑元表] 形参表,哑元之间用逗号隔开
* 如果宏定义体有一个或多个标号,则必须用LOCAL伪操作 列出所有的标号。???
5
宏调用
macro_name [实元表] ; 实参 * 实元表中的实元与哑元表中的哑元在位置上一一对应; * 若实元数>哑元数,则多余的实元无效; * 若实元数<哑元数,则多余的哑元作“空(NUL)”处理; * 对宏指令的调用必须先定义后调用。 * 应当注意,宏展开后,即用实参取代形式参数之后,所 得到的语句应该是有效的,否则汇编时会出错。
MASM6.0+
.XALL 默认值, 只列出产生目标码的宏展开 .LALL 列出包括注释在内的所有宏展开 .SALL 不列出任何ISTMACRO .NOLISTMACRO
;; 注释 ; 宏展开时,;;后面的注释不予展开。
15
7.1.6 宏库的建立与调用
宏库:只包含若干宏定义的文件,扩展名为MAC或LIB 宏库的调用:
[格式]LOCAL 局部标号表 [说明] 其中,局部标号表中的各标号之间用逗号分隔。 汇编程序在汇编时对局部中标号表中的各标号建立唯一 的符号(??000一??FFFF)以取代展开后的各局部标号。该 伪指令必须是宏定义体中的第一个语句,而且在MACR O和LOCAL之间还不允许有注释和分号标志。
13
7.1.4 在宏定义体内使用宏
限制条件:必须先定义后调用 在宏定义体内不仅可以使用宏, 也可以可以包含宏定义(也就是说,宏定义允许嵌套)
14
7.1.5 列表伪操作
功能: 控制汇编清单中宏展开的列出情况
源程序(ASM文件)经汇编程序汇编,主要 输出是OBJ文件和LST文件(列表文件)。 LST文件同时列出源程序和机器语言程序 清单,并给出符号表。
宏展开 ……
……
……
……
10
子程序与宏调用工作方式的差异
(1)子程序调用是在程序执行期间进行的,主程序通过CALL指令 转入于程序的入口地址去执行子程序,子程序执行完后RET指令返回到 主程序的调用处(断点处);而宏调用是通过宏指令名和实在参数(如果有 要传递的参数的话)进行调用的,而且是在汇编期间展开宏定义体的。
(2)子程序中的这组指令的机器码在存储器中只需要存放一次;而宏 调用则不同,每调用一次就把宏定义体展开一次,因而它占有的存储空 间与调用次数有关,调用次数越多则占有的存储空间就越大。
(3)子程序调用时需要用堆栈,调用子程序和返回主程序都要开销必 要的时间;而宏调用其宏定义体展开是插入在调用程序中,因此避免了 调用时跳到宏和由宏返回所开销的时间。
数等)大,增加了执行时间。适用于子功能代码较 长、调用比较频繁的情况。
宏调用:
优点:参数传送简单,执行效率高。 缺点:不节省空间,适用于子功能代码较短、传参较多的
情况。
4
宏定义
macro_name MACRO [哑元表] ; 形参/虚参 [ LOCAL 标号表 ] 一段有独立功 …… (宏定义体) 能的程序代码 …… ENDM
如何选择用子程序还是用宏调用呢?
11
7.1.2 宏定义中的参数
➢ 可以无变元 ➢ 可以是操作码 ➢ 可以是操作码的一部分,但在宏定义体中必须用
&来分隔。
➢ 变元是ASCII串
➢ %操作符
12
7.1.3 LOCAL伪操作
在宏定义中允许使用标号。如果在程序中多次使用该宏 定义时。展开后会出现标号的多重定义,这是不允许的 。但是可以用伪指令LOCAL指定局部标号。
第七章 高级汇编语言技术
宏汇编 重复汇编 条件汇编
1
问 如果在一个程序中多次使用同一组指令时,为了避免每
次都要重写,该如何解决?
方法1、把这组指令写成一个子程序,每次需要执行时
只要调用这个子程序就可以了。
方法2、当这组指令较短或不适合把它写成一个子程序
时,可以把它义成一个宏,每次需要执行时就
去调用这个宏。
2
7.1 宏汇编
为用户提供更加容易、更加灵活、更加向高级语言靠拢的 汇编工具。
宏:源程序中一段有独立功能的程序代码。 宏指令:用户自定义的指令。在编程时,将多次使用的功能
用一条宏指令来代替。 指令
汇编语言程序语句 伪指令(伪操作) 宏指令
3
子程序:
优点:模块化,节省内存,可被多次调用,编程效率高。 缺点:额外开销(保存返回地址,计算转向地址,传递参
子程序:在程序执行期间被调用,只占用自身大小的一段空间。
主程序 …… call sub1 …… call sub1 …… call sub1 ……
子程序 sub1 …… …… …… ret
9
宏调用:在汇编期间被展开,每调用一次就把宏定义体 展开一次。
宏定义 Q macro x,y
endm
宏调用
…… Q a,b …… Q c,d …… Q e,f ……
6
宏展开
源程序被汇编时,汇编程序把宏调用展开,也就是把宏 定义体复制到调用宏指令的位置上,同时用实元取代哑元 ,由LOCAL定义的标号也由??0000~??FFFF替代。
7
实元(在使用上要比子程序灵活)
常数、寄存器、存贮单元 用寻址方式能找到的地址、表达式 指令的操作码、操作码的一部分
8
宏调用与子程序调用的区别: