汇编语言cpu的子程序有哪两种类型的系统属性cpu修改器

当前位置: >>
ch02 汇编语言基础C
第二章 汇编语言基础 第二章?? ?汇编语言基础2.1 汇编语言概述2.2 微处理器编程结构 2.3 汇编语言上机调试?? ? ? ?2.4 汇编语言源程序组织2.5 汇编语言中的操作数 2.6 寻址方式 2.7 指令系统 2.8 基本I/O功能调用 2.1 汇编语言概述机器语言 高级语言BASIC C/C++ JAVA ...汇编语言 计算机程序设计语言?机器语言(Machine Language) 二进制编码的机器指令 A20 A21220 汇编语言(Assembly Language) MOV AL,[2010H] ADD AL,[2011H] MOV [2012H],AL 用助记符表示的指令??高级语言(High-level Language) 类似自然语言和数学描述语言 什么是汇编语言?以助记符形式表示计算机指令? 助记符是便于人们记忆、并能描述指令功能和指令操作数的符号? 助记符是表明指令功能的英语单词或其缩写?汇编格式指令以及使用它们编写程序的规则就形成汇编语 言(Assembly Language)汇编语言程序:用汇编语言书写的程序 汇编程序:将汇编语言程序“汇编”成机器代码目标模块 的程序? ?汇编语言程序与汇编程序是两个概念 汇编语言的特点?汇编语言的优点:? 使用助记符表示的指令,易于编写、调试和维护 ? 直接控制计算机硬件部件 ? 编写“时间”和“空间”两方面最有效程序?汇编语言的缺点:? 与处理器密切有关 ? 需要熟悉计算机硬件系统、考虑许多细节 ? 编写繁琐,调试、维护、交流和移植困难 汇编语言和高级语言的混合编程? ? ?汇编语言的优点使得它在程序设计中占有重要的位置,不 可被取代 汇编语言的缺点使得人们主要采用高级语言进行程序开发 工作 有时需要采用高级语言和汇编语言混合编程,互相取长补 短,更好地解决实际问题混合编程取长补短 汇编语言的应用场合?(1)对软件的执行时间或存储容量有较高要求的场合。?操作系统核心程序,智能化仪器仪表的控制系统, 实时控制系统等 通常把大型软件中执行频率高的子程序(过程)用汇编语言编写, 然 后把它们与其他程序一起连接。 如设备驱动程序,I/O接口电路的初始化程序段等。?(2)需要提高大型软件性能的场合。??(3)软件与硬件关系密切, 软件需要直接和有效控制硬件的场合。??(4)没有合适的高级语言的场合或只能采用汇编语言的时候。?开发最新的处理器程序时,暂时没有支持新指令的编译程序。?(5)其它,如系统的底层软件、加密解密软件、分析和防治计算机 病毒软件等。 2.2 微处理器编程结构?编程结构:是指从程序员和使用者的角度看到的结构,与芯片内部的物理结构和实际布局有区别。? 2.2.1 ? 2.2.2 ? 2.2.3的功能结构的存储器组织的寄存器结构 2.2.1 的功能结构两大独立部分: ? BIU (Bus Interface Unit) 总线接口单元 由5个主要部件 构成 ? ???? ?? EU (Execution Unit) 执行单元 由4个主要部件构 成???? ? 总线接口部件 BIU构成部分 ? 4个16位段寄存器:CS,DS,ES,SS ? 16位IP指令指针寄存器 ? 20位地址加法器 ? 6字节的指令队列( 8088的指令队列为4字节 ) ? 总线控制电路 主要功能 ? 负责与存储器、I/O接口传递数据,完成所有的访问操作 ? 具体完成: (1)计算形成20位物理地址 (2)从内存预取指令,送到指令队列; (3)与内存或外设交换数据:读/写操作数、执行结果送至内存 或外设 (4)总线控制:响应外部中断请求 ? 执行部件EU构成部分? ??? ?8个16位寄存器: ? AX、BX、CX、DX、SP、BP、DI、SI 1个标志寄存器PSW 1个算术逻辑运算部件ALU 数据暂存器 EU控制器 负责指令的译码、执行。 具体完成: (1) 从指令队列中取指令 (2) 指令译码 (3) 执行指令 (4) 指令执行结果→BIU主要功能? ? ?8086之前,CPU串行方式工作取指 执行 取指 执行 取指 执行 取指 执行 非流水执行方式时间? BIU和EU?8086并行方式工作――首次引入指令流水线取指 取指 执行 取指 执行 取指 执行 取指 执行并行工作的方式BIU EU 取指、执指 二级流水线 时间 流水线执行方式 BIU与EU的操作协调(1)?(1) 执行单元EU并不直接与外部发生联系,而是从总线接口单元BIU 的 指令队列中源源不断地获取指令并执行。每当指令队列中存满一条指令 后,EU就立即开始执行。 (2) 每当指令队列中有2 个空字节时,BIU就会自动地寻找空闲的总线周 期进行预取指令操作,直至填满为止。其取指的顺序是按指令在程序中 出现的先后顺序。 (3) 每当EU准备执行一条指令时,它会从BIU部件的指令队列前部取出 指令的代码,然后用几个时钟周期去执行指令。在执行指令的过程中, 如果必须访问存储器或者I/O端口,那么EU就会请求BIU进入总线周期, 并形成有效地址EA送给BIU ,由BIU的地址加法器形成物理地址PA 从 存储器或I/O端口取回操作数送给EU,完成访问内存或者I/O端口的操 作。如果此时BIU正好处于空闲状态,会立即响应EU的总线请求;如果 BIU正将某个指令字取到指令队列中,则BIU将首先完成这个取指令的总 线周期,然后再去响应EU发出的访问总线的请求。?? BIU与EU的操作协调(2)?(4)每当EU执行一条转移、调用或返回指令后,BIU 清除指令队列缓 冲器,并从新的目标地址开始预取指令送入指令队列,此时EU才能 继续执行指令,实现程序执行的转移。这时EU和BIU 的并行操作显 然要受到一定的影响,但只要转移、调用指令出现的概率不是很高, EU 和BIU 间相互独立又相互配合的工作方式仍将大大提高CPU 的工 作效率。?(5)当指令队列已满,且EU又没有总线访问请求时,BIU便进入空闲状 态。 ? 8086 CPU与 8088 CPU的区别? 重要差别16条数据线(16位机)Intel 8086 20条地址线(寻址能力220=1MB)与外部交换数据的数据总线8条数据线(准16位机)Intel 8088 20条地址线? 两者内部结构基本相同8086指令对列为6字节,若出现2字节空闲,则预取指令。 8088指令对列为4字节,若出现1字节空闲,则预取指令; 总结? ? CPU分为哪两大部件?其各自的主要功能是什么?
CPU 的区别有哪些? 2.2.2 8086的存储器组织? 存储器:用来存放程序、数据。 ? 存储器以字节(8bit)为单位存储信息 ? 每个字节的存储单元有一个地址 ? 地址用二进制数表示 (无符号整数,通常写成十六进制形式) ? 多字节数据在存储器中占连续的多个存储单元: ? 存放时,高字节存入高地址,低字节存入低地址; ? 表达时,用它的低地址表示多字节数据占据的地址空间。80x86 系统采用“高高低低”原则存储,称为“小端方 式Little Endian”。 相对应还存在“大端方式Big Endian”。 ? 存储器地址 ? 8086具有20位地址总线,可寻址220=1MB存储空间,存储器 的每一个存储单元(每一个字节)与一个20位地址相对应, 称为物理地址。物理地址:信息在存储器中实际有效的地址单元号, CPU访问内存是按物理地址寻址的。 ? 数据存储格式? 例如:1234H以不同方式存储时的情况。2FFFH H H34H 12H小端方式 双字数据 H 低 78H 56H 34H 12H2FFFH H H12H 34H大端方式高 ? ? ? ?(00002H)= 12H ,或 [ 00002H ]= 12H (00003H)= 34H ,或 [ 00003H ]= 34H 字数据 3412H = (00002H) 双字数据 H = (00002H) ??存储器的分段管理8086CPU有20条地址线 ? 可寻址空间从00000H~FFFFFH,即220=1MB ? 存储系统中,对应每个物理存储单元的一个唯一的 20位编号,就是物理地址 8086机器字长16位 ? 仅能表示地址范围 0000H ~ FFFFH(64KB) 存储器的逻辑分段 ? 每个段最大限制为64KB, ? 段地址的低4位为0000B ? 分段后编程时采用逻辑地址,形式为 段地址 : 段内偏移地址?? ?存储器的分段管理8086首次引入存储器分段管理机制,可分为4种分工不同、 相对独立的逻辑段: 00000H单元 代码段:存放程序的指令和常数代码段 堆栈段数据段:存放数据堆栈段:用于保护数据、传递数 据、保存返回地址数据段附加段:存放数据,可以作为数 据段的扩展;用于串操作附加段FFFFFH单元 存储器分段示意00000H单元? 每个段可安排在1MB空间的任何位置? 段与段之间是相互独立的 ? 段的排列非常灵活,可以连续、分开、重叠 ? 段内地址是连续的 ? 每个段最大空间为64KB ? 每个逻辑段的起始地址 低4位为0000B 16的倍数FFFFFH单元代码段 堆栈段数据段附加段xxxx0H 00000H单元段寄存器 段基址CS SSDSAH 8FFBH代码段起始地址堆栈段起始地址10550H代码段250A0H堆栈段数据段起始地址 8FFB0H EFF10HESEFF1H附加段起始地址数据段规定段起始地址必须是模16地址: xxxx0H,省略低4位0000B,段地址就可以用 16位数据表示用 ? 16位段寄存器来存放段基址 ? 说明逻辑段在内存中的起始位置?附加段FFFFFH单元 ? 段起始地址和偏移地址,共同确定了要寻址的内存单元在整个内 存空间的位置? 段起始地址确定了逻辑段在整个内存空间的位置(逻 辑段定位);段起始地址 偏移地址 逻辑段 内存物理地址? 偏移地址确定了要寻址的内存单元在本逻辑段中的位 置。? 每个逻辑段不超过64KB,偏移地址也可用16位数据表示, 存放在地址寄存器或直接提供 ?物理地址和逻辑地址 物理地址:信息在存储器中实际有效的地址单元号, CPU访问内存是按物理地址寻址的。 段基址 逻辑地址 偏移地址 保存在段寄存器 保存在地址寄存器程序中出现的地址是逻辑地址。 ? 逻辑地址的表示方法 段基址:偏移地址 由段寄存器提供 由地址寄存器提供或直接提供 8086微处理器20位物理地址的产生过程? CPU执行程序时,需要将逻辑地址转换为物理地址,称 为地址重定位 ? 问题: 8086具有20位地址总线,可寻址220=1MB存储空间, 而8086CPU的寄存器为16位,如何寻址20位地址? ? 解决: 将段寄存器中的段基址 左移4位,扩展成20位; 用20位地址加法器,将 段基址与偏移地址相加, 形成20位物理地址。1915015016位 段基址016位 偏移地址16位 段基址 ←左移4位0000Σ20位物理地址? 20位物理地址与逻辑地址的关系(计算) 物理地址=(段基址)× 10H+偏移地址?逻辑地址:段基址、偏移地址 ? 20位物理地址计算例题? 设(CS)=1200H,(IP)=0200H,求待取指令存放的物 理地址物理地址 = (段基址)× 10H+偏移地址物理地址=(CS)×10H+(IP) = 1200H ×10H+H ?该物理地址可表示为 (CS):(IP)或 1200H:0200H (区别?) ? 访问代码段一定是用逻辑地址(CS和IP)寻址 ? 某数据所在数据段(DS)=1350H,偏移地址=0020H,求存 放该数据存储单元的物理地址物理地址 = (段基址)× 10H+偏移地址物理地址=(DS)×10H+0020H = 1350H ×10H+H ?访问数据段时,偏移地址表示比较灵活,可以存放在地址 寄存器SI、DI、BX中,也可以在指令中直接给出 ? 数据段中可以定义变量,变量具有偏移地址属性 一个存储单元具有一个唯一的物理地址,一个物理 地址可对应多个逻辑地址?逻辑地址 、 物理地址 2H段地址左移4位 加上偏移地址 得到物理地址20120H +3042H23162H20020H +3142H23162H 图 2-6 总结? ?8086微处理器如何计算20位物理地址? 8086开机或复位时,设(CS)=FFFFH,(IP)=0000H, 复位后CPU执行第一条指令所在的物理地址? 思考题:8086开机或复位时?设(CS)=FFFFH,(IP)=0000H,复位后CPU执行第 一条指令所在的物理地址?物理地址=(CS)×10H+(IP)= FFFFH ×10H+0000H=FFFF0H FFFF0H~ FFFFFH,存储BIOS,16字节,转移指令书 P57 10 2.2.3 的 寄存器结构共14个16位寄存器AH BH CH DH SI DIAL BL CL DLAX BX CX DX累加器 Accumulator 基址寄存器 Base Addr 计数寄存器 Counter 数据寄存器 Data 变 址 寄存器数 据 寄存器BP SP DS ES SS CS IP PSW源变址寄存器 Source Index 目的变址寄存器 Destination Index 基址指针寄存器 Base Point 堆栈指针寄存器 Stack Point通 用 寄 存 器指 针 寄存器数据段寄存器 Data Segment 附加段寄存器 Extra Segment 堆栈段寄存器 Stack Segment 代码段寄存器 Code Segment 指令指针寄存器 Instruction Pointer 标志寄存器 Processor Status Word段寄存器控制寄存器 1. 通用寄存器?8086有8个通用的16位寄存器(1)数据寄存器: AX BX CX DX (2)变址寄存器: SI DI (3)指针寄存器: BP SP (1)数据寄存器????AX称为累加器(Accumulator) 使用频度最高。用于算术、逻辑运算、与外设传送信息等 BX称为基址寄存器(Base address Register) 常用做存放存储器地址 CX称为计数器(Counter) 作为循环和串操作等指令中的隐含计数器 DX称为数据寄存器(Data register) 常用来存放双字长数据的高16位,或存放外设端口地址4个数据寄存器还可以分成高8位和低8位两个独立的寄存器, 这样又形成8个通用的8位寄存器, 8位寄存器只能存放数据。? 例:汇编指令中寄存器的使用汇编指令 MOV AX,18 MOV AH,78 ADD AX,8 MOV AX,BXCPU执行操作 将18送入寄存器AX 将78送入寄存器AH 将寄存器AX中数据值加8 将BX中数据送入寄存器AX高级语言语法描述 AX=18 AH=78 AX=AX+8 AX=BXIN AX, 28H将(28H)端口数据传送到AX (2)变址寄存器??16位变址寄存器 SI 和 DI 常用于存储器变址寻址方式时提供地址 ? SI是源变址寄存器(Source Index) ? DI是目的变址寄存器(Destination Index) ? 串操作指令:MOVS dest, scr ES : DI DS : SI指令的一般格式 操作码 MOV AX, BX 操作数?目的操作数 源操作数 (3)指针寄存器?指针寄存器用于寻址内存堆栈内的数据? SP为堆栈指针寄存器(StackPointer),指示堆栈段栈顶 Pointer),表示数据在堆的位置(偏移地址)? BP为基址指针寄存器(Base栈段中的基地址?SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的 存储单元地址 SS:SP SS:BP ?堆栈?像装糖豆儿的小盒? 特点:先进后出,后进先出?关于堆栈(Stack)堆栈段?存取原则:LIFO(后进先出) ?双字节(字)操作高位字节对应高地址,低位字节对应低地址1H 1H 栈 生 成 方 向?堆栈向低地址方向生成入栈SP-2,出栈SP+210508H1050AH?堆栈总满SP所指示的栈顶已有数据?用SS和SP(BP)寻址 出口入口同一个(DX)=1234H低 地 址 生 长 方 向15H 16H 17H 18H 19H ** ** ** ** SP 栈 顶 指 针低 地 址 生 长 方 向低 地 址 生 长 方 向15H 16H 17H 18H 19H ** ** ** ** 出(弹)栈 POP DX SP 栈 顶 指 针(AX)=1234H高高20H20H8086的堆栈结构15H 16H 17H 18H 19H34H 12H ** ** ** ** 入(压)栈 PUSH AXSP 栈 顶 指 针高20H 2. 段寄存器??位段寄存器,可同时使用4种逻辑段 ? CS(代码段寄存器)指明当前代码段的起始地址 CPU利用CS:IP取得将要执行的指令。 ? SS(堆栈段寄存器)指明当前堆栈段的起始地址 PUSH 和POP 指令,利用SS:SP寻址栈顶单元数据。 ? DS(数据段寄存器)指明当前数据段的起始地址 CPU利用DS:EA读写内存数据段数据 ? ES(附加段寄存器)指明当前附加段的起始地址 CPU利用ES:EA读写内存附加段数据 每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均 有各自的用途 3. 指令指针寄存器 IP?IP(Instruction Pointer)为指令指针寄存器,存放即将执 行指令的偏移地址(有效地址EA)。 IP寄存器与CS段寄存器联合使用以确定下一条指令的存储 单元地址(CS:IP)??IP寄存器是一个专用寄存器,在程序执行过程中,自动修 改。 注意:不能用指令直接读取或设定IP的值,但是可以通过 某些指令的执行而自动修改IP值。(例如转移控制类指令)? 4. 标志寄存器 ( FLAGS / PSW )15 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZFAFPFCF(1)状态标志(记录程序中运行结果的状态信息)(2)控制标志用于控制处理器执行指令的方式OF 溢出标志 SF 符号标志 ZF 零标志 CF 进位标志 AF 辅助进位标志 PF 奇偶标志DF 方向标志 IF 中断标志 TF 陷阱标志 符号标志SF(Sign Flag)?运算结果最高位为1,则SF=1; 否则SF=0有符号数据用最高有效位表示数据的符号 所以,最高有效位就是符号标志的状态 ?CF:进位/借位标志位? 当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1; 否则CF =0?ZF:零标志位? 若运算结果为0,则ZF=1;否则ZF=0 奇偶标志PF(Parity Flag)?当运算结果最低字节中“1”的个数为零 或偶数时,PF=1;否则PF=0PF标志仅反映最低8位中“1”的个数是 偶或奇,即使是进行16位字操作 溢出标志OF(Overflow Flag)?若有符号数运算的结果有溢出,则OF=1; 否则 OF=0??所谓溢出,就是当对有符号数进行运算时,字节运 算的结果超出 -128 ~ +127 的范围,或字运算的结 果超出-32768~+32767的范围时,称为溢出。 因为这时运算结果已超出目标单元所能表示的数值 范围,从而会丢失有效数字,出现错误结果。 方向标志DF(Direction Flag)?用于串操作指令中,控制地址的变化方向: ? 设置DF=0,存储器地址自动增加; ? 设置DF=1,存储器地址自动减少? CLD指令复位方向标志:DF=0 ? STD指令置位方向标志:DF=1 中断允许标志IF(Interrupt-enable Flag)?控制可屏蔽中断是否可以被处理器响应: ? 设置IF=1,则允许中断; ? 设置IF=0,则禁止中断? CLI指令复位中断标志:IF=0 ? STI指令置位中断标志:IF=1 陷阱标志TF(Trap Flag)?用于控制处理器进入单步操作方式: ? 设置TF=0,处理器正常工作; ? 设置TF=1,处理器单步执行指令? 单步执行指令 ――处理器在每条指令执行结束时,便产生一个编号为1的内部中断 ? 这种内部中断称为单步中断 ? 所以TF也称为单步标志 ? 利用单步中断可对程序进行逐条指令的调试 ? 这种逐条指令调试程序的方法就是单步调试 溢出的判断?当两个相同符号数相加(包括不同符号数相减),而 运算结果的符号与原数据符号相反时,产生溢出;其 他情况下,则不会产生溢出.例1:3AH+7CH=B6H 例2:AAH+7CH 例3:3AH-7CH 例4:AAH-7CH=2DH 溢出 无溢出 无溢出 溢出? ?最高两位 转换为使10进制数,看运算结果是否超出取值范围 关于CF与OF?那是不一样滴,hoho…… 001 CF=1,OF=1 11 CF=0,OF=1 010 CF=1,OF=0 11 CF=0,OF=0 总结 ?段基址:偏移地址,基本搭配?举例如下,具体取决于指令中的寻址方式 ? 段寄存器和相应存放偏移地址的寄存器之间的默认组合段CS SS DS ES偏移IP SP或BP AX、BX、CX、DX、DI、SI DI(用于串指令) ? ?如何判断运算结果是否溢出? 标志寄存器中进位标志与溢出标志的区别?C000H H + 8000H + C000H + H H0808H + C000HC808HCF PF AF ZF SF OF 2.3 汇编语言程序的开发过程文本编辑器,如
编 辑 源程序:文件名.asm 汇编程序,如 ML.EXE 汇 编 目标模块:文件名.obj 连接程序,如 LINK.EXE 连 接错误 错误 错误可执行文件:文件名.exe 调试程序,如 DEBUG.EXE 调 试 应用程序错误 [例2-1]源程序:hello.asm,在屏幕上显示字符串“Hello,Assembly!‖。 DSEG SEGMENT ;数据段开始 STRING DB 0DH,0AH,'Hello,Assembly!',0DH,0AH,'$' DSEG ENDS ;数据段结束 CSEG SEGMENT ; 代码段开始 ASSUME CS:CSEG,DS:DSEG ;设定段寄存器与逻辑段的关系 START: MOV AX,DSEG MOV DS,AX ; 设置数据段段地址 MOV DX,OFFSET STRING ;为DOS调用设置入口参数 MOV AH,9 ;为DOS功能调用设置功能号 INT 21H ;DOS功能调用,显示字符串 MOV AX,4C00H ;为DOS功能调用设置功能号和入口参数 INT 21H ;DOS功能调用,返回DOS操作系统 CSEG ENDS ; 代码段结束 END START ; 汇编结束 汇编 连接 运行 调试程序DEBUG?DEBUG.exe 是 DOS提供的一个调试汇编语言程序的程序。 每个版本的DOS都带有该程序,在windows\system32文 件夹下。 DEBUG程序采用的是命令行方式 ? 使用不方便,但实用性强。是学习汇编语言程序、计 算机硬件等课程的有效工具。??DEBUG程序的具体作用 查看/修改寄存器, 内存单元的内容; 学习寻址方式和指令系统 ; 了解计算机取指令, 执行指令的工作过程; 调试有问题的汇编语言程序。 DEBUG 主要命令命令 R RF A U T P G D E W L I O Q 功能简介 显示、修改寄存器内容 显示、修改 PSW 内容 汇编指令 反汇编 单步、多步执行指令 单步、多步执行指令 连续执行指令 显示内存内容 修改内存内容 将内存块写入文件 将文件调入内存 读入端口的内容 将数据写入端口 退出 DEBUG,返回 DOS DEBUG下符号与标志的对应关系标志名称 溢出标志 OF 方向标志 DF 中断标志 IF 符号标志 SF 零标志 ZF 1 OV DN EI NG ZR AC PE CY 0 NV UP DI PL NZ NA PO NC辅助标志 AF 奇偶标志 PF 进位标志 CF 课后可参照下列步骤做实验: D:\MASM&DEBUG ?-R ?;进入DEBUG ;查看当前各寄存器的内容AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1271 ES=1271 SS=1271 CS=1271 IP=0100 NV UP EI PL NZ NA PO NC
B83412 MOV AX,1234 -D 0 : 0 ?;查看0:0~7FH内存块的内容E 0F C9 00 65 04 70 00-16 00 EB 07 65 04 70 00 ....e.p.....e.p.
04 70 00 54 FF 00 F0-58 7F 00 F0 F5 E7 00 F0 e.p.T...X....… 、、、、、、 -U FFFF : 0 ?;反汇编FFFF:0 处的指令INT 19 LOOPNZ 0004FFFF:0000 CD19 FFFF: 、、、、、、 -A ? MOV AX,03;汇编一条指令-T =100 ?;执行该指令AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1271 ES=1271 SS=1271 CS=1271 IP=0103 NV UP EI PL NZ NA PO NC
E9C300 JMP 01C9-R ?;查看指令执行后结果AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1271 ES=1271 SS=1271 CS=1271 IP=0103 NV UP EI PL NZ NA PO NC-Q ?;退出DEBUGD:\MASM& 高级语言程序、汇编语言程序与机器语言程序的关系源程序 MASM进行汇编 ***.ASM目标程序 ***.OBJ LINK连接 可执行程序GO!可执行程序 ***.EXE 2.4 汇编语言源程序组织? ?2.4.1 汇编语言的语句格式 2.4.2 汇编语言源程序格式 2.4.1 汇编语言的语句? ? ?汇编语言源程序由语句序列构成. 每条语句一般占一行。 语句有两种: ? 指令语句 (表达硬指令的执行性语句) ? 伪指令语句 (表达伪指令的说明性语句) 汇编语言的语句格式⑴ 指令语句――汇编后翻译为机器指令,产生目标代码; 执行性语句,用于表达处理器指令(也称为硬指令)。 指令与具体的处理器有关、与汇编程序无关 标号:NEXT:指令助记符MOV YY , AL ;操作数,操作数YY←(AL); 注释⑵ 伪指令语句――没有对应的机器指令,不产生目标代码; 说明性语句,用于指示汇编程序对源程序如何汇编、定义 常量、变量、逻辑段,设置过程等 伪指令与具体的处理器类型无关,但与汇编程序有关。不 同版本的汇编程序支持不同的伪指令 符号名PORT伪指令助记符EQU 33H ;参数,参数,……;注释令PORT=33H 指令与伪指令?指令(Instruction)――与机器指令一一对应 ,在程序执 行时才处理的指令,表明CPU所执行的具体操作 指令与具体的处理器有关、与汇编程序无关 MOV ADD JMP?伪指令(Directive)――没有与其对应的机器指令,在程 序执行前指示汇编程序所作处理的说明性指令 伪指令与具体的处理器类型无关,但与汇编程序有关。不 同版本的汇编程序支持不同的伪指令 EQU DB PTR指令和伪指令采用助记符表达 操作数和参数?指令的操作数可以是常数操作数、寄存器操作数和存储器 操作数指令语句中,操作数可以是1个、2个或没有,用,隔开?双操作数指令/二地址指令 ?单操作数指令/一地址指令 ?无操作数指令/零地址指令 OP dest , src OP dest OP ?不需要操作数 ?隐含操作数??伪指令的参数可以是常数、变量名、表达式等,可以有多 个,参数之间用逗号分隔 标号符号化的偏移地址? 表示一条指令的符号地址(后一定有“ :”) ? 一般用于主程序或程序模块的开始 ? JMP/CALL 标号符号名? 可以是常量名、变量名、段名、过程名? 表示一条伪指令的符号地址(后没有“ :”)PORT EQU 33H ; 令PORT=33H 在汇编语言中,下列符号可以做标识符(标号或符号名) ? 字母:A~Z,a~z ? 数字:0~9? 特殊字符:?,@, $, _ , !, %注: ? 第1个字符不能是数字 ? 字符串长度不能超过31个? 不能是系统保留字,如:指令名、寄存器名、伪指令名等MOV、ADD AX、CS DB、DW汇编语言不区别大小写 注释?语句中由分号“;”开始的部分为注释内容,用以增加源 程序的可读性,说明语句或程序的功能 汇编程序在翻译源程序时将忽略注释部分,不对它们做任 何处理? 标号: 符号名指令助记符 伪指令助记符操作数,操作数; 注释 ;注释参数,参数,……分隔符?语句的4个组成部分要用分隔符分开?? ? ? ?标号后用冒号,注释前用分号操作数之间和参数之间使用逗号分隔 其他部分通常采用空格或制表符 多个空格和制表符的作用与一个相同 MASM支持续行符 “\‖ 2.4.2?汇编语言源程序格式完整的汇编语言源程序由逻辑段组成? 包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列?需独立运行的程序必须包含一个代码段,并指示程序执 行的起始点,一个程序只有一个起始点?所有的可执行性语句必须位于某一个代码段内,说明性 语句可根据需要位于任一段内 完整汇编语言源程序格式(1) 处理器选择伪指令(2) 逻辑段定义伪指令(3) 段使用设定伪指令 (4) 程序开始 (5) 程序终止 (6) 汇编结束 完整汇编语言程序框架一.8086 data1 …… data1 data2 …… data2 SEGMENT ENDS SEGMENT ENDS ;(1) 处理器选择伪指令 ;(2) 数据段定义, (可据需要设定,也可无) ;常量、变量定义;附加段定义(可据需要设定,也可无)code SEGMENT ; 代码段定义 ASSUME CS: code, DS:data1, ES:data2 ;(3)设定段寄存器与逻辑段关系 start: MOV AX,data1 ;(4) 起始点, MOV DS,AX ;设置段寄存器 、、、 ;程序主体部分 、、、 MOV AX, 4C00H ;(5) 结束点,返回DOS INT 21H code ENDS END(6) 汇编结束 总结?汇编语言的源程序采用分段结构,框架:SEGMENT ┊ ENDSDATA DATA CODESEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX , DATA MOV DS , AX ┊ MOV AX, 4C00H INT 21H CODE ENDS END START [例2-1]在屏幕上显示字符串“Hello,Assembly!‖。源程序:hello.asm DSEG SEGMENT STRING DB DSEG ENDS ;数据段开始 0DH,0AH,'Hello,Assembly!',0DH,0AH,'$' ;数据段结束CSEG SEGMENT ; 代码段开始 ASSUME CS:CSEG, DS:DSEG ;设定段寄存器与逻辑段的关系 START: MOV AX, DSEG MOV DS, AX ; 设置数据段段地址 MOV DX, OFFSET STRING ;为DOS调用设置入口参数 MOV AH, 9 ;为DOS功能调用设置功能号 INT 21H ;DOS功能调用,显示字符串 MOV AX, 4C00H ;为DOS功能调用设置功能号和入口参数 INT 21H ;DOS功能调用,返回DOS操作系统 CSEG ENDS ; 代码段结束 END START ; 汇编结束 2.5? ?汇编语言中的操作数常量:作为硬指令的立即数或伪指令的参数 变量:主要作为存储器操作数 2.5.1 常量常量表示一个固定的数值,它又分成多种形式1.2.3.4.常数 字符串 符号常量 数值表达式 (1)常数?指由10、16、2和8进制形式表达的数值,各种进制的数 据以后缀字母区分,默认不加后缀字母的是十进制数十进制由0 ~ 9数字组成,以字母D(d)结 尾(缺省情况可以省略)100,255D 64H,0FFH, 0B800H由0 ~ 9、A ~ F数字组成,以字母H 十六进制 (h)结尾。为避免与标识符混淆, 以字母开头的常数需要加一个前导0 二进制由0和1两个数字组成,以字母B(b) B 结尾 (2) 字符串? ??字符串常量是用单引号或双引号括起来的单个字符或多个 字符 其数值是每个字符对应的ASCII码值 例如: ‘d?(等于64H) ‘AB?(等于4142H) ‘Hello, Assembly !? (3) 符号常量? ?经常使用的常数,可通过给一个符号名赋值来表示 符号常量定义伪指令有“EQU”和“=”两种: 符号名 EQU 数值表达式 符号名 = 数值表达式 例:DAT EQU 99 NUM=100 ;等值语句 ;等号语句? ?EQU用于数值等价时不能重复定义符号名, “=”允许有重复赋值。例如: X= 7; X= X+5 ;“X EQU X+5”是错误的 汇编时,对EQU定义的符号名用对应的表达式进行“替换”。 例如: NUM ERR_MSG EQU 215 MOD 15 EQU DData Override ‖MESSAGEDB ERR_MSG ;等价于MESSAGE DB DData Override ‖ MOV CX, NUM+1 ;等价于MOV CX, 215 MOD 15+1 (4) 数值表达式? ? ??数值表达式一般是指由运算符连接的各种常量 所构成的表达式 汇编程序在汇编过程中计算表达式,最终得到 一个确定的数值,所以也是常量 表达式的数值在程序运行前的汇编阶段计算, 所以组成表达式的各部分必须在汇编时就能确 定 汇编语言支持多种运算符? 例如:mov ax,3*4+5 ;等价于:mov ax,17 构成数值表达式可使用以下几类运算符: ? 算术运算符 (+,-,*,/,mod) ? 逻辑运算符 (shl, shr, and, or, xor, not) ? 关系运算符 (gt, ge, eq, le, lt, ne) ? 地址运算符 (seg, offset) ? 类型运算符 (type, length, size) ????? ???【例 2-5】数值表达式及其 应用 ;汇编后形成的指令 ;汇编语言指令 MOV DH, B SHR ;MOV DH,19H 2 ;MOV BL,0 MOV BL, 8CH AND 73H ;MOV AH,0FFH MOV AH, 8CH OR 73H ;MOV AX,0 MOV AX, 10H GT 16 ;MOV BL,0FFH MOV BL, 6 EQ 0110B ;MOV BX,0022H MOV BX, 32+((13/6)MOD 3) 不良用法MOV AX, BX+2×√需要把BX的值与常数2相加并存入AX的操作只能在 程序执行阶段由以下两条指令完成: MOV AX, BX ;BX寄存器值存入AX寄存器 ADD AX, 2 ;AX寄存器的值加2,结果存AX 2.5.2 变量? ? ??变量实质上是指内存单元的数据,虽然内存单 元地址不变,但其中存放的数据可以改变 变量需要事先定义才能使用 变量定义伪指令为变量申请以固定长度为单位 的存储空间,并可以同时将相应的存储单元初 始化 定义后的变量可以利用变量名等方法引用其中 的数据,即变量的数值 1. 变量的定义?变量定义的汇编语言格式为: 变量名 伪指令 初值表? 变量名为用户自定义标识符,表示初值表首元素的逻辑地址,常称为符号地址。 ? 初值表是用逗号分隔的参数,主要由常量或“?”组 成。其中“?”表示未赋初值?多个存储单元如果初值相同,可以用复制操作 符(重复定义符)DUP进行定义: 重复次数 DUP(重复参数) 变量定义伪指令DB(Define Byte):每个数据占用一个字节(8b)DW(Define Word):每个数据占用一个字(16b) DD(Define Double Word):每个数据占用一个双字(32b) DQ(Define QuartWord):每个数据占用8个字节(64b) DT(Define Ten Byte ):每个数据占用10个字节(80b) 【例 2-3】 变量定义举例DSEG SEGMENT BVAR DB 1,-2,'AB',3 DUP('a'),? ;字节变量, 8项 WVAR DW 1,-2,'AB',3 DUP('a'),? ;字变量,7项 DVAR DD 1,-2,'AB',3 DUP('a'),? ;双字变量,7项 VAR1 DW WVAR, DVAR, DVAR-WVAR, VAR1-DVAR ;字变量,4项 VAR2 DD WVAR, DVAR, DVAR-WVAR, VAR1-DVAR ;双字变量,4项 VAR3 DB DVAR-WVAR, VAR1-DVAR ;字节变量,2项 DSEG ENDS 有符号数用它的补码存储 ? 字符用ASCII代码存储 ? DB定义的数据在 [-128~255] 之内 ? 变量名代表首个单元的地址 ? DW定义的数据在[-32768, 65535]内 ? 出现在参数部分的变量名用这个变量的偏 移地址代替 ? 多字节数据的存放: “高高低低”(小端方式)? 存储区域分配 (1,-2,'AB',3 DUP('a'),?) 2. 变量和标号的属性?变量和标号都表示存储单元。? ?变量表示的存储单元中存放数值 标号表示的存储单元中存放指令代码。 ① 段属性(SEG): 变量或标号对应存储单元所在段的段地址。 ② 偏移地址属性(OFFSET):变量或标号对应的首个存储单元 的段内偏移地址。 ③ 类型属性(TYPE): 变量的类型属性指的是变量占用存储单 元的字节数。属性值由变量定义伪指令来决定。主要的变量和标 号类型属性及返回值?变量和标号具有如下三种属性:? ? ?变量 / 标号 / 常数DB DW DD DF DQ DT 1 2 4 6 8 10 NEAR FAR -1 -2 常数 0 3. 析值运算符析值运算符也称为数值回送运算符,把一些特 征或存储器地址的一部分作为数值回送。 ? 常用析值运算符? SEG 名字/标号 OFFSET 名字/标 号 TYPE 名字/标号 LENGTH 变量名 返回名字或标号的段地址 返回名字或标号的偏移地址 返回变量或标号的类型,类型用数值表示 返回利用DUP定义的变量中元素的个数, 即重复操作符DUP前的重复次数值,其它 情况回送1 返回LENGTH×TYPE的值SIZE 变量名 设变量LIST定义在DATA段中, DATA SEGMENT LIST DW 10,20,30 DATA ENDS 下面三条指令都是把DATA段的段基址装入AX:MOV AX, DATA ;DATA代表该段的段基址,是一个立即数 MOV AX, SEG DATA ;取DATA的段基址,结果是立即数 MOV AX, SEG LIST ;取LIST的段基址,结果是立即数 对比: MOV AX, LIST MOV AX, OFFSET LIST ;取出变量LIST第一个元素送入AX;取变量LIST的偏移地址送入AX A DB DABCDE‖ ;TYPE=1, LENGTH=1, SIZE=1 B DW 3 DUP(5), 4 DUP(-1);TYPE=2, LENGTH=3, SIZE=6 C DD 34, 49, 18 ;TYPE=4, LENGTH=1, SIZE=4 MOV AX, TYPE A MOV BX, LENGTH B MOV CX, SIZE C ;AX=1 ;BX=3 ;CX=4 4. 属性运算符?提高访问变量、标号和一般存储器操作数的 灵活性 ? 常用属性运算符类型 PTR 变量名/标 临时指定或临时改变变量和标号的使用 号 类型 THIS 类型 用于创建采用当前地址但为指定类型的 操作数 SHORT 标号 将标号作为短转移处理 段寄存器 : 用来给一个存储器操作数指定一个段属 性, 即段超越 5. 变量的应用变量具有存储单元的逻辑地址 ? 指令语句中?? 通过变量名引用其指向的首个数据 ? 通过变量名加减位移量存取以首个数据为基地址的前后数据?伪指令语句中? 主要是在另一个变量定义语句中作为参数部分出现。MOV AL, BVARMOV BL, BVAR+3;AL← 1;BL← ?A? 类型限定操作符 PTR?类型限定操作符对类型属性进行设置类型名 PTR 名字/标号? 类型名可以是BYTE、WORD、DWORD(依次表示字节、字、双字)等,或者是NEAR、FAR (分别表示近、远)等例:MOV AX, BVAR× √MOV AX, WORD PTR BVAR 【例 2-3】 变量应用举例;代码段 MOV CL, BVAR ; BVAR第1个数据送CL,(CL)=01H MOV CH, BVAR+2 ; BVAR第3个数据送CH,(CH)=41H MOV BX, WVAR ; WVAR第1个数据送BX,(BX)=0001H MOV SI, WVAR+2 ; WVAR第2个数据送SI,(SI)=0FFFEH(-2) MOV DX, WORD PTR DVAR ; DVAR第1个数据低字送DX,(DX)=0001H MOV AX, WORD PTR DVAR+2 ; DVAR第1个数据高字送AX,(AX)=0000H MOV DI, VAR1+4 ; VAR1第3个数据送WVAR第7个数据单元。 MOV WVAR+12, DI
6. 变量的定位? ???汇编程序按照指令的先后顺序一个接着一个分配存储 空间,按照段定义伪指令规定的边界定位属性确定每 个逻辑段的起始位置(包括偏移地址) 定位伪指令ORG控制数据或代码所在的偏移地址 ORG 参数 ORG伪指令是将当前偏移地址指针指向参数表达的偏 移地址。例如: ORG 100h ;从100H处安排数据或程序 ORG $+10 ;偏移地址加10,即跳过10个字节空间 汇编语言程序中,符号“$”表示当前偏移地址值 例:变量定位DATA SEGMENT ORG 10H VAR1 DB 1,'A' ORG $+2 VAR2 DW 1234H, $- VAR1 DATA ENDS 2.6?? ?的寻址方式MOV AX , 3069H MOV AL , BH寻找指令所需的操作数或操作数地址的方法 2.6.1 立即寻址 2.6.2 寄存器寻址?? ? ? ?2.6.3 直接寻址2.6.4 寄存器间接寻址 2.6.5 寄存器相对寻址 2.6.6 基址变址寻址 2.6.7 相对基址变址寻址MOV AX , [ 2000H ]MOV AX , [ BX ] MOV AX , 06H [ SI ] MOV AX , [ BP ] [ DI ] MOV AX , 06H [ BX ] [ SI ]操作数位于存储器 考核要点?寻址方式? ?能够识别指令中操作数采用的寻址方式 能够根据寻址方式确定操作数的来源?能够在指令中正确地使用各种寻址方式 2.6.1?立即寻址特点:操作数以常量形式出现在指令中(立即寻址、立即数) 操作码之后,存放在代码段中 立即数可以是16位或8位?例:MOV AX,1234H OP 34H 12H低地址代 码 段AXAH AL┇高地址1. 指令在代码段的存储形式 2. 指令的运行结果 ?立即数寻址只能用于源操作数位置,不能用于目的 操作数位置MOV AX,1234H ; √MOV 5,AL ;?立即寻址只能用于源操作数指令中立即数长度应与其他操作数保持一致MOV AH, -40MOV AX, -40 MOV AX, ?A?; D8H?AH; FFD8H?AX ; 0041H ?AXMOV BL, ?B?; 42H ?BL MOV AX, 34D8H ;34H?AH, D8H?ALMOV AL, 1234H ;?常用于给寄存器或存储单元赋初值(段寄存器、标志寄存器除外) 2.6.2?寄存器寻址特点:操作数存放在CPU寄存器中,指令指定寄存器名 寻址在CPU内部进行,指令执行速度快 例:MOV BX,AX?AX BXCX操作数可以是8位,也 可以是16位, 但 SRC 和 DST 的字长 要一致。DX?例:MOV AH,BL ; MOV DX,AX ;(BL)--&AH (AX)--&DX 2.6.3?直接寻址存储器操作数特点:操作数位于存储器中(有效地址EA) 在指令中直接给出操作数所在存储单元的偏移地址 将该存储单元作为起始位置,取出数据,8位或16位?分两种情况 (1)系统默认操作数存放在数据段(段基址存放在DS)例:MOV AX , [1200H](2)操作数存放在其他逻辑段 例:MOV AX , ES:[1200H][ ]内:是偏移地址! 不是立即数应在指令中指定段跨越前缀由这个段跨越前缀指明 源操作数存放在附加段操作数的物理地址 =(ES)×10H +1200H 例:MOV AX , [1200H]? ?1. 源操作数 2. 指令的执行结果设(DS)=3000H,则该数据段起始地址为:30000H 操作数的物理地址 =(DS)×10H +偏移地址 = 3000H×10H+1200H = 31200H30000H操作数所在 存储单元的物理地址┇31200HAH AL AX 11 2222H 11H数 据 段 段跨越前缀指令?没有指明时,一般的数据存放在DS段; 使用BP时,则存放在SS段 默认的情况允许改变,需要使用段跨越前缀指令; 8086指令系统中有4个:? CS: ? SS: ? DS: ? ES:?;代码段超越,使用代码段的数据;堆栈段超越,使用堆栈段的数据;数据段超越,使用数据段的数据 ;附加段超越,使用附加段的数据 ? ?MOV AX, [0300H] 符号化的偏移地址 MOV AX, BUFF 其中BUFF为变量的符号名(符号地址)在汇编语言指令中,可以用符号地址代替偏移地址?注意区分:MOV AX,2000H ; 立即数寻址,无需计算物理地址 MOV AX,[2000H]; 直接寻址 2.6.4?寄存器间接寻址基址寄存器、变址寄存器特点:操作数存放在存储器中操作数的偏移地址存放在寄存器BX、BP、SI、DI中MOV AX, [BX] MOV CX, [BP] MOV AX, ES:[SI]?PA = (DS) ? 10H + (BX) PA = (SS) ? 10H + (BP) PA = (ES) ? 10H + (SI)分两种情况 (BX)(1)操作数存放在数据段(DS)?操作数的物理地址 = (DS)×10H + (SI) (DI) (2)操作数存放在堆栈段(SS)?操作数的物理地址 = (SS)×10H + (BP) ?例:MOV AX,[BX]注意 方括号!1. 源操作数 2. 指令的执行结果设(DS)= 3100H,(BX)= 1100H?操作数的物理地址 =(DS)×10H +偏移地址 = 3100H×10H+1100H = 32100H操作数所在存储 单元的物理地址31000H┇32100H AH AL AX 5A 2727H 5AH数 据 段 ?例:MOV CX,[BP] 设(SS)= 2500H,(BP)= 1000H ?寄存器间接寻址适用于对数组、字符串、表格的处理, 执行完一条指令后,只需修改寄存器内容就可以取出表 格下一项,相当于指针不允许使用AX、CX、DX 存放 EA MOV AX, [CX] ???SRC 和 DST 的字长一致MOV DL, [BX] MOV DX, [BX] ; [BX]指示一个字节单元 ; [BX]指示一个字单元?注意区分: MOV AX,BX; MOV AX,[BX];寄存器寻址,无需计算物理地址 寄存器间接寻址 MOV AX,2000H ; 立即数寻址,无需计算物理地址MOV AX,[2000H]; 直接寻址,存储器MOV AX,BX; MOV AX,[BX]; 寄存器寻址,无需计算物理地址 寄存器间接寻址,存储器 2.6.5?寄存器相对寻址指令中给出操作数的偏移地址, 有效地址EA=BX/BP/SI/DI+8/16位位移量特点:操作数存放在存储器中MOV MOV MOV MOV?AX , [BX+20H] DX , [BX+DAT] ?位移量可以用 DX , [BP+40H] AX, [SI+1200H] = MOV AX, 1200H[SI ] 符号常量表示 数据段 DS堆栈段 SS = (DS)×10H +(BX) + 位移量 或= (SS)×10H +(BP)?位移量是8位 或16位符号数BX/SI/DIBP?操作数的物理地址 ?例:MOV AX,[SI+1200H] 设(DS)= 2000H,(SI)= 1500HPA = (DS)×10H +(SI)+1200H = 22700H 2.6.6?基址变址寻址有效地址EA=BX/BP+SI/DI特点:操作数存放在存储器中MOV AX, [BX+DI] MOV AX, [BX] [DI] MOV AX, [BP] [SI]?P52 图2-29操作数的物理地址 = (DS)×10H +(BX) +(SI或DI) 或= (SS)×10H +(BP) 必须是一个基址寄存器和一个变址寄存器的组合 MOV AX, [BX] [BP] ? ?BX和BP不能同时使用 MOV AX, [SI] [DI] ? ?SI和DI不能同时使用? 2.6.7?相对基址变址寻址有效地址EA=BX/BP+SI/DI+8/16位位移量特点:操作数存放在存储器中MOV AX, [06H+BX+SI] MOV AX, 06H [BX+SI] MOV AX, 06H [BX] [SI]?操作数的物理地址= (DS)×10H +(BX) +(SI或DI)+ 位移量 或= (SS)×10H +(BP) ?例1:MOV AX , [BX+SI+DAT] MOV AX , DAT[BX+SI] MOV AX , DAT[SI][BX] 例2:MOV AX , [BP+SI+DAT] 例3:MOV AX , DAT[BX+BP] MOV BX , NUM[SI+DI] 以上两条指令有错吗?? 这三种写法完全等价???BX和BP不能同时使用 ?SI和DI不能同时使用 ?例:MOV AX, DAT[BX+SI];DAT是符号地址 若 (DS)=3000H, (BX)=2000H, (SI)=1000H, DAT=0250H 物理地址= (DS)×10H +(BX) +(SI)+ 位移量 3H H 33250H3H+20H 43HAX 4320H 相对基址变址寻址方式通常用于二维数组、堆栈中数组的 访问。?在访问堆栈中数组时,可以在 BP中存放堆栈顶的地址, 位移量表示数组第一个元素到栈顶的距离, 变址寄存器SI(也可为DI)指出数组元素。存储器中由多个记录组成的文件, 位移量指向文件之首, 基址寄存器指向某个记录, 变址寄存器指向记录中的一个元素。 【例】字数组WVAR定义如下,请编写指 令序列,用多种方法实现将第4个字元素 (即 -3)送至AX。 ? WVAR DW 1,-2,2,-3,3,-4 ;字变量? ;方法1,直接寻址: MOV AX, WVAR+3*2 ;WVAR代表数组第一个元素地址,第4个元素位移量为3*2 ? ;方法2,寄存器间接寻址: MOV BX,OFFSET WVAR+3*2 ;数组WVAR第4个元素偏移地址装入BX MOV AX,[BX] ? ;方法3,寄存器相对寻址: MOV SI,3*2 ;WVAR数组第4个元素距首个元素的位移量为3*2,置入SI MOV AX, WVAR[SI]??;方法4,寄存器相对寻址:LEA BX, WVAR ;WVAR数组首个元素地址置入BXMOV AX,3*2[BX] ??;方法5,基址变址寻址: LEA BX, WVAR ;WVAR数组首个元素地址置入BX MOV SI,3*2 ;第4个元素距首个元素的位移量为3*2,置入变址寄存器SI MOV AX,[BX+SI] ;方法6,相对基址变址寻址:(本例中该方法不是很恰当)LEA BX, WVAR ;WVAR数组首个元素地址置入BX MOV SI,4 ;第3个元素距首个元素的位移量为2*2,置入变址寄存器SI MOV AX,[BX+SI+2] ;第4个元素距第2个元素的位移量为2,作为相对量。 寻址方式习题MOV AX,2000H ; 立即数寻址,无需计算物理地址 MOV AX,[2000H]; 直接寻址,存储器 MOV AX,BX;寄存器寻址,无需计算物理地址寄存器间接寻址,存储器MOV AX,[BX];MOV AX , [BX+20H]; 寄存器相对寻址 MOV DX , [BP+40H]; MOV AX, [SI+DAT]; MOV AX , DAT[SI]; MOV AX , [BX+SI+DAT]; 相对基址变址寻址 MOV AX , DAT[BX+SI]; MOV AX , DAT[SI][BX]; 寄存器相对寻址 ?(DS)=2000H, (ES)=2100H, (SS)=1500H, (SI)=00A0H, (BX)=0100H, (BP)=0010H, 数据段中变量名VAL的偏移 地址为0050H, 试指出下列源操作数的寻址方式是什么? 其物理地址值是多少? 1. MOV AX, 00ABH3. MOV AX, [1200H] 5. MOV AX, [BX]2. MOV AX, BX4. MOV AX, VAL 6. MOV AX, ES:[BX]7. MOV AX, [BP]9. MOV AX, 1100[BX] 11. MOV AX, [BX][SI]8. MOV AX, [SI]10. MOV AX, VAL[BX] 12. MOV AX, VAL[BX][SI] ?(DS)=2000H, (BX)=0100H, (SI)=0002H, (20100)=12H, (20101)=34H, (20102)=56H, (20103)=78H, (21200)=2AH, (21201)=4CH, (21202)=B7H, (21203)=65H,求下列各条指令执行后AX寄存器的内容。1.内存单元20位物理地址1. 2. 3. 4. 5.MOV AX, 1200H MOV AX, BX2.确定数据位数 (AX)=1200H以该地址作为起始地址, (AX)=0100H 取8/16位MOV AX, [1200H]MOV AX, [BX] MOV AX, 1100[BX](AX)=4C2AH (AX)=3412H (AX)=4C2AH6.7.MOV AX, [BX][SI]MOV AX, 1100[BX][SI](AX)=7856H(AX)=65B7H 段寄存器的使用规定总结访问存储器的方式 取指令堆栈操作 一般数据访问 BP基址的寻址方式 串操作的源操作数 串操作的目的操作数默认 CSSS DS SS DS ES可超越 无无 CS ES SS CS ES DS CS ES SS 无偏移地址 IPSP 有效地址EA 有效地址EA SI DI 2.72.7.1 2.7.2的指令系统数据传送类指令 ★ 算术运算类指令2.7.32.7.4 2.7.5 2.7.6逻辑运算和移位类指令控制转移类指令 ★ 处理机控制类指令 串处理类指令 重点关注:① 指令的汇编格式 ② 指令的基本功能 ③ 指令支持的寻址方式 ④ 指令的执行对标志位的影响 ⑤ 指令隐含的的操作数等特殊要求 2.7.1 数据传送类指令?通用数据传送指令MOV、PUSH、POP、XCHG 累加器专用传送指令?IN、OUT、XLAT?地址传送指令 LEA、LDS、LES 标志寄存器传送指令 LAHF、SAHF、PUSHF、POPF 符号扩展指令 CBW、CWD?? 可以是1. 通用数据传送指令(1) 传送指令: 执行操作:?寄存器 ?存储器可以是 ?立即数 ?寄存器MOV DST, SRC (DST) ? (SRC)?数据复制 ?源操作数不变?存储器注意:* DST、SRC的字长必须一致 * DST 不能是立即数和CS * DST、SRC 不能同时为段寄存器 * 立即数不能直接送段寄存器 * 不影响标志位 MOV AL ,100H MOV 1000H , AX MOV CS , AX ? MOV DS, ES ? ? * DST、SRC 不能同时为存储器寻址 MOV [BX], [1200H] MOV DS, 2000H ? ? ? MOV指令传送路线图?? ?立即数到寄存器/存储器 寄存器与寄存器/存储器之间 寄存器/存储器与段寄存器之间寄存器AX BX CX DXBP SP SI DI立即数除CS除CS存储器段寄存器CS DS SS ES 【例 2-7】数据传送MOV CL, 05H MOV [BX], 2008H MOV BL, AL MOV SI, BP MOV DAT[SI][BP], BX MOV AX, [2008H] MOV BX, DS ;立即数至寄存器,8位数据传送 ; ; ;寄存器至存储器 ;存储器至寄存器 ;段寄存器至寄存器 至存储器,16位数据传送 16位数据传送 ;寄存器至寄存器 ,8位数据传送MOV [BP], ESMOV DS, AX;至存储器;寄存器至段寄存器MOV DS , [BX+SI+50H] ;存储器至段寄存器 【例 2-8】 将存储单元3000H的一个字的内容送至 4000H单元。 MOV AX, [3000H] MOV [4000H], AX? 也可以通过其它通用寄存器传送,但不能直接在两个存储单元间传送 【例 2-9】 判断指令对错,并指出错误原因。 ;错,两操作数字长不一致 MOV AL,300 MOV AX,BL MOV 30H,AL;错,两操作数字长不一致 ;错,立即数不能用做目的操作数 ;对MOV AX,CSMOV SS,SP MOV DS,1234H;对;错,立即数不能给段寄存器赋初值 ;错,CS不能作为目的操作数MOV CS,AXMOV DS,CS;错,两操作数不能同时为段寄存器MOV [BX],[100H] ;错,两操作数不能同时为存储器操作数 ;错,DX不能用于寄存器间接寻址 MOV [DX],BL MOV [BX],30H;错,两操作数类型不明确MOV AX,[SI][DI] ;错,两个变址寄存器 (2)堆栈操作指令 (进栈、出栈)?存取原则:LIFO(后进先出) ?双字节(字)操作80X86的堆栈结构段起始地址低地址入栈SP-2,出栈SP+2?8086堆栈生成方向:向低地址方向生成┇栈顶(数据段、代码段从较小地址开始分配和 使用); SP ?段基址置入SS?SP指向栈顶堆 栈 段栈 区栈底┇高地址 ?进栈指令:执行操作:PUSH src ;SP&--(SP)-2 ((SP)+1,(SP))&--(src) 16位操作数指令说明:? ? ?源操作数可以是寄存器、存储器或段寄存器,不允许立即数 堆栈操作指令必须以字(16位)为单位操作堆栈操作指令不影响标志位例:PUSH AX PUSH DAT[BX][SI] PUSH CS PUSH 1234H? ?出栈指令: POP dest ;执行操作: dest&--((SP)+1,(SP)) SP&--(SP)+216位指令说明:? ?目的操作数可以是通用寄存器、存储器或段寄存器(CS除外) 堆栈操作指令必须以字(16位)为单位操作例: POP POP POP POPBX DAT[BX][SI] DS CS 例:假设 (AX) = 2107 H , 执行 PUSH AX低地址 (SP)? 低地址 07H 21H(SP)?* * * ** * * *高地址* * * ** * * *进栈方向高地址PUSH AX 执行前PUSH AX 执行后 例: POP BX低地址 (SP)?低地址07H21H07H21H* * * ** * * *(SP)?高地址* * * ** * * *出栈方向高地址POP BX 执行前POP BX 执行后(BX) = 2107H 【例 2-11】 判断指令对错,并指出错误原因。PUSH 1234H ;错 , PUSH指令不支持立即寻址POP CS PUSH BL ;错CS不能作为POP指令的目的操作数;错 , 操作数必须为字类型 ?保护断点 调用子程序或发生中断时,将断点地址推入堆栈以保护断 点地址。当子程序返回或中断返回时,将断点地址从堆栈 中弹出,以保证正确返回到主程序,继续执行。?交换数据 (AX?BX) 利用堆栈“先进后出”的原则,交换数据。 PUSH AX;简单的方法: 借助第三个变量 MOV DX, AX; MOV AX, BX; MOV BX, DX;PUSH BX;POP AX; POP BX;想要保证原有内容不变, 弹出堆栈的顺序必须与推 入堆栈的顺序相反: PUSH AX; PUSH BX; POP BX; POP AX; (3) 交换指令: XCHG OPR1, OPR2执行操作: (OPR1) ? (OPR2)例: XCHG AX , CX ; 寄存器之间 XCHG BL , DL ; XCHG [DI] , AX ; 寄存器与存储器之间 XCHG DX, [BP+SI]说明: ?两个操作数长度必须相同,允许字或字节操作 ?两个操作数中必有一个在寄存器,不允许2个存储器交换 ?操作数不允许为段寄存器 ?本指令不影响标志位 例: XCHG DX, DATA[BP] 设(SS)=5000H, (BP)=0400H, DATA=1800H 物理地址=5000H×10H+H=51C00H 执行前 DX 37CDH 51C00H 1 执行后 DX 6D42H 51C00H 142H 6DHCDH 37H 2. 累加器专用传送指令?I/O端口输入/输出指令(1) IN (input)(2) OUT (output)输入指令输出指令 (3)查表指令 (换码指令) : XLAT 执行操作: (AL) ? ( (BX) + (AL) )?在指令中隐含BX和AL ?BX存放表首单元的偏移地址; AL存放表内偏移量 ?(BX)+(AL)为表中待查数据 的偏移地址 注意: *表中元素序号从0开始 *表格长度不超过256 *不影响标志位表首地址 (BX)40H 41H 42H段起始地址 DS(AL)待查数据43H44H 45H 46H表数 据 段47H48H 49H 【例】 MOV BX , 2000H MOV AL , 04H XLAT段起始地址 DS 表首地址 (BX) (AL) 待查数据40H 41H 42H 43H 44H执行结果: (AL)=44H45H46H 47H 48H表数 据 段49H 【例2-12】内存的数据段有一张十六进制的ASCII码表,首地 址为TABLE,现希望通过查表法得到A(表中序号为10的元素, 序号从0开始)的ASCII 码值,并将结果送入AL中。 TABLE 30H +1 31H +2 32H +3 33H +4 34H +5 35H +6 36H +7 37H +8 38H +9 39H +10 41H +11 42HLEA BX , TABLE; MOV AL , 0AH; XLAT;执行结果: ‘A‘的ASCII 码存放到AL中,(AL)=41HAL41H
3. 地址传送指令(1) 有效地址(偏移地址)送寄存器LEA (Load effective address)16位通用寄存器 内存单元(存储器)格式: LEA dest , src 将源操作数的有效地址(偏移地址)送入指定的寄存器MOV BX, [2000H] ; 偏移地址为2000H的内存单元中的数据→BX例: LEA BX, [2000H] ; 有效地址2000H赋给BX LEA AX, [BP][DI] ; LEA DX, DAT[BX][SI] ; 例:LEA DX , DAT[BX+SI] ;若(BX)=0040H, (SI)=003CH, DAT=0F62H, (139EH)=36, (139FH)=A7H, 指令执行后 (DX) = ?DX=BX+SI+DAT=F62=139EHDX寄存器中存放的是有效地址,而不是该内存单元的内容。 MOV DX , DAT[BX+SI] ; DX寄存器中存放的是有效地址为139EH的内存单元中的内 容,而不是有效地址。 【例 2-13】LEA BX,[SI+0500H]; 假设(DS)=3000H,(SI)=0100H。执行结果为(BX) =0600H。注意区别: LEA BX,[SI+0500H]; MOV BX,[SI+0500H];?LEA 指令是将存储单元的有 效地址EA送入指定的寄存 器 MOV指令传送的是存储单元 中的操作数。 (2) 地址指针送寄存器和指定段寄存器LDS(Load DS with pointer)地址指针送寄存器和DSLES(Load ES with pointer)地址指针送寄存器和ES DS/ES 通用寄存器地址指针: 16位段基址 : 16位偏移地址 ∴地址指针为32位 =4字节=双字 16位通用寄存器存储器格式: LDS dest , 操作: dest ←(src) DS ←(src+2)srcLES dest , src dest ←(src) ES ←(src+2)将源操作数指定的双字(32位)单元中,低字(低16位)传 给指定寄存器,高字(高16位)传递给DS/ES.说明:?源操作数必须位于存储器当中,采用存储器寻址 ?目的操作数必须是16位通用寄存器,不允许使用段寄存器LDS/LES 指令常用于串操作时建立初始的地址指针。该逻辑地址须用 伪指令预先定义在内存单元中, LDS/LES 指令完成一个逻辑地址( 32 位 地址指针)的传送。源数据串隐含的段寄存器为 DS,偏移地址在 SI;目 的数据串隐含的段寄存器为ES,偏移地址在DI? 一条将32位地址指针装入DS:SI的指令例:LDS SI , ADDR 设执行指令前(DS)=1600H, ADDR=0022H(内存单元偏移地址), (16022H)=2200H, (16024H)=3000H, 指令执行后(DS)=?, (SI)=? 源操作数所在内存单元的物理地址 = (DS)×10H+ADDR =1600H ×10H+0022H =16022H 执行结果:(DS)= 3000H (SI) = 2200H (DS) : (SI) = 3000H : 2200H这是新的地址指针16000H: :16022H1H16025H00H 22H 00H 30H偏移 地址SI DS段基址 一条将32位地址指针装入ES:DI的指令例:LES DI , [BX] 设执行指令前(DS)=B000H, (BX)=080AH, (B080AH)=05AEH, (B080CH)=4000H, 指令执行后(ES)=?, (DI)=? 源操作数所在内存单元的物理地址 = (DS)×10H+BX =B000H ×10H+080AH =B080AH 执行结果:(ES)= 4000H (DI) = 05AEH (ES) : (DI) = 4000H : 05AEH这是新的地址指针B0000H: :AE B080BH 05H B080CH 00H B080DH 40HB080AH偏移 地址DI ES段基址 ?LEA与LDS的区别 LEA SI, BUFF 将源操作数的16位偏移地址送入SILES DI, BUFF将32位的源操作数送入ES:DIBUFF(21000H) +1 +2 +3 45H D6H 00H 50H设(DS)=2000H, EABUFF=1000H执行后: SI=1000H DI=D645H ES=5000H思考: LDS DI, BX是合法指令吗? TABLE (DS):1000H40 H 00 H 00 H 30 HMOV BX, TABLE MOV BX, OFFSET TABLE LEA BX, TABLE LDS BX, TABLELES BX, TABLE; (BX)=0040H ; (BX)=1000H ; (BX)=1000H ; (BX)=0040H ; (DS)=3000H ; (BX)=0040H ; (ES)=3000H注意:* 不影响标志位 * REG 不能是段寄存器 * SRC 必须为存储器寻址方式 (4) 标志寄存器传送指令LAHF (load AH with flags) SAHF (store AH into flags) PUSHF (push the flags or eflags) POPF (pop the flags or eflags) 标志寄存器低8位送AH AH送标志寄存器低8位 标志进栈 标志出栈 ① LAHF 标志寄存器送AH指令 格式:LAHF 操作:AH&--FLAGS 7-0 将标志寄存器的最低8位送AH中 ② SAHF 送标志寄存器指令 格式:SAHF 操作:FLAGS 7-0&--(AH) 将AH寄存器内容送FLAGS低8位AHSAHF LAHFFLAGODI T S ZAPC说明: 1) 无操作数 2) FLAGS中含若干标志位,但LAHF指令不影响标志位, SAHF影响 ③ PUSHF 标志进栈指令 格式:PUSHF 操作:SP&--(SP)-2 ((SP)+1,(SP))&--(FLAGS)④ POPF 标志出栈指令 格式:POPF 操作:FLAGS&--((SP)+1,(SP)) SP&--(SP)+2说明:无操作数 POPF 影响标志位 (5) 符号扩展指令1. 字节扩展为字 CBW ; 将AL的符号位扩展到AH,形成 AX2. 字扩展为双字 CWD ;将AX的符号位扩展到DX,形成 DX,AX?两条指令均不影响标志位???数据位数增加,但数据位数并没有改变扩展的目的: 使参加算术运算的操作数类型匹配例:(AX) = 0BA45H CWD ; (DX)=0FFFFH (AX)=0BA45H CBW ; (AX)=0045H 2.7.2 算术运算类指令? 加法指令ADD、ADC、INC ? 减法指令 SUB、SBB、DEC、NEG、CMP ? 乘法指令 MUL、IMUL ? 除法指令DIV、IDIV? 十进制调整指令 DAA、DAS、AAA、AAS、AAM、AAD 2.7.2 算术运算类指令?参与运算的数据: 无符号数或有符号数(补码) 二进制数或十进制数(压缩型BCD码或非压缩型BCD码) 字节数据或字数据?算术运算指令执行后,会影响状态标志位 如:CF、OF、ZF、SF 、AF、PF (INC、DEC指令不影响CF标志,但影响其余5个) 双操作数指令:源操作数:立即数、通用寄存器或存储器 目的操作数:通用寄存器或存储器 单操作数指令:通用寄存器或存储器,不允许立即数 (段寄存器不能参加运算)? 1. 加法指令(1) 加法 ADDADD dest ,dest ← dest + src(2) 带进位加法 ADC (Add with carry) ADC dest ,? 注:①一般用于多字节 数据加法dest ← dest + src + CF源操作数:立即数、通用寄存器或存储器 目的操作数:通用寄存器或存储器,不能是立即数 两个操作数不能同时为存储器操作数 段寄存器不能参加 加、减、乘、除法运算 ADD、ADC指令支持字节或字(8位或16位)操作② ③ ④⑤运算结果影响标志位 例:ADD AX, 3100H ; ADD DX, SI ; ADD AL, [BX] ;寄存器与立即数相加 寄存器之间 寄存器加存储器操作数ADD DAT[BX], AL ; 存储器操作数加寄存器 ADD [DI], [SI] ; ADD指令示例: MOV AL , 7EH ADD AL , 5BH ;指令执行后,(AL) = ?各标志位如何??最高位无进位:CF=0D4 D3 D7 D6 (AL) 0 1 1 1 1 1 1 0 + 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1?令C7=D6向D7的进位 C8=D7向上的进位 OF=C8C7=0 1=1 ?SF=1?结果≠0,ZF=0?D4向D5有进位,AF=1 ?结果中“1‖的个数为奇数,PF=0 例: MOV DX , 4652H MOV BX , 0F0F0H ADD DX, BX; 指令执行后,( DX ) = ?各标志位如何? 01 0010 + 11 1 10 4652H + F0F0H 1 3742H 进位进位执行后:(DX)=3742H CF=1 有进位 OF=0 无溢出 ZF=0 结果不为0 SF=0 结果为正 [例] P,Q,R均为8位有符号数,求它们的和,送入TOTAL ? 将三个8b有符号数的和保留为16b。 DATA MOV AL, P P CBW Q MOV DX, AX R MOV AL, Q TOTAL CBW DATAADD MOV CBW DX, AX AL, RSEGMENT ;取第一个数 DB 77H ;扩展为16位 DB 9AH ;第一个数转存入DX DB 0FEH DW ;取第二个数 ? ENDS ;扩展为16位;加第二个数 ;取第三个数 ;扩展为16位ADDMOVDX, AXTOTAL, DX;加第三个数;保存三个数的和 例:ADC CX, 3100H ; ADC AL, BL ; ADC DX, [BX] ; ADC [SI], 3100H ;寄存器与立即数相加 寄存器之间 寄存器加存储器操作数 存储器加立即数ADC DAT[BX], AL ; 存储器操作数加寄存器 ADC指令示例――双字加法(双精度加法)设目的操作数存放在DX和AX中, AX存放低字, DX存放高字 源操作数存放在BX和CX中, CX存放低字, BX存放高字指令序列为: ADD AX, CX ;低位加 ADC DX, BX ;高位加 CF ADC DX ADD AX CX AX+BX DX H+H=? 执行前,目的操作数:(DX)=0418H, 源操作数:(BX)=1005H, ADD AX, CX ;低位加 ADC DX, BX ;高位加 (AX)=0F365H (CX)=0E024H+0418H DX 1005H BX 1 CF 141EH DX+0F365H 0E024HAX CX1D389H AXCF=0,OF=0,SF=0,ZF=0CF=1 (3) 加1指令 INC INC(Increment) dest ← (dest) + 1? 操作数:寄存器或存储器 ? INC指令支持字节或字(8位或16位)操作 ? 运算结果影响标志位,但对CF没有影响例: INC DL ; (DL)= (DL) + 1 ,8位寄存器加1 INC SI ; (SI)= (SI) + 1,16位寄存器加1 INC BYTE PTR [BX][SI] ; 存储器操作数加1,字节操作 INC WORD PTR [DI] ; 存储器操作数加1,字操作 由于只有一个操作数,为存储器操作数时需指明操作类型。? 设(AL)=FFH,比较ADD AL, 1 和 INC AL INC指令示例――多用于循环程序LEA BX, ARRAY MOV AL, [BX] …… INC BX MOV BX, 0 MOV AL, ARRAY[BX] …… INC BX偏移地址 计数ARRAY +1 +2 +3a1 a2 a3 a48088中,执行INC BYTE PTR[BX]指令(指令已在指令 2 个总线周期。 队列中)需要 2. 减法指令(1) 减法SUB (Subtract) SUB dest , dest ← dest - src一般用于多字节 数据减法(2) 带借位减法SBB (Subtract with borrow)SBB dest ,dest ← dest - src - CF(3) 减1指令DEC (Decrement)DECdest ← (dest) - 1? 不影响CF标志位,同INC指令 (4) 求补指令NEG (Negate)NEG操作数≠0,CF=1 操作数=0,CF=0dest ← 0 - dest?操作数按位求反后末位加1 ?利用求补指令,可得到负数的绝对值(5) 比较指令CMP (Compare) CMP dest , dest - scr?不保存结果,只是根据结果设置标志位 ? CMP指令后常跟一条条件转移指令,根据比较结果不同, 产生不同的程序分支 ?以上5种指令对操作数的要求和对标志位的影响同加法指令 例:SUB AL, 37H ; SUB BX, DX ; SUB CX, [BX] ; SUB [SI], 2000H ; SUB DAT[BX], AL ; DEC BL ; DEC CX ; DEC BYTE PTR [BX] ;寄存器与立即数相减寄存器之间寄存器减存储器操作数 存储器减立即数 存储器操作数减寄存器 (BL)= (BL) - 1 ,8位寄存器减1 (CX)= (CX) - 1,16位寄存器减1 存储器操作数减1,字节操作DEC WORD PTR [BP][SI]; 存储器操作数减1,字操作 SUB指令示例 例: SUB [SI+14H], 0136H 指令执行前(DS)=3000H, (SI)=0040H, (30054H)=4336H, 目的操作数所在内存单元的物理地址 =(DS)×10H+SI+14H =3 10 则指令执行后, 4336H - 11 0110 - 0136H目的&源,有借位,CF=1 目的&源,无借位,CF=0 最高有效位向高位的进位: 有进位,CF=0 无进位,CF=1执行后:(30054H)=4200H11 0110 + 00 0 00CF=0, OF=0, SF=0, ZF=0 例: SUB DH, [BP+4] 指令执行前(DH)=41H,(SS)=0000H,(BP)=00E4H,(000E8H)=5AH 源操作数所在内存单元的物理地址 =(SS)×10H+BP+4H =000E8H 则指令执行后, 41 H - 5AH
- 00 0001 + 10 0111执行后:(DH)=0E7HCF=1, OF=0, SF=1, ZF=0 SBB指令示例――双字减法(双精度减法) 设目的操作数存放在DX和AX中, AX存放低字, DX存放高字 源操作数存放在BX和CX中, CX存放低字, BX存放高字 指令:SUB AX, CX SBB DX, BX 7456H AX - 9428H CX 1 E11EH AX CF=1 ;低16位减 ;高16位减 0012H DX 0010H BX 1H CF 0001H DX- SBB指令示例――双字减法(双精度减法)?设x、y、z均为双精度数,分别存放在地址为X,X+2; Y,Y+2; Z,Z+2的存储单元,存放时高位字在高地址,低位 字在低地址。用指令实现w=x+y+24-z,并用W,W+2单元 存放结果。MOV AX, X ; MOV DX, X+2 ; x+y ADD AX, Y ; ADC DX, Y+2 ; ADD AX, 24 ; +24 ADC DX, 00 ; SUB AX, Z ; -z SBB DX, Z+2; MOV W, AX ; 结果存入 MOV W+2, DX ; W,W+2 NEG指令示例?NEG DX ; 设(DX)=6780H, 借位 H 1 9880H操作数≠0,CF=1 操作数=0,CF=0执行后: (DX)=9880H CF=1利用求补指令, 可得到负数的绝对值?NEG AL ;设(AL)=FFH(-1的补码),则指令执行后(AL)=01。?NEG AL; AL求补ADD AL, 100 ; (AL)+100--&AL 功能: 100-(AL) 比较指令CMPCMP dest , dest - scr常用于比较两个数(DATA1和DATA2)的大小DATA1-DATA2 CMP本指令常与条件转移指令联合 使用,完成相应的程序转移ZF=1?N CF=1? Y N DATA1&DATA2Y DATA1=DATA2DATA1&DATA2 【例 2-17】 试分析如下指令执行结果及标志位的状态MOV BX,0 ; (BX)=0,不影响标志位 DEC BX ; (BX)=0FFFFH,CF不影响、PF=1、AF=1、ZF=0、SF=1、OF=0 INC BX ; (BX)=0,CF不影响、PF=1、AF=1、ZF=1、SF=0、OF=0 SUB BX,1 ; (BX)=0FFFFH,CF=1、PF=1、AF=1、ZF=0、SF=1、OF=0 NEG BX ; (BX)=1,CF=1、PF=0、AF=1、ZF=0、SF=0、OF=0 3. 乘法指令(1) 无符号数乘法 MUL被乘数×乘数=乘积(2) 带符号数乘法?IMUL?字节乘法 AX ←(AL)×(src)字乘法 DX:AX ←(AX)×(src)? ? ?src为寄存器或存储器操作数(乘数) 目的操作数隐含使用,必须是累加器:AL或AX(被乘数),执行 乘法指令前预先赋值 乘积存放在隐含寄存器AX或DX:AX MUL CL;MUL BX; MUL BYTE PTR [BX+6];AL×CL→AXAX×BX →DX:AXAL×存储器(8位)→ AXMUL WORD PTR [BP+SI]; AX×存储器(16位)→ DX:AX注意: * AL (AX) 为隐含的被乘数。 AX (DX,AX) 为隐含的乘积。 * src若为存储器操作数时,注意用ptr明确类型。 * src不能为立即数和段寄存器。 ?乘法指令影响CF、OF,对SF、ZF、AF、PF无定义 无定义:标志位的状态不确定 区别 不影响:标志位保持原态不变MUL指令 乘积的高一半为0(AH=0或DX=0) 否则 CF=1,OF=1 IMUL指令 乘积的高一半为低一半的符号扩展 否则 CF=1,OF=1CF=0, OF=0CF=0, OF=0 MUL, IMUL指令示例[例 2-19] 已知(AL)=0FFH,(BL)=2,MUL BL IMUL BL ;乘积(AX)= 01FEH, (255×2 = 510), CF=OF=1 ;乘积(AX)= 0FFFEH, (-1×2 = -2), CF=OF=0 4. 除法指令(1) 无符号数除法 (2) 带符号数除法?被除数÷除数=商…余数 DIV IDIV?16位/8位 (AX)/(src) 商→AL, 余数→AH字节除法:字除法:32位/16位(DX:AX)/ (src)商→AX , 余数→DX? ? ?src为寄存器或存储器操作数(除数) 目的操作数隐含使用,必须存放在AX或DX:AX(被除数) 商存放在AL或AX;余数存放在AH或DX,符号与被除数相同 ?若为存储器操作数时,注意用ptr明确类型 IDIV BYTE PTR [DI] ; AX除以8 位存储器操作数 除法指令对所有状态标志位无定义 被除数的字长是除数(指令中的操作数)的2倍 IDIV指令前可用CBW、CWD转换;? ?无符号数除DIV一般用MOV给高8位或高16位 DIV指令示例被除数÷除数=商…余数MOV MOV MOV DIV MOV MOVAX, 0000H DX, 0001H BX, 100H BX N1, AX N2, DX;装入被除数 H ;装入除数 ;(DX:AX)/(BX)=1H ;存商 ;存余数 IDIV指令示例? ?被除数的字长是除数(指令中的操作数)的2倍带符号数81H/19H 除数19H是8位,被除数不是16位, 在执行除法指令前,应对被除数进行扩展,如何扩展 ? MOV AL, 81H CBW ;被除数装入AL, 81H=-127 ;字节扩充到字MOV BL, 19HIDIV BL MOV RESULT, AL;除数装入BL, 19H=25; AX/BL=AL…AH ;商存入RESULT单元 [例 2-20] 已知(AX)=0410H,(BL)= 0B8H。DIV BL IDIV BL;商AL=05H ,余数AH=78H余数的符号与被 除数相同;商AL=F2H(即-14),余数AH=20H(即32) ;有符号数0410H真值为1040,B8H 真值为-72。注意DIV和IDIV的区别。 算术运算指令综合例【例 2-21】X、Y、Z、V、W均为16位有符号数,计算W←(V-(X*Y+Z-1234))/X确定计算顺序如下:① X*Y → 暂存中间结果。② X*Y+Z → X*Y+Z-1234 → 暂存中间结果。③ V-(X*Y+Z-1234) → (V-(X*Y+Z-1234))/X → 保存最终结果。确定各次运算的数据类型:① X*Y 乘积为32位。② X*Y结果为32位,Z进行符号扩展成32位, X*Y+Z-1234 结果为32位。 ③ X*Y+Z-1234的结果是32位,V需扩展到32位,(V-(X*Y+Z-1234))结果为32位,X为16位,因此,(V-(X*Y+Z-1234))/X最终结果为16位。 MOV AX, X IMUL Y MOV CX, AX MOV BX, DX; X*Y ; X*Y(32位)暂存入BX:CX。DX:AX需用于Z的符号扩展MOV AX, Z ; Z置入AX进行符号扩展至DX:AX,扩展为32位 CWD ADD CX, AX ADC BX, DX ; X*Y+Z SUB CX, 1234 SBB BX, 0 ; X*Y+Z-1234 MOV AX, V ; V置入AX进行符号扩展至DX:AX,扩展为32位 CWD SUB AX, CX SBB DX, BX ; V-(X*Y+Z-1234)IDIV X ; (V-(X*Y+Z-1234))/X,商在AX中,余数在DX中。 MOV W, AX ; 保存最终结果 5. 十进制运算调整指令?为什么需要调整? BCD码的(A~FH)是无意义的 计算机内部按二进制进行运算的,计算十进制的BCD码会 出现问题 例:压缩十进数6和7相加 + 00 1101 + 11;调整调整指令应用于加、减、 乘、除指令之后?调整指令有两类: 1. 压缩BCD码调整指令 DAA DAS 2. 非压缩BCD码调整指令 AAA AAS AAM AAD 1) 压缩BCD码调整指令(1) 压缩BCD码加法调整指令 DAA ; 用在ADD、ADC之后,隐含AL 对AL中两个压缩BCD码相加的结果进行校正,调整为压 缩BCD码的格式?调整过程:如果AL的低4位为A ~ F或 (AF)=1 则 (AL)+06H--&AL 1--&AF如果AL的高4位为A ~ F或 (CF)=1 则 (AL)+60H--&AL 1--&CF?DAA指令对OF无定义,但影响其他状态标志位 DAA指令示例?不可以直接写 MOV AL, 25 !采用压缩BCD码,计算十进制数 25+38 (书P67 例3.28) MOV AL, 25H 1. 2个十进制数
表示成BCD码 MOV BL, 38H + . 相加
ADD AL, BL + 0110 ;调整 3. 调整 DAA 计算十进制数 68+28 MOV AL, 68H MOV BL, 28H ADD AL, BL DAA ∴ (AL)=, AF=1 + 01 0000 + 0110?; AF=1 ;调整 ∴ (AL)=, AF=1 ?计算十进制数 54+63MOV AL, 54H MOV BL, 63H ADD AL, BL DAA + 11 0111 +
;调整 (2) 压缩BCD码减法调整指令 DAS ; 用在SUB、SBB之后,隐含AL 将AL中的差调整为压缩BCD码的格式? 调整过程:如果AL的低4位为A ~ F或 (AF)=1 则 (AL) C 06H--&AL 1--&AF如果AL的高4位为A ~ F或 (CF)=1 则 (AL) C 60H--&AL 1--&CF?DAS指令对OF无定义,但影响其他状态标志位 DAS指令示例?计算十进制数 23-16MOV AL, 23H MOV BL, 16H SUB AL, BL DAS - 00 00 0111 ∴ (AL)=7, AF=1;调整 2) 非压缩BCD码调整指令(1) 非压缩BCD码加法调整指令 AAA ; 用在ADD、ADC之后,隐含AL、AX? 调整过程:如果AL的低4位为A ~ F或 (AF)=1 则 (AL)+06H--&AL, AL高4位清0 (AH)+01H--&AH 1--&AF, AF--&CF 否则AL高4位清0, 0--&AF, AF--&CF? AAA指影响CF、AF,其他状态标志位无定义 AAA指令示例?采用非压缩BCD码,计算十进制数 6+8MOV AL, 06H MOV BL, 08H ADD AL, BL AAA + 00 1110 +
;调整 ∴ (AL)=H, (AH)=01H, (AX)=0104H=14 CF=AF=1 (2) 非压缩BCD码减法调整指令 AAS ; 用在SUB、SBB之后,隐含AL、AX?调整过程:如果AL的低4位为A ~ F或 (AF)=1 则 (AL) C 06H--&AL, AL高4位清0 (AH) C 01H--&AH 1--&AF, AF--&CF 否则 AL高4位清0,0--&AF, (AF)--&CF? AAS指影响CF、AF,其他状态标志位无定义 AAS指令示例?采用非压缩BCD码,计算十进制数16-7 MOV AX, 0106H MOV BL, 7H SUB AL, BL AAS 06H - 07H FFH ; - 06 H ;调整 F9H结果: (AL)=09H, (AH)=00H, CF=AF=1 (3) AAM 非压缩BCD码乘调整指令格式:AAM 操作:将AX中的两个非压缩BCD码之积进行调整 调整过程: 将AL除以10, 商送AH, 余数送AL AAM指令示例 MOV AL, 07H MOV CL, 09H MUL CL AAM ;取被乘数 ;取乘数 ;调整调整后,(AH)=6(AL)=30111 * 00 111111 (4) AAD 非压缩BCD码除调整指令格式:AAD 操作:在除法运算前,用该指令将AX中的非压缩BCD码形 式的被除数调整为二进制数,然后做除法运算 调整过程: (AL)+(AH)*10--&AL 0--&AH (AX)/除数,商--&AL,余数--&AHAAD指令示例 MOV AX, 0208H ;AX&--被除数 MOV CL, 4 ;除数 AAD ;调整,(AX)=28 DIV CL 结果:(AL)=7 (AH)=0 2.7.3 逻辑运算和移位类指令?逻辑运算指令 AND、OR、NOT、XOR、TEST?移位指令 SHL、SHR 、 SAL 、SAR?循环移位指令 ROL、ROR、RCL、RCRS― 移位H― 逻辑O― 不带CF循环L―左移R― 循环移位 A―算术C― 带CF循环R―右移 逻辑非指令:NOT OPR 执行操作: (OPR) ? (OPR) 逻辑与指令:AND DST, SRC 执行操作: (DST) ? (DST) ? (SRC) 逻辑或指令:OR DST, SRC 执行操作: (DST) ? (DST) ? (SRC) 异或指令: 执行操作: XOR DST, SRC (DST) ? (DST) ? (SRC)* *不能是立即数 不影响标志位CF OF SF ZF PF AF 0 0 * * * 无定义 根据运算结果设置测试指令: TEST OPR1, OPR2 执行操作: (OPR1) ? (OPR2) 1. 逻辑运算指令?二进制数的逻辑运算操作数可以是字节或字。 ? 对操作数按位进行操作,并对相应标志位产生影响。 ? 主要用于对寄存器或存储器单元中的某些位进行置位、复 位、测试操作。? (1) 逻辑“非”指令(取反) NOT dest ←(dest)dest按位取反,送回原处?操作数可以位于寄存器或存储器中,不允许使用立即数?不影响标志位 NOT AH ;NOT CX ; NOT BYTE PTR [BP] ;8位寄存器取反16位寄存器取反 8位存储器取反NOT WORD PTR [BX][DI] ; 16位存储器取反例:(AL)= 55H,执行 NOT AL 后,(AL)=?(AL) = AAH (2) AND dest ,dest ←(dest)∧(src)(3) OR dest , dest ←(dest)∨(src)屏蔽某些位 测试某些位 某些位置1 某些位求反 寄存器清0 检测2个数据是否相等 测试某些位是否为0两个操作数不能同时为存 储器操作数,至少有一个 位于寄存器(4) XOR dest ,dest ←(dest) (5) TEST dest , (dest)∧(src)?源操作数:立即数、寄存器或存储器目的操作数:寄存器或存储器?CF=0, OF=0, AF无定义, SF、ZF、PF根据运算结果设置≯(src) (2) 逻辑“与”指令 AND dest , dest ←(dest)∧(src)? 屏蔽无用位(置0 ),保留有用位 (保持不变) AND指令的源操作数设置为立即数,并将需要屏蔽的位和“ 0 ‖ 进行逻辑“与”,而要保留的位和“1 ‖进行逻辑“与”。例:屏蔽AL寄存器的高4位, AL保留低4位 AND AL,0FH∧××××××××0 0 0 0 1 1 1 10 0 0 0 × ××× 被屏蔽 保留【例 2-23】将AX中的最高位和最低位保留,其余位清零 例:将数字0~9的ASCII码转换成相应的非压缩BCD码 MOV AL, ?9‘ ; (AL)= (AL)= (AL)= (AL)= AND AL,0FH ; MOV AL, ?b‘ ;例:将ASCII码中的小写英文字母转换成相应的大写字母AND AL, B ;?测试任意位,是否为0 测试符号位:结果= 0,符号位为0(+) 结果≠0,符号位为1 (-)例:AND AX,8000H (3) 逻辑“或”指令 OR dest , dest ←(dest)∨(src)? dest的某些位置1,而其余位保持不变 将源操作数设置为立即数,并将需要置1的位需要置位的位 可以和“1‖进行逻辑“或”,而保持不变的位可以和“0‖进行 逻辑“或”。 例:使AL的第3位置1, 其余位不变AL ∨ ×××××××× 0 0 0 0 0 1 0 0 第3位置1OR AL,04H××××× 1 ××其余位不变 【例 2-24】 将BX中的低4 位置位,而其余位不变,可以使 用下面的指令: OR BX, 000FH例:将数字0~9的非压缩BCD码转换成相应的ASCII码 MOV AL, 02H ;(AL)= 数字2非压缩BCD码 OR AL,30H ; (AL)= ?2‘ 的ASCII码 AND和OR指令:? ?AND AX, AX OR AX, AX寄存器中的内容不会改变,但将影响SF、ZF、PF,并使 CF、OF清零 在数据传送指令后,使数据影响标志位,然后判断数据的正 负、是否为0以及数据的奇偶性 SUB/CMP MOV AX, DATA AND AX, AX JZ NEXT … NEXT: …MOV指令不影响标志位,如果没有AND AX, AX,则不能 紧跟条件转移指令 (4) 逻辑“异或”指令XOR dest , dest ←(dest) (src) ? 两个数相同,异或结果为0;不同,异或结果为1 任何数与1异或,求反;与0异或,保持不变 ? 对操作数的某些位“求反”,而其他位保持不变 将源操作数设置为立即数;将需要求反的位与“1 ”进行逻辑 “异或”;要保持不变的位和“0 ”进行逻辑“异或”。例:使AL寄存器中的奇数位求反,偶数位保持不变 MOV AL, 0FH ; XOR AL, 55H; 【例 2-25】 XOR BH, B区别于NOT指令≯ ? 寄存器清零例:XOR AX,AX ;AX清零 ,同时CF=0?以上逻辑运算指令使CF、OF清零,并影响其他标志位 使用其他指令也能实现寄存器内容的清零,例如: MOV AX, 0 ;AX清零 SUB AX, AX AND AX, 0? 检查操作数是否相等、地址是否匹配 例: XOR AX, 042EH JZ MATCH … MATCH: … (5) 测试指令TEST dest ,(dest)∧(scr) 不回存结果,只影响标志?与 CMP类似, 不过TEST指令只比较某 些特定的位,而CMP指 令比较整个操作数测试操作数的某些位是否为0,后跟条件转移指令将需要测试的位与1“与”例:检测AL中的最低位是0还是1,若为0则转移 TEST AL, 01H JZ NEXT …… NEXT:…… 若要检测BX中的内容是否为0,若为0则转移 TEST BX, 0FFFFH JZ NEXT …… NEXT:…… 例:设(AL)= 37H,执行TEST AL , 0FH后,指令执行后 (AL)=? , 及各标志如何? ?执行后: (AL)= 37H CF=OF=0AL∧0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 10 0 0 0 0 1 1 1SF=0奇数个1:PF=0结果≠0:ZF=0 2. 移位指令SHL (shift logical left) SHR (shift logical right) SAL (shift arithmetic left) SAR (shift arithmetic right) 格式:SHL dest , m =1>1, m→CL逻辑左移 逻辑右移 算术左移 算术右移 m:移位次数? 操作数可以位于寄存器或存储器中 ? 操作数可以是字节或字数据 ? 影响CF、SF、ZF、 PF , AF无定义 移位后 OF:移1位,OF有效 移多位,OF无定义最高有效位的值变化,OF=1 最高有效位的值不变,OF=0 (1) 逻辑/算术左移指令 SHL/SAL SHL dest , m =1 >1, m→CL dest 0例:MOV AL ,08H ; (AL)=08H=8 SHL AL , 1 ; (AL)=10H=16 例:MOV CL, 3 ; 移位次数 MOV AL, 9140H ; (AL)=00 0000B SHL AL, CL ; (AL)=00 0000B? ?m:移位次数SAL dest , m?示意图CF左移一位,相当于该数×2逻辑左移1位,无符号数×2 算术左移1位,有符号数×2移位指令要比乘法指令速度快得多 [例2-26] 将一个16位无符号数乘以10,该数原来存在以 偏移地址为2000H的两个连续单元中。数×10=数×8 + 数×2,可用逻辑左移指令实现 MOV AX, [2000H] SHL AX, 1 MOV BX, AX MOV CL, 2 SHL AX, CL ADD AX, BX (2) 逻辑右移指令 SHR dest , m 示意图 dest 0 CF例:MOV AL ,10H ;(AL)=SHR AL , 1??; (AL)=逻辑右移一位,相当于该无符号数÷ 2移位指令要比除法指令速度快得多 【例 2-27】 将AX中的16位无符号数除以512。因为29 = 512,所以只要将AX逻辑右移9 位即可 指令序列如下: MOV CL,9 ;CL←移位次数SHR AX,CL ;AX逻辑右移9位 (3) 算术右移指令 SAR dest , m示意图 符号位保持不变 destCF例:MOV AL ,0FCH ;(AL)=B,补码表示的-4 SAR AL , 1?; (AL)=B算术右移一位,相当于该有符号数÷2 已知(AL)=0B4H, (CF)=1, 分析下列指令执行后的结果 CF AL 执行前1 (1) SHL AL, 1 (2) SHR AL, 1 (3) SAL AL, 1 (4) SAR AL, 1 算术左移与逻辑左移的结果相同 算术右移与逻辑右移的结果不同 1 1 10 00 逻辑左移一位相当于无符号数乘以2 逻辑右移一位相当于无符号数除以2 算术左移一位相当于有符号数乘以2 算术右移一位相当于有符号数除以2例:(BX) = 84F0H (1) (BX) 为无符号数,求 (BX) / 2 SHR BX, 1 SAL BX, 1 MOV CL, 2 ; (BX) = 4278H ; (BX) = 09E0H, OF=1 (2) (BX) 为带符号数,求 (BX) ×2 (3) (BX) 为带符号数,求 (BX) / 4SAR BX, CL; (BX) = 0E13CH 例:拆字 设(AL)=12H, 要求拆成 (AL)=01H, (BL)=02H MOV BL, AL AND BL, 0FH ; 屏蔽高4位,保留低4位 MOV CL, 4 SHR AL, CL 例:拼字 设(AX)=0012H, (BX)=0034H, 要求装配成(AX)=1234H MOV CL, 8 SHL AX, CL ; 或者 ROL AX, CL也可以 (AX)=1200H ADD AX, BX ; 或者OR AX, BX 3. 循环移位指令ROL (rotate left) ROR (rotate right) 循环左移 循环右移 带进位循环左移 带进位循环右移 m:移位次数RCL (rotate left through carry) RCR (rotate right through carry) 格式:ROL dest , m =1>1, m→CL? 操作数可以位于寄存器或存储器中 ? 操作数可以是字节或字数据 ? 不影响SF、ZF、 PF、AF 影响CF、OF:移1位,OF有效 移多位,OF无定义移位后最高有效位的值变化, OF=1 最高有效位的值不变, OF=0 (1)循环左移ROL dest , m CF dest(2)循环右移ROR dest , mdest CF (3)带进位循环左移RCL dest , m CF dest(4)带进位循环右移RCR dest , m dest CF 与移位指令的区别? 循环移位指令可以改变操作数中所有位的位置,而原来各位 数据不会丢失,只是改变位置 ? 循环移位指令可以对寄存器或存储器中的任一位进行位测试 例:要求测试AL寄存器中第5位是“0‖还是“1‖MOV CL, 4 ROL AL, CL JNC ZERO … ZERO: …还可以利用 TEST指令;若CF≠0,第5位是1,则转移到ZERO 【例2-28】32位数DX:AX向左移1位 SHL AX, 1 RCL DX, 1DXCFAX 0 思考题?1. AX寄存器(1)低4位清零(2)低4位置1(3)低4位取反 (4)清零(5)测试最低2位是否为0? ?2. 利用移位指令计算DX=3×AX+7×BX 3. 将存储在ASC单元中ASCII码转换为压缩BCD码96H ASC ?9? ?6?96H 2. 利用移位指令计算DX=3×AX+7×BX 思路:DX=(2×AX+AX)+(8×BX-BX) MOV DX, AX SHL DX, 1 ADD DX, AX MOV AX, BX MOV CL, 3 SHL AX, CL SUB AX, BX ADD DX, AX 3. 将存储在ASC单元中ASCII码转换为压缩BCD码96H 如: ASC ?9‘ ?6‘ BCD 96H ; AL&--39H (?9?) ;左移4位 39H-&90H ;BL&--90H ;AL&--36H (?6?) ;AL&--06H ;BL&--96HMOV MOV SHL MOV MOV AND OR MOVAL, ASC CL, 4 AL, CL BL, AL AL, ASC+1 AL, 0FH BL, AL BCD, BL 4. 分析下列指令序列的功能 MOV SHL MOV SHL SHR OR CL, 4 DX,CL BL, AH AX, CL BL, CL DL, BL――书P87 2-18、2-17DX 4AX4 BL4结论: DX.AX双字左移4位 ? 移位指令 逻辑左移 SHL OPR, CNTCF 0逻辑右移 SHR OPR, CNT0 CF算术左移 SAL OPR, CNT(同逻辑左移) 算术右移 SAR OPR, CNTCF 循环左移 ROL OPR, CNTCF循环右移 ROR OPR, CNTCF带进位循环左移 RCL OPR, CNTCF带进位循环右移 RCR OPR, CNTCF 2.7.3 控制转移类指令? ?8086指令的执行由CS:IP决定若需要改变程序的执行流程,就必须改变CS和IP的内容控制转移指令包括以下5组: ? 无条件转移指令 JMP ? 条件转移指令 JC JZ JS JO JP JA JB JG JL JCXZ ? 循环指令 LOOP LOOPZ LOOPNZ ? 子程序调用(返回)指令 CALL RET ? 中断指令 INT INTO IRET 1. 无条件转移指令JMP OPR? ? ?;程序转向OPR指定的地址操作数OPR是要转移到的目标地址 只要执行JMP指令,就使程序转到指定的目标地址处,从目 标地址处开始执行那里的指令 JMP指令分成4种类型: ⑴ 段内转移、直接寻址 ⑵ 段内转移、间接寻址 ⑶ 段间转移、直接寻址 ⑷ 段间转移、间接寻址 段内直接转移由汇编程序 自动计算出IP ←(IP) + disp JMP NEXT ××××× ;JMP指令的下一条指令 …………例:dispNEXT: MOV AL , 00H 1. 无条件转移指令(1) 段内直接短转移JMP SHORT LABEL ;?不能省略 目标程序的标号 该标号在本段内IP ←(IP) + dispJMP指令的下一条指令到目标 地址之间的8位相对偏移量范围: -128B~+127B(2) 段内直接近转移 JMP NEAR PTR LABEL ;运算符,可省略 目标程序的标号 该标号在本段内IP ←(IP) + dispJMP指令的下一条指令 到目标地址之间的16位相对偏移 量范围:-3B (3) 段内间接近转移 JMP WORD PTR OPR;?IP ←(EA)转向的有效地址存放于寄存器或存储器, 16位 例:JMP BX JMP WORD PTR DAT[BX]?特点:只改变IP值,CS值不变 (4) 段间直接远转移JMP FAR PTR LABEL?指明后面为远标号 ?该标号在另一个代码段中; IP ←远标号的偏移地址 ;CS ←远标号的段基址(5) 段间间接远转移 JMP DWORD PTR OPR ; IP ←(EA) CS←(EA) +2?转向的有效地址存放于存储器,32位JMP DWORD PTR [1234H]?特点: IP值、CS值均发生变化 【例3.37】JMP AV1 ××××× ;JMP指令的下一条指令 ………… AV1: MOV AL , 00H设(CS)=1500H, (IP)=0200H,标号AV1对于IP指针的位移量为0035H,指 令执行后,后续程序的目标地址是什么?IP ←(IP) + disp目标地址与 JMP指令的下一条指令之 间的差值15000H… 1H 1H OP 35 00 ×× …代码段起始地址本条JMP指令JMP指令下一条指令的地址disp=0035H后续程序的目标地址15238H 【例3.38】JMP FAR PTR AV2书P71设(CS)=1500H, (IP)=0200H,目标地址在另一个代码段,段基址 为3000H,偏移地址为0120H,问指令执行后,后续程序的目标 地址是什么?1H 1H 1H 1H 代码段起始地址 … OP 20 01 00 30 ×× …本条JMP指令JMP指令下一条指令的地址后续程序的目标地址30120H 2. 条件转移指令每一种条件转移指令都有它的测试条件,满足测试条件 则转移,否则顺序执行? ? ?格式:JCC标号一定是短转移的标号 ( IP ←IP+位移量为

我要回帖

更多关于 汇编语言子程序调用 的文章

 

随机推荐