二进制课程高级汇编语言讲解_第1页
二进制课程高级汇编语言讲解_第2页
二进制课程高级汇编语言讲解_第3页
二进制课程高级汇编语言讲解_第4页
二进制课程高级汇编语言讲解_第5页
已阅读5页,还剩110页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高级汇编语言讲解GAOJIHUIBIANYUYANJIANGJIE河南赛客信息技术有限公司

目录0102汇编语言概述数据的表示及类型030405汇编程序开发调试方法寄存器讲解寻址方式讲解06指令系统讲解07子程序设计第一章汇编语言概述第一章汇编语言概述

机器指令是指CPU能直接识别并遵照执行的指令。机器指令一般有操作码和操作数两部分构成,操作码在前,操作数在后。操作码指出要进行的操作和运算,操作数指出参与操作或运算的对象。01:汇编语言的概念

机器语言是用二进制编码的机器指令的集合及一组使用机器指令的规则。它是CPU能直接识别的唯一语言。只有用机器语言描述的程序,CPU才能直接执行。目标程序是指用机器语言描述的程序。第一章汇编语言概述01:汇编语言的概念示例:

将偏移2200H存储单元中的数与偏移2201H存储单元中的数相加,将它们的和送入偏移2202H存储单元。完成这一操作的程序片段包含的三条机器指令为:缺点:

机器语言不能用人们熟悉的形式来描述计算机要执行的任务。编程复杂,调试困难。Intel808601:汇编语言的概念

汇编指令是用指令助记符、地址符号等符号表示的指令。第一章汇编语言概述01:汇编语言的概念

汇编语言是汇编指令、伪指令的集合及其表示、使用这些指令的一组规则。用汇编语言书写的程序成为汇编语言源程序。优点:

使用汇编语言编写的程序比用机器语言编写的程序容易理解、调试和维护。第一章汇编语言概述汇编是指把汇编语言源程序翻译成目标程序的过程。完成汇编任务的程序叫做汇编程序。

01:汇编语言的概念第一章汇编语言概述更底层:汇编语言源程序与高级语言源程序相比,其通用性和可移植性要差得多。由于汇编指令与机器有着密切的关系,所以可以通过汇编语言直接有效地控制机器。汇编指令是机器指令的符号表示,所以汇编指令与机器有着密切的关系,与机器所带的CPU关系密切。不同种类的CPU对应不同的汇编语言。02:汇编语言的特点第一章汇编语言概述效率高:过程汇编语言主体的汇编指令是机器指令的符号表示,每一条汇编指令都有相对应的机器指令,编译之后产生的冗余指令少。汇编语言程序能直接并充分利用机器硬件系统的许多特性。运行速度快目标程序短02:汇编语言的特点第一章汇编语言概述编程繁琐:太过注重高效率而导致程序结构较差。每条汇编指令所能完成的操作极为有限。程序员使用汇编指令编写程序时,必须考虑包括寄存器、存储单元和寻址方式在内的几乎所有细节问题。02:汇编语言的特点汇编语言是面向机器的语言,高级语言是面向过程或面向目标、对象的语言。第一章汇编语言概述与CPU类型密切相关02:汇编语言的特点通用性和可移植性差直接有效地实现控制运行速度快目标程序短面向对象不同指令功能有限需注意的细节太多第一章汇编语言概述03:汇编语言的使用时机优点缺点1、“时空”两个方面最有效率的程序;2、可以最直接和最有效的操纵机器硬件系统。1、编程繁琐;2、调试困难;3、可移植性差第一章汇编语言概述综合考虑优缺点,合适的使用时机有:对软件的执行时间或存储容量有较高要求的场合。例如系统程序的关键核心;03:汇编语言的使用时机需要提高大型软件性能的场合,通常把大型软件中执行频率高的子程序用汇编语言编写;软件与硬件关系密切,软件要有直接和有效控制硬件的场合。第一章汇编语言概述综合考虑优缺点,合适的使用时机有:对软件的执行时间或存储容量有较高要求的场合。例如系统程序的关键核心;03:汇编语言的使用时机需要提高大型软件性能的场合,通常把大型软件中执行频率高的子程序用汇编语言编写;软件与硬件关系密切,软件要有直接和有效控制硬件的场合。第一章汇编语言概述比如ShellCode,空间要求高面对的代码内容是汇编指令04:汇编语言二进制逆向中的作用第一章汇编语言概述开发攻击代码调试分析程序第二章数据的表示及类型01:数据的表示

CPU是计算机的核心部件,控制整个计算机的运作,CPU正常工作必须提供指令和数据。指令和数据在存储器中存放,CPU运行需要读取内存中的数据,磁盘中的数据需要首先读入内存再被CPU使用。第二章数据的表示及类型01:数据的表示指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别,都会二进制信息。计算机系统内部采用二进制表示数值数据,也采用二进制编码表示非数值数据和指令。这也是很多漏洞产生的根本原因。第二章数据的表示及类型示例:

内存中的二进制信息1000100111011000,计算机可以把它看作大小为89D8H的数据来处理,也可以将其看作指令movax,bx来执行。01:数据的表示

x进制与十进制转换的方式是从高位到低位,依次将每一位上的数乘以相应进制的幂次所得的结果。第二章数据的表示及类型示例:

十进制数123的二进制、十六进制换算方法。02:数据的类型计算机中存储信息的最小单位称为bit(比特),也就是一个二进制位,它有两种状态分别代表0和1。第二章数据的表示及类型

8个bit组成一个Byte,通常称之为一个字节。微型机存储器的存储单元可以存储一个Byte,也就是8个二进制位,存储器的容量是以字节为最小单位来计算的。各单位之间的换算关系如下:1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB1PB=1024TB……02:数据的类型计算机中存储信息的最小单位称为bit(比特),也就是一个二进制位,它有两种状态分别代表0和1。第二章数据的表示及类型

8个bit组成一个Byte,通常称之为一个字节。微型机存储器的存储单元可以存储一个Byte,也就是8个二进制位,存储器的容量是以字节为最小单位来计算的。各单位之间的换算关系如下:1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB1PB=1024TB……02:数据的类型计算机存取的以二进制位表示的信息位数一般是8的倍数,它们有专门的名称。第二章数据的表示及类型字节:

一个字节由8个二进制位组成,最低位称为第0位,最高位称为第7位。一个字节可分为2个4位的位组,称为半字节。02:数据的类型第二章数据的表示及类型字:2个字节(即16个二进制位)组成一个字,最低位称为第0位,最高位称为第15位。字的低8位称为低字节,高8位称为高字节。02:数据的类型第二章数据的表示及类型双字:2个字(即32个二进制位)组成一个双字,最低位称为第0位,最高位称为第31位。双字的低16位称为低字,高16位称为高字。第三章汇编程序开发调试方法环境准备:编译器masm链接器link调试器debug文本编辑器第三章汇编程序开发调试方法汇编代码写出到执行的过程:汇编语言编写的源文件从写出到执行主要包括三步:对源程序进行编译链接执行可执行文件中的程序。编写汇编源程序第三章汇编程序开发调试方法01:汇编代码的开发示例:

给出一段简单的汇编语言程序,利用寄存器完成简单的加法操作后返回。第三章汇编程序开发调试方法02:汇编代码的编译命令:masm或者masm1;第三章汇编程序开发调试方法03:汇编代码的链接命令:link或者link1;第三章汇编程序开发调试方法04:汇编代码的调试命令:debug1.exe第三章汇编程序开发调试方法04:汇编代码的调试命令:debug1.exe第三章汇编程序开发调试方法-d,查看内存中的内容-e,改写内存中的内容-r,查看、改变寄存器内容-u,将内存中的机器指令翻译成汇编指令-t,执行一条机器指令-p,执行int指令05:汇编程序从写出到执行的全过程

前几步完成了一个汇编程序从写出到执行的全部过程,总共经历了如下阶段:第三章汇编程序开发调试方法第四章寄存器讲解01:寄存器的分类

不同的CPU,寄存器的个数、结构是不相同的。8086CPU有14个寄存器,大致可以分为三类:第四章寄存器讲解控制寄存器段寄存器通用寄存器

其中通用寄存器又可以分为数据寄存器、指针寄存器和变址寄存器。01:寄存器的分类第四章寄存器讲解02:通用寄存器

数据寄存器、指针寄存器和变址寄存器统称为通用寄存器。这些寄存器除了各自规定的专门用途外,均可用于传送和暂存数据,可以保存算术逻辑运算中的操作数据和运算结果。第四章寄存器讲解寄存器用途CX计数器SI串操作中的源指针DI串操作中的目的指针BP存取堆栈的指针SP堆栈指针03:段寄存器8086CPU依赖其内部的四个段寄存器实现寻址1M字节物理地址空间。8086把1M字节地址空间划分为若干逻辑段,当前使用段的段值存放在段寄存器中。由段寄存器和段内偏移形成20位地址。第四章寄存器讲解计算方法:物理地址=段值×16+偏移表示方法:段值:偏移03:段寄存器第四章寄存器讲解示例:用16进制表示的逻辑地址1234:3456H所对应的存储单元的物理地址为15796H。03:段寄存器第四章寄存器讲解

8086CPU有四个段寄存器,可保存4个段值,所以可同时使用四个段,但这四个段有所分工。04:标志寄存器第四章寄存器讲解

8086CPU中有一个16位的标志寄存器,包含了9个标志,主要用于反映处理器的状态和运算结果的某些特征。

9个标志寄存器可以分为两组,第一组6个标志寄存器主要受加减运算和逻辑运算结果的影响,称为运算结果标志,第二组标志不受运算结果的影响,称为状态控制标志。标志类别寄存器运算结果标志OF、SF、ZF、AF、PF、CF状态控制标志DF、IF、TF04:标志寄存器第四章寄存器讲解第五章寻址方式讲解01:寻址方式的分类

表示指令中操作数所在的方法称为寻址方式。8086共有七种寻址方式:第五章寻址方式讲解立即寻址寄存器寻址

直接寻址寄存器间接寻址寄存器相对寻址基址加变址寻址相对基址加变址寻址02:立即寻址方式

立即寻址方式是指操作数就包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段。这种操作数称为立即数。第五章寻址方式讲解

立即数可以是8位也可以是16位。如果是16位,那么按照“高高低低”原则存放,即高位字节在高地址存储单元,低位字节在低地址存储单元。

立即寻址方式主要用于给寄存器或存储单元赋初值的场合。02:立即寻址方式第五章寻址方式讲解示例:指令“MOVAX,1234H”源操作数采用立即寻址方式,其存储和执行情况如下所示:大端模式和小端模式小端模式:第五章寻址方式讲解

低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。大端模式:

高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。大端模式和小端模式小端模式:第五章寻址方式讲解低地址----------------->高地址大端模式:示例:数字0x12345678在内存中的表示形式。0x78|0x56|0x34|0x12低地址----------------->高地址0x12|0x34|0x56|0x78大端模式和小端模式小端模式:第五章寻址方式讲解大端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。典型的使用小端存储的CPU有Intelx86和ARM。符号位的判定固定为第一个字节,容易判断正负。典型的使用大端存储的CPU有PowerPC和MIPSUNIX。03:寄存器寻址方式寄存器寻址方式是指操作数在CPU内部的寄存器中,指令中指定寄存器号。如立即寻址方式示例中指令“MOVAX,1234H”目的操作数采用寄存器寻址。第五章寻址方式讲解

寄存器寻址中16位操作数的寄存器可以有AX、BX、CX、DX、SI、DI、SP和BP等;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。

由于操作数在寄存器中,不需要通过访问存储器来取得操作数,所以采用这种寻址方式的指令执行速度较快。04:直接寻址方式直接寻址方式是指操作数在存储器中,指令直接包含有操作数的有效地址。第五章寻址方式讲解操作数一般存放在数据段,所以操作数的地址由DS加上指令中直接给出的16位偏移得到。

直接寻址方式用于处理单个存储器变量的情况。它可以实现在64K字节的段内寻找操作数。直接寻址的操作数通常是程序使用的变量。第五章寻址方式讲解示例:指令“MOVAX,[1234H]”(DS为5000H)源操作数采用直接寻址方式,其存储和执行情况如下所示:04:直接寻址方式05:寄存器间接寻址方式寄存器间接寻址方式是指操作数据在存储器中,操作数有效地址在SI、DI、BX、BP这四个寄存器之一中。第五章寻址方式讲解如果有效地址在SI、DI和BX中,则以DS段寄存器的内容为段值;如果有效地址在BP中,则以SS段寄存器的内容为段值。

注意与寄存器寻址方式的区别,例如指令“MOV[SI],AX”和“MOVSI,AX”的区别。第五章寻址方式讲解示例:指令“MOVAX,[SI]”(DS为5000H,SI为1234H)源操作数采用寄存器间接寻址方式,其存储和执行情况如下所示:05:寄存器间接寻址方式06:寄存器相对寻址方式寄存器相对寻址方式是指操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)内容加上指令中给定的8位或16位位移量之和。第五章寻址方式讲解第五章寻址方式讲解示例:指令“MOVAX,[DIH]”(DS为5000H,DI为3678H)源操作数采用寄存器相对寻址方式,其存储和执行情况如下所示:06:寄存器相对寻址方式07:基址加变址寻址方式基址加变址寻址方式是指操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容相加得到。第五章寻址方式讲解第五章寻址方式讲解示例:指令“MOVAX,[BX+DI]”(DS为5000H,BX为1223H,DI为54H)源操作数采用基址加变址寻址方式,其存储和执行情况如下所示:07:基址加变址寻址方式08:相对基址加变址寻址方式相对基址加变址寻址方式是指操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容及指令中给定的8位或者16位位移量相加得到。第五章寻址方式讲解第五章寻址方式讲解示例:指令“MOVAX,[BX+DI-2]”(DS为5000H,BX为1223H,DI为54H)源操作数采用相对基址加变址寻址方式,其存储和执行情况如下所示:08:相对基址加变址寻址方式第六章指令系统讲解01:指令系统的分类8086的指令系统可分为六个功能组:第六章指令系统讲解数据传递算术运算

逻辑运算串操作程序控制处理器控制02:数据传递指令格式:MOVDST,SRC第六章指令系统讲解使用情形:(1)CPU内部寄存器之间的数据传递;(2)立即数送至通用寄存器或者存储单元;(3)寄存器与存储器之间的数据传递。02:数据传递指令格式:XCHGOPRD1,OPRD2第六章指令系统讲解此指令把操作数OPRD1与OPRD2的内容交换,操作数同时是字节或字。例如XCHGAL,AH。格式:LEAREG,OPRD此指令把操作数OPRD的有效地址传递到操作数REG。操作数OPRD必须是一个存储器操作数,操作数REG必须是一个16位的通用寄存器。例如LEASI,[BX+3]。03:栈操作指令第六章指令系统讲解栈是一段RAM区域。称为栈底的一端地址较大,称为栈顶的一端地址较小。栈的段值在栈段寄存器SS中,栈指针寄存器SP始终指向栈顶。栈操作始终遵循“后进先出”的原则。所有数据的存入和取出都在栈顶进行。栈主要用途:

现场和返回地址的保护寄存器内容的保护传递参数存储局部变量格式:PUSHSRC第六章指令系统讲解此指令把源操作数SRC压入堆栈。它先把堆栈指针寄存器SP的值减2,然后把源操作数SRC送入由SP所指的栈顶。例如指令“PUSHAX”(AX为8A9BH)。03:栈操作指令格式:POPDST第六章指令系统讲解03:栈操作指令此指令从栈顶弹出一个字数据到目的操作数DST。它先把堆栈指针寄存器SP所指的字数据送至目的操作数DST,然后SP值加2,使其仍指向栈顶。例如指令“POPAX”

。格式:ADDOPRD1,OPRD2第六章指令系统讲解04:加减乘除运算指令此指令完成两个操作数相加,结果送至目的操作数OPRD1。例如ADDAL,5。格式:INCOPRD此指令完成对操作数OPRD加1,然后把结果送回OPRD。例如INCAL。格式:SUBOPRD1,OPRD2第六章指令系统讲解04:加减乘除运算指令此指令完成两个操作数相减,从OPRD1减去OPRD2,结果送到目的操作数OPRD1中,例如SUBAH,12。格式:DECOPRD此指令完成对操作数OPRD减1,然后把结果送回OPRD。例如DECAL。格式:CMPOPRD1,OPRD2第六章指令系统讲解04:加减乘除运算指令

比较指令完成操作数OPRD1减去操作数OPRD2,运算结果不送到OPRD1,但影响标志CF、ZF、SF、OF、AF和PF。比较指令主要用于比较两个数的关系,是否相等,谁大谁小。示例:判断ZF是否置位,比较两数是否相等无符号数,根据CF判断大小有符号数,根据SF和OF判断大小第六章指令系统讲解标志位标志位名称及外语全称=1=0CF进位标志/CarryFlagCY/Carry/进位NC/NoCarry/无进位PF奇偶标志/ParityFlagPE/ParityEven/偶PO/ParityOdd/奇AF辅助进位标志/AuxiliaryCarryFlagAC/AuxiliaryCarry/进位NA/NoAuxiliaryCarry/无进位ZF零标志/ZeroFlagZR/Zero/等于零NZ/NotZero/不等于零SF符号标志/SignFlagNG/Negative/负PL/Positive/非负OF溢出标志/OverflowFlagOV/Overflow/溢出NV/NotOverflow/未溢出格式:MULOPRD第六章指令系统讲解04:加减乘除运算指令

无符号数乘法指令完成操作数OPRD与AL或AX的无符号乘法操作,如果OPRD为字节操作数,则将结果保存至AX;如果OPRD为字操作数,则将结果保存至DX和AX对中,DX含高16位,AX含低16位。格式:IMULOPRD

有符号数乘法指令完成操作数OPRD与AL或AX的有符号数乘法操作。如果有效进位至高半部分,则标志CF和OF置1,否则置0。格式:DIVOPRD第六章指令系统讲解04:加减乘除运算指令

无符号数除法指令完成AX或(DX,AX)除以操作数OPRD的无符号除法操作。如果OPRD是字节操作数,8位商保存至AL,8位余数保存至AH;如果OPRD是字操作数,16位商保存至AX,余数保存至DX。格式:IDIVOPRD

有符号数除法指令完成的操作与DIV完全类似。当除数为0时,引发0号中断。格式:CBW第六章指令系统讲解04:加减乘除运算指令

字节转换为字指令完成把寄存器AL中的符号扩展到寄存器AH中。即若AL的最高有效位为0,则AH=0;若AL的最高有效位为1,则AH=0FFH。格式:CWD

字转换为双字指令完成把寄存器AX中的符号扩展到寄存器DX。CBW和CWD主要用于有符号数消除时产生字或双字长度的被除数,指令不影响标志位。格式:NOTOPRD第六章指令系统讲解05:逻辑运算和移位指令

否操作指令把操作数OPRD取反,然后送回OPRD。指令对标志位没有影响。格式:ANDOPRD1,OPRD2

与操作指令把两个操作数进行按位的逻辑“与”运算,结果送到目的操作数OPRD1。主要用在使一个操作数中的若干位维持不变,而另外若干位清为0的场合。格式:OROPRD1,OPRD2第六章指令系统讲解05:逻辑运算和移位指令

或操作指令把两个操作数进行按位的逻辑“或”运算,结果送到目的操作数OPRD1。主要用在使一个操作数中的若干位维持不变,而另外若干位置1的场合。格式:XOROPRD1,OPRD2

异或操作指令把两个操作数进行按位的逻辑“异或”运算,结果送到目的操作数OPRD1。操作数可以自己和自己异或实现清0操作,也用于若干位维持不变,而另外若干位取反的场合。格式:TESTOPRD1,OPRD2第六章指令系统讲解05:逻辑运算和移位指令

测试指令把与AND指令类似,也把两个操作进行按位“与”操作,但结果不送到操作数OPRD1,仅仅影响标志。常用于检测某些位是否为1但又不改变原操作数的的情况。示例:

检查AL中的第6位和第2位是否有一位包含1,可使用指令“TESTAL,01000100B”,如果AL的位6和位2均为0,则指令执行后ZF被置1,否则ZF被置0。第六章指令系统讲解05:逻辑运算和移位指令移位指令:SALOPRD,mSHLOPRD,mSAROPRD,mSHROPRD,m第六章指令系统讲解05:逻辑运算和移位指令循环指令:ROLOPRD,mROROPRD,mRCLOPRD,mRCROPRD,m第六章指令系统讲解06:转移指令8086提供了大量用于控制程序流程的指令,按照功能可分为以下四类:无条件转移指令和条件转移指令循环指令过程调用和过程返回指令软中断指令和中断返回指令第六章指令系统讲解06:转移指令

由于程度代码可分为多个段,所以根据转移时是否重置代码段寄存器CS的内容,指令又可以分为段内转移和段间转移。第六章指令系统讲解06:转移指令格式:JMP标号

无条件段内直接转移指令使控制无条件地转移到标号处。示例:

使用JMP跳转指令使程序转至NEXT处。第六章指令系统讲解06:转移指令格式:JMPOPRD

无条件段内间接转移指令使控制无条件地转移到由操作数OPRD的内容给定的目标地址处。示例:

使用JMP跳转指令使程序转至字存储单元[1234H]=5678H处。第六章指令系统讲解06:转移指令格式:JMPFARPTR标号

无条件段间直接转移指令使控制无条件地转移到标号所对应的地址处。对比无条件段内直接转移指令的机器指令格式:第六章指令系统讲解06:转移指令格式:JMPOPRD

无条件段间间接转移指令使控制无条件地转移到由操作数OPRD的内容给定的目标地址处。操作数OPRD必须是双字存储单元。示例:

使用JMP跳转指令使程序转至字存储单元[1234H]所存储的地址处。第六章指令系统讲解06:转移指令

条件转移指令根据某标志位或某些标志位的逻辑运算来判别条件是否成立。如果条件成立则转移,否则继续顺序执行。通常在条件转移指令前,总有用于条件判别的有关指令,例如CMP和TEST。示例:

测试AX的低四位是否全是0,如果均是0,使CX=0;否则使CX=1。第六章指令系统讲解06:转移指令有符号数间的次序关系称为大于(G)、等于(E)和小于(L),无符号数间的次序关系称为高于(A)、等于(E)和低于(B)。有符号数和无符号数的相等均可以使用ZF标志来反映。无符号数大小看CF,有符号数大小看SF和OF。指令格式转移条件转移说明其他说明JZ标号JE标号ZF=1ZF=1等于0转移或者,相等转移单个标志JNZ标号JNE标号ZF=0ZF=0不等于0转移或者,不相等转移单个标志JL标号JNGE标号(SF异或OF)=1(SF异或OF)=1小于转移或者,不大于等于转移两个标志有符号数JBE标号JNA标号(CF或ZF)=1(CF或ZF)=1低于等于转移或者,不高于转移两个标志无符号数第六章指令系统讲解06:转移指令利用条件转移指令和无条件转移指令可以实现循环,但为了方便实现,8086还提供了四条指令用于实现循环。LOOP标号LOOPE/LOOPZ标号LOOPNE/LOOPNZ标号JCXZ标号循环指令和条件转移指令类似,属于段内转移且采用相对转移的方式,及使用地址差的方式实现转移。循环指令不影响标志位。第六章指令系统讲解06:转移指令格式:LOOP标号

计数循环指令使寄存器CX的值减1,如果结果不等于0,则转移到标号,否则顺序执行LOOP后的指令。示例:

从偏移1000H开始的512个字节的数据复制到从偏移3000H开始的缓冲区中。第六章指令系统讲解06:转移指令格式:LOOPE/LOOPZ标号等于/全零循环指令使寄存器CX的值减1,如果结果不等于0并且ZF等于1,则转移到标号,否则顺序执行LOOP后的指令。示例:

在字符串中查找第一个非’A’字符。DS:DI指向字符串,如果找到,BX指向该字符,否则BX=0FFFFH。第六章指令系统讲解06:转移指令格式:LOOPNE/LOOPNZ标号不等于/非零循环指令使寄存器CX的值减1,如果结果不等于0并且ZF等于0,则转移到标号,否则顺序执行LOOP后的指令。示例:

在字符串中查找第一个’A’字符。DS:DI指向字符串,如果找到,BX指向该字符,否则BX=0FFFFH。第六章指令系统讲解06:转移指令格式:JCXZ标号跳转指令实现当寄存器CX的值等于0时跳转到标号,否则顺序执行。示例:

在循环开始之前可以使用JCXZ指令,以便在循环次数为0时,跳过循环体。第七章子程序设计

如果某个程序片段将反复在程序中出现,就把它设计成子程序。第七章子程序设计01:子程序设计概要优点:缩短程序长度,节约存储空间实现共享,便于实现模块化重复使用,减轻工作量

Call和ret都是转移指令,它们都修改IP,或同时修改CS和IP,经常被用来实现子程序的设计。第七章子程序设计02:子程序设计方法

CPU执行Call指令主要进行两步操作。将当前的IP或CS和IP压入栈中转移至子程序

CPU执行ret指令主要进行两步操作。使用栈数据修改IP或CS和IP的内容恢复栈结构依据转移目的地址的不同和获取转移目的地址的不同,Call指令存在四种调用模式。

02:子程序设计方法第七章子程序设计依据转移目的地址的不同及是否带立即数返回,ret指令存在四种执行模式。02:子程序设计方法第七章子程序设计

Call和ret指令共同支持了汇编语言编程中的模块化设计,模块化设计可以实现多个相互联系、功能独立的子程序来解决复杂问题。使用CALL和RET进行子程序设计面临以下几个问题:第七章子程序设计03:模块化程序设计需要解决的几个问题参数和结果传递问题批量数据传递问题寄存器冲突问题第七章子程序设计Q1:参数和结果传递问题示例:

根据提供的N值计算N的3次方。第七章子程序设计Q2:批量数据传递问题示例:

将一个全是字母的字符串转化为大写。第七章子程序设计Q3:寄存器冲突问题示例:

将多个字符串中所有字母转化成大写。8086CPU在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊信息我们称其为中断信息。中断的意思是指CPU不再

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论