930 likes | 1.19k Views
第 5 章 汇编语言基础. 本章重点: 理解汇编语言的基本概念 掌握 80X86 指令操作数及偏移地址的寻址方式,微处理器基本指令及应用,源程序的基本结构 了解伪指令的功能 掌握定义数据、符号、段、过程等伪指令的使用方法 能编写格式正确的汇编程序等。. 5.1 MASM 汇编语言基础. 5.1.1 汇编语言的基本概念 。程序设计语言一般可分为机器语言、汇编语言和高级语言三大类。 机器语言是唯一能被计算机直接识别和执行的二进制指令代码集合所表示的面向机器的语言。
E N D
第5章 汇编语言基础 本章重点: 理解汇编语言的基本概念 掌握80X86指令操作数及偏移地址的寻址方式,微处理器基本指令及应用,源程序的基本结构 了解伪指令的功能 掌握定义数据、符号、段、过程等伪指令的使用方法 能编写格式正确的汇编程序等。
5.1 MASM 汇编语言基础 • 5.1.1 汇编语言的基本概念 • 。程序设计语言一般可分为机器语言、汇编语言和高级语言三大类。 • 机器语言是唯一能被计算机直接识别和执行的二进制指令代码集合所表示的面向机器的语言。 • 汇编语言是一种面向机器的低级程序设计语言。汇编语言以助记符的形式表示每一条计算机指令,用指令助记符、符号地址和标号等书写程序的语言。汇编语言源程序就是用汇编语言编写的程序,简称汇编语言程序。 • 汇编语言源程序必须翻译转换成机器语言才能执行. • 本书采用微软的MASM 6.11,这是MASM的最后一个独立版本,可免费升级为MASM 6.14(支持奔腾3),也可升级为MASM 6.15(支持奔腾4)。
5.1 MASM 汇编语言基础 • 1、汇编语言的主要特点: • (1)汇编语言的优点: • 汇编语言程序与处理器指令系统密切相关; • 程序员可直接、有效地控制系统硬件; • 形成的可执行文件运行速度快、占用主存容量少,可以编写在“时间”和“空间”两方面最有效的程序。 • (2)汇编语言的缺点: • 与处理器密切有关; • 需要熟悉计算机硬件系统、考虑许多细节; • 编写繁琐,调试、维护、交流和移植困难。 • 2、汇编语言的应用场合 • ● 程序要具有较快的执行时间,或者只能占用较小的存储容量; • ● 程序与计算机硬件密切相关,程序要直接、有效地控制硬件; • ● 大型软件需要提高性能、优化处理的部分; • ● 没有合适的高级语言、或只能采用汇编语言的时候; • ● 分析具体系统尤其是该系统的低层软件、加密解密软件、分析和防治计算机病毒等。
5.1 MASM 汇编语言基础 • 5.1.2 汇编语言的语句格式 • 编程的第一步是编写源程序。源程序文件必须保存为扩展名为.asm的文件,且文件名不能超过8个ASCⅡ码字符。源程序所使用的指令包括两种,硬指令和伪指令。硬指令是指机器已存在的指令,反汇编后仍然是这条指令。如 • MOV AX,1000H • 伪指令是告诉编译器的一些说明性语句,但CPU中无此指令。如 • A1 DB 12H • 这是用伪指令DB定义字节变量的语句并标记为A1的地址。
什么是指令系统 • 计算机的指令系统就是指该计算机能够执行的全部指令的集合 • 每种计算机都有它支持的指令集合 • 16位8086指令系统是Intel 80x86系列微处理器指令系统的基础 • 一定要采用调试程序DEBUG进行实践
调试程序DEBUG • DEBUG是常用的汇编语言级调试工具,为汇编语言程序员提供了分析指令、跟踪程序的有效手段 • 常用命令: -A 汇编 -U 反汇编 -T 单步执行 -G 断点执行 -D 数据显示 -R 寄存器 感性认识因深刻而显重要
5.1 MASM 汇编语言基础 • 5.1.3 语句类别 • 在汇编语言中所使用的语句,可分为指令语句、伪指令语句和宏指令语句3种基本的语句。 • 用汇编语言编写的源程序是由许多条汇编指令组成的,每个语句包含1~4项组合,即标识符(label)、指令(instruction)、操作数(operand)及注释(comment)。 • 1、 指令语句 • 指令语句格式: [标号:] 指令助记符 [操作数],[操作数] [;注解]
5.1 MASM 汇编语言基础 • 2、 伪指令语句 • 伪指令语句格式: • [名字] 伪指令定义符 [表达式] [;注解] • 伪指令语句(也称指示性语句),只是给汇编程序提供一些控制信息,帮助汇编程序正确汇编指令性语句,在汇编时被执行,没有对应的机器码,称伪指令语句;且汇编时,伪指令语句不被编译成机器指令;在执行时无相应的指令可执行。 • ① 伪指令语句指导软件MASM的执行过程,告诉MASM汇编阶段如何做,亦即指导汇编过程。 • ② 伪指令定义符表示不同的伪指令。 • [例5.1.2] • XXX DB 50 • YYY DB ‘HOW ARE YOU’ • CONT EQU 5 • 上面都是伪指令语句,它们只是给汇编程序提供一些控制信息,帮助汇编程序正确汇编指令性语句。
5.1 MASM 汇编语言基础 • 3、 宏指令语句结构 • 宏指令语句格式: • [宏名] 宏操作助记符 [操作数] [;注释] • 说明:①、宏名即宏指令名,是一标识符,宏名后面不能有“:”; • ②、宏操作助记符共有8个,分别是MACRO、ENDM等; • ③、其余同伪指令语句。 • [例5.1.3] 定义宏指令CHY10实现AX内容乘以10的功能。 • CHY10 MACRO ;宏定义 • PUSH DX • SAL AX,1 • MOV DX,AX • SAL AX,1 • SAL AX,1 • ADD AX,DX • POP DX • ENDM ;宏结束
5.2 操作数的寻址方式 • 8086/8088指令的基本格式是由操作码和操作数(或操作数地址)两部分组成。操作码说明了指令的功能;操作数(或操作数地址)则是指令操作的对象。 • 操作数有源操作数和目的操作数。源操作数(source operand)指明数据的来源地址,目的操作数(object operand)指明接收数据的地址。 • 按照操作数的来源分为4种类型: • 立即数寻址:操作数在指令中;如:MOV AL,100 • 寄存器寻址:操作数在指令给出的寄存器中;如:ADD AX,BX • 存储器寻址:操作数在指令给出的内存单元中;此时指令中应给出的是存储器的地址,当然一般是有效地址,段地址是通过隐含方式取得的。 • 外设型:操作数在指令给出的外设单元中。
5.2 操作数的寻址方式 • 5.2.1 立即寻址 • 操作数是一个立即数,直接包含在指令中,可以是8位或16位。关于立即数寻址,说明如下: • ① 立即数只能作为源操作数出现在指令中; • ② 主要用于给存储器或寄存器赋初值; • ③ 立即数可以是一个运算数或地址值,也可用一个符号名表示。 • [例5.2.1]: • ① MOV AL,100 ;源操作数100是立即数 • ② MOV BX,0100H ;立即数为十六进制数常量 • ③ MOV AL,1010B ;立即数为二进制数常量 • ④ MOV AL,‘3’ ;立即数为字符形式 • ⑤ MOV AX,3064H ;在程序存储器中,从低地址到高地址存储次序依次为:操作码MOV、操作数低字节64H、高字节30H,指令执行后(AH)=30H,(AL)=64H 如图5-1所示。 • ⑥ MOV CX,N ;符号常量N在数据段定义:N EQU 10
5.2 8086/8088寻址方式 ? 什么是寻址方式 寻址方式:指令中给出操作数的有效 地址的各种方法。 存放操作数的地方:指令、寄存器、存储器中 故操作数类型有:立即数、寄存器操作数、 存储器操作数
寻址方式 一、立即寻址方式 二、寄存器寻址方式 三、存储器寻址方式 返回本章首页
操作数分为源操作数和目的操作数两种 目的操作数 源操作数 操作码(OP) MOV AX, 1234H 目标操作数存放操作结果;源操作数在指令 执行过程中保持原值不变. 寻址方式常指源操作数的寻址方式。
5.2 8086/8088寻址方式 如:MOV AX,1234H ADD AX,3064H 一、立即数寻址方式: 操作数直接包含在指令中,为8位或16位数, 且是指令的一部分。 操作数直接包含在指令中
关于立即寻址的说明 立即数可以是8位或16位二进制数(带符号数以补 码表示)。只能作为源操作数,且只能是常数。 立即数主要是对寄存器赋值,指令执行时 从指令队列中直接获取。立即数只能是整 数,只能作源操作数。 不能作为目的操作数。 MOV 12H,AL
二、 寄存器寻址方式 指令所需的操作数放在CPU内的某寄存器中 操作数放在指令规定的寄存器中。 MOV DS,CX ADD CL,BH 寄存器寻址常用来CPU内部的数据传送。
1 . 寄存器寻址方式举例 例. MOV DX , AX 若(AX)=1234H, 1234H 则指令执行后(DX)=_______ 例: MOV CL , AL 若(AL)=34H, 34H 则(CL)=_____
2.关于寄存器寻址的说明 16位操作数要使用CPU内部的16位REG为 AX,BX,CX,DX,SP,BP,SI,DI 8位操作数使用8位的REG为 AL,AH,BL,BH,CL,CH,DL,DH MOV AL, BX 寄存器 不匹配 MOV AX, BL
三、存储器寻址方式 操作数存放在存储单元中。指令给出的 是存储单元的有效地址EA。 MOV AL,[1234H] 存储单元的 有效地址EA MOV SI, [BX] [ ]——的内容表示存储单元的地址
三、存储器寻址方式 存储单元地址的逻辑地址 段基址 : 偏移量(EA) 存储单元地址的逻辑地址 段基址 : 偏移量(EA) • 段基址:存放在段寄存器(CS,DS,ES,SS)中。 • 偏移量(有效地址EA):存放OP数的存储单元与段起址(段基址)之间的距离。 • EA由常数、基地址(BX,BP)和变址(SI,DI)合成。 20位物理地址=(段寄存器)*10H + EA 20位物理地址=(段寄存器)*10H + EA
1234H VAR 操作数的有效地址EA由指令直接给出(为 带有方括号[]或符号的常量)。 1、直接寻址方式 ①用常数表示 MOV AX,[1234H] ;(AX)=6655H ②用符号表示 MOV BX , VAR MOV BX, DS:VAR 把DS:VAR所指向的字单元内容送到BX中
操作数的有效地址EA由指令直接给出,操作数的段地址常默认为DS。操作数的有效地址EA由指令直接给出,操作数的段地址常默认为DS。 直接寻址方式的说明: MOV [1001H],AX ;EA=1001H MOV AL,DATA1 ;EA=DATA1 等价于MOV AL,[DATA1] 可使用段超越前缀(ES、SS、) MOV AX,ES:[2000H]
2.寄存器间接寻址方式: 操作数的有效地址EA在基址寄存器BX,BP 或变址寄存器SI,DI中,由指令规定所用的寄存器。 BX, SI, DI 隐含使用DS; BP隐含使用SS。 存储单元的 有效地址EA 由寄存器给出 MOV AL, [BX] MOV AL, DS:[BX]
2.寄存器间接寻址方式举例: MOV AX,[BP] ;段地址为SS MOV BX, 3344H 3344H MOV AL,[BX] ;则指令执行后(AL)=_______ 0AAH BX、SI、DI的段地址默认为DS MOV BX,[AX] ;错!
3、寄存器相对寻址方式 操作数的EA由寄存器BX、BP、SI、DI的内容和一个带符号数(8位或16位)的偏移量之和。EA=(基址/变址)+8/16disp MOV AL,80H[BP] ;EA=(BP)+80H MOVAX,COUNT[SI] ;EA=(SI)+COUNT MOV DL,ES:COUNT [DI]
1010H ARRAY 寄存器相对寻址方式举例: 设(SI)=(BX)=1000H MOV AX,10H[SI] ;则指令执行后(AX)=_______ 2010H MOV CX , ARRAY [BX] ;则指令执行后(CX)=_______ 5040H
4、基址变址寻址方式 MOV AX,[BX][SI] ;EA=(BX)+(SI) ADD CX,ES:[BX+DI] ;EA=(BX)+(DI) 操作数的有效地址EA由指令规定的基址寄存器(BX或BP)内容与变址寄存器(SI或DI)内容相加形成。 • 基址R为:BP 则:段R隐含为SS • 基址R为:BX 则:段R隐含为DS
5、相对基址变址寻址方式: EA=[BX/BP]+[SI/DI]+偏移量 操作数的EA由三部分组成,(BX或BP)内容 与(SI或DI)内容与偏移量之和。 MOV AX,3000H[BX+SI] ;EA=(BX)+(SI)+3 MOV AH,[BX+DI+1234H] MOV AX,COUNT[BP+SI]
5、相对基址变址寻址方式: • 访问元素的有效地址 EA=ARY+[BP]+[SI] • 段基址隐含为SS • 可由 MOV AL,ARY[BP][SI]指令实现。 • 等价于MOV AL,SS:ARY[BP][SI] • 也可加段超越前缀,指出存储器操作数的所在段。 例:MOV AL,ES:ARY[BP][SI]
四、 I/O端口寻址方式 I/O接口的编址: ⑴与存储器统一编址 ⑵I/O端口单独编址
1、直接I/O端口寻址方式 (端口地址范围为0~255即00~FFH) 读端口: IN AL,n 输入指令,将 n 端口内 IN AX,n }容送入AL或AX中。 端口地址n(8位)可访问0--255以内的端口 IN AL,21H IN AX,0FFH 写端口: OUT n,AL 输出指令,将 AL或 OUT n,AX } AX内容送端口n。
2. 间接端口寻址方式 (整个64k地址空间) MOV DX,1234H IN AL,DX 端口地址在DX中(16位)可访问0--FFFFH以内的端口 OUT DX ,AL
指出下列指令的错误 ;立即数不能直接送DS MOV DS,100 MOV [BX],[DI] ;存储器之间不能直接传送 RCL AX,4 ;循环次数>1需放CL中 CMP BYTE PTR[BX],’AB’ ;数据类型不匹配 MOV AX,[BX+BP] ;应为基址+变址 POP CS ;CS不能作目的操作数 MOV AX,[CX] ;CX不能作间接寻址寄存器 MOV AL,256 ;256超过一个字节啦! ADD [BX],12H ;数据类型不匹配
应用举例 已知DS=2000H,SS=2001H,BX=100H, BP=0F3H,SI=2,内存单元的内容如图, 求分别执行下列指令后AX的值。 (1)MOV AX,1200H (2)MOV AX,BX (3)MOV AX,[BX] (4)MOV AX,1[BX] (5)MOV AX,[BX][SI] (6)MOV AX,[BP][SI] (7)MOV AX,DS:11H[BP+SI] (8)MOV AX,0FFFFH[BX+SI]
5.2 操作数的寻址方式 • 5.2.2 寄存器寻址 • 寄存器寻址的操作数在通用寄存器中。 • ① 寄存器寻址可以作源操作数或目的操作数; • ② 可使用任一16位通用寄存器(AX、BX、CX、DX、SI、DI、BP、SP),对于8位操作数,寄存器可以为(AL/AH/BL/BH/CL/CH/DL/DH)。但使用累加器AX速度较快。 • [例5.2.3]:编程计算(AX)×10的值 • 解:可以采用的算法为: (AX)×2+(AX)×8=(AX)×10 • ADD AX,AX ;AX←(AX)×2 • MOV BX,AX ;BX←(AX) • ADD AX,AX ;AX←(AX)×4 • ADD AX,AX ;AX←(AX)×4 • ADD AX,BX ;AX←(AX)×10
5.2 操作数的寻址方式 • 5.2.3 存储器寻址 在存储器寻址方式中,指令给出的是存储单元的地址或产生存储单元地址的信息,即指令中给出的是操作数的有效地址(EA)或产生EA的计算方式。这里的EA即是逻辑地址中的偏移地址(为16位数),再由物理地址形成部件形成20位实际地址(PA),PA=段基址×10H+EA。按照EA的计算方法不同分以下5种。 • 1、直接寻址 • 直接寻址是操作数的有效地址EA(16位偏移量)直接包括在指令中(操作数在存储器中)。 • ① 直接寻址是默认数据段DS为段地址,寻址范围为64K; • ② 可以用符号名地址(标号或变量)进行直接寻址(与立即数寻址相似)。
5.2 操作数的寻址方式 • 设DS=3000H,(32000H)=0AABBH,(DAT)=2730H 。 • ① MOV AX,[2000H] • ;执行指令后AX的内容为0AABBH • MOV AX,2000H • ;执行指令后AX的内容为2000H • ② DAT DB 1,2,3,4,5 • N EQU 10 • MOV CX,N (立即数寻址)图5-2 • MOV AL,DAT (直接寻址) • ;则执行指令后CX=10;AL=2730H。 • 8086/8088中允许段超越,即允许操作数在以代码段CS、堆栈段SS或附加段ES为段地址的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 • MOV AX,[2000H] ;数据段DS • MOV BX,ES:[2000H] ;段超越,操作数在附加段ES • 即物理地址PA=(ES)×10H+2000H
5.2 操作数的寻址方式 • 2、寄存器间接寻址 • 寄存器间接寻址的操作数在存储器中,而操作数的有效地址EA在寄存器中。 • ① 操作数的有效地址通常只能存放在SI、DI、BX、BP寄存器中; • ② 当使用SI、DI、BX间接寻址时,操作数在数据段,故由DS与SI(DI、BX)形成操作数的物理地址; • ③ 当使用BP间接寻址时,操作数在堆栈段,故由SS与BP形成操作数的物理地址。 • [例5.2.6]: • ① MOV AX,[SI] ;(源操作数的物理地址PA=(DS)10H+(SI)) • ② MOV AX,[BP] ;(源操作数的物理地址PA=(SS)10H+(BP)) • ③ MOV AX,ES:[BX] ;(源操作数的物理地址PA=(ES)10H+(BX)) • 这里,方括号表示内容,而不表示存储器操作数的偏移地址,只有BX、BP、SI、DI及变量才能在方括号中出现。不允许BX、BP同时出现在同一个地址表达式中,也不允许SI、DI同时出现在同一个地址表达式中。
5.2 操作数的寻址方式 • 3、基址寻址 • 基址寻址的操作数在存储器中,操作数的有效地址由基址寄存器(BX或BP)的内容与指令中给定的位移量相加得到。 • 基址寄存器为BX时,段寄存器使用DS;基址寄存器为BP时,则段寄存器使用SS。 • 例:MOV AX,[BX+VALUE] ;源操作数物理地址PA=(DS)10H+(BX)+VALUE • 4、变址寻址 • 变址寻址的操作数在存储器中,操作数的有效地址由变址寄存器(SI或DI)的内容与指令中给定的位移量相加得到。 • [例5.2.7]:① MOV AX,COUNT[SI] (或MOV AX,[SI+COUNT]) • ;(源操作数物理地址 PA=(DS)10H+(SI)+ COUNT) • ② MOV DL,ES:6[SI] ;(源操作数物理地址 PA=(ES)10H+(SI)+6)
5.2 操作数的寻址方式 • 5、基址变址寻址 • 基址变址寻址的操作数在存储器中,其有效地址为基址寄存器(BX或BP)内容加上变址寄存器(SI或DI)内容再加上指令中给出的位移量。 • ① 用BX作基址时,段寄存器使用DS;用BP作基址时,段寄存器使用SS; • ② 当使用段超越方式时可使用其他段寄存器。 • 例如:MOV AX,DAT[BX][SI] ;源操作数物理地址PA=(DS)10H+(BX)+(SI)+DAT • 这里,不允许BX、BP同时出现在同一个地址表达式中,也不允许SI、DI同时出现在同一个地址表达式中。 • 练习]:假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00AOH,(BX)=0100H,(BP)=0010H,数据段中变量名VAL的偏移地址值为0050H,试指出下列源操作数的寻址方式是什么?其物理地址值是多少? ① MOV AX,00ABH ② MOV AX,BX ③ MOV AX,[100H] ④ MOV AX,VAL ⑤ MOV AX,[BX] ⑥ MOV AX,ES:[BX] ⑦ MOV AX,[BP] ⑧ MOV AX,[SI] ⑨ MOV AX,[BX+10] ⑩ MOV AX,VAL[BX] ⑩ MOV AX,[BX][SI] ⑩ MOV AX,VAL[BX][SI]
5.3 指令集 • 指令就是计算机完成某种操作的命令。一种CPU所能认识、执行的全部指令的集合称为该CPU的指令系统。指令系统决定计算机的基本功能,不同种类的CPU的指令系统是不同的,同一系列的CPU的指令系统兼容。 • 8086/8088的指令系统大约有100多条基本指令,可以分为以下六个功能组。
5.3 8086/8088指令系统 • 一、数据传送指令 • 二、算术指令及逻辑指令 • 三、串处理指令 • 四、控制转移指令 • 五、处理机控制指令 如何学习 返回本章首页
学习指令的注意事项 • 指令的功能——该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式 • 指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式 • 指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响 • 其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等
8086/8088指令语句 操作码 目的操作数,源操作数;注释 告诉计算机所 要执行的操作 (一个) (一个或几个) 指令执行操作时所需的数据 或操作结果存放的位置。 重点:指令的功能,所采用的寻址方式, 对标志位的影响。
一、数据传送类指令 实现CPU的寄存器之间、寄存器与存储器之间、 累加器与I/O端口、立即数到REG/MEM之间的 数据传送,按字节/字传送,传送类指令不影响 标志位;指令不改变源操作数的内容。 • 除串操作指令外,所有指令只允许有一个操作数在存储器中。
数据传送关系 段寄存器REG DS,SS,ES 通用REG AX~DX,SP, BP,SI,DI 立即数 存储器M
一、数据传送类指令 通用数据传送指令 MOV MOV 目的操作数,源操作数 MOV DI,AX MOV [DI],5566H MOV AX,1234H MOV DS,AX
指出下列指令的错误: 两个存储单元间、两个段寄存器间不能直接传送数据(须有一个是寄存器); 立即数不能直接传送给段寄存器, 也不能作目的操作数; CS不能作为目的操作数 MOV [DI],[SI] MOV DS,ES MOV DS,05H MOV 1AH,AL MOV CS,AX MOV [BX],0 MOV [BX],BYTE PTR 0 ;源、目的操作数类型必须一致
34H 12H BBH AAH 2. 堆栈操作指令PUSH及POP PUSH/POP REG/MEM MOV AX,1234H MOV CX,0AABBHPUSH CXPUSH AXPOP CS 栈顶 低地址 SP • 按‘后进先出’的原则。 • 按字操作; • 为单操作数 堆栈: 高地址 栈底