80x86汇编语言程序设计教程==_图文
- 格式:ppt
- 大小:13.62 MB
- 文档页数:7
提供的基本寻址方式可以分为三类立即寻址寄存器寻址存储器寻址与存储器有关的寻址的有效地址由以下四种成分组成1位移量存放在指令中的一个81632位的数2基址存放在基址寄存器中的内容3变址存放在变址寄存器中的内容4比例因子386及后继机型增加的一个术语1无比例因子8086286386及后继机型共有位移量直接寻址基址或变址位移量基址或变址—基址变址寻址2带比例因子386及后继机型位移量变址比例因子比例变址寻址比例因子基址+比例因子说明这些寻址方式不仅可以用于源操作数的寻址也可以用于目的操作数的寻址唯一例外的是立即寻址只能用于源操作数例MOV [BX][DI]AX 则源操作数为寄存器寻址目的操作数为基址变址寻址存储器寻址时所确定的内存地址既可以是字节字也可以是双字地址那么上述指令的目的操作数的宽度是多少呢指令中操作数要具有明确的类型寄存器寻址类型确定存储器操作数寻址类型由变量的类型属性确定其它情况类型下操作数类型由指令中其它操作数的类型或指令缺省类型来确定确定的操作数为字类型指令指示对一定操作对象进行何种操作的命令指令系统计算机CPU的指令集合称为指令系统一指令集说明学习要求指令的基本功能二数据传送指令1通用数据传送指令2累加器专用传送指令3地址传送指令4标志寄存器传送指令5类型转换指令特点负责把数据地址或立即数传送到寄存器或存储单元中1通用数据传送指令1传送指令传送指令执行操作DSTSRC DST SRC 的类型要一致双字字节MOV AXMOV AH MOV AX MOV BXMOV MAST[BP][DI]MOV BL MOV BYTE PTR [BX]MOV DSMOV ES MOV AXMOV [BX]MOV DS例MOV EAX MOV ES 哪些指令为非法形式例MOV AXMOV AHMOV AXMOV BXMOV MAST[BP][DI]MOV BLMOV BYTE PTR [BX]MOV DSMOV ESMOV AXMOV [BX]MOV DS寄存器寄存器字寄存器寄存器字节存储器寄存器字存储器寄存器寄存器存储器字节立即数寄存器立即数存储器字节寄存器段寄存器存储器段寄存器段寄存器寄存器存储器存储器段寄存器段寄存器MOV ES立即数段寄存器MOV EAX存储器寄存器双字MOV CS AXMOV 5ALMOV EAX BX都是非法指令如为了使指令字不要过长规定双操作数指令的两个操作数中只能有一个使用存储器寻址方式因此不允许双存储器操作在有通用性MOV [BX]2带符号扩展传送指令有符号数的扩展MOVSX386及后继机型可用格式MOVSX DST, SRC执行操作本指令有两种格式REG1REG源操作数可以是或存储单元的内容目的操作数必须是功能传送时将源操作数符号扩展送入目的寄存器可以是位MOVSX3带零扩展传送指令无符号数的扩展MOVZX386及后继机型可用格式MOVZX DST, SRC执行操作本指令有两种格式REG1REG源操作数目的操作数MOVSX功能传送时将高位扩展为送入目的寄存器可以是位MOVSX例1MOVSX EAX 2MOVZX EAX 若执行前DATA =0FFE0H DATA 为字单元1EAX =0FFFFFFE0H 2EAX=0000FFE0H一般的双操作数指令源目的操作数的长度一致MOVZX MOVSX 指令的源操作数的长度一定要小于目的操作数的长度如MOVSX DXALMOVZX EBXAL 4堆栈操作指令堆栈PC 机的堆栈是在内存中开辟的一端固定一端活动的存储区采用的工作方式栈顶SP 或ESP 址由低注意 1.信息的存入和取出都是从栈顶开始中栈顶由指示当堆栈地址长度为位时堆栈操作使用SP 当堆栈地址长度为位时堆栈操作使用ESP为了将清楚堆栈操作指令我们分8086/8088803868086/8088 PUSH/POP进栈指令执行操作出栈指令执行操作例SP→SP→例SP→SP→ES)=2367H, (SP)=0100H,试画出堆栈的变化情况(SP)=100H12H12H例都是非法指令80386SP SP 2 ESP ESP 2 SP SP 4 ESP ESP 4 1616位位在实方式下803868086为编写80386及后继的程序可利用位通用寄存器可使用新增指令可采用新增的寻址方式但是段的最大长64KB 当存储单元的地址偏移超过64KB 时不会引起地址的反绕而导致段跨越异常在实方式下80386的兼容最大段为64称为位段在保护方式下段长可达4G 称为位段在实方式下运行的程序只能使用位段尽管在实方式下只能使用位段但可以使用位操作数也可以使用位形式表示的存储单元地址例MOV EAX关于实方式程序的几点说明为单位指令可以有四种格式不允许它使用立即数寻址方式指令允许三种格式能为字节类型5PUSHA/PU格式PUSHA286及后继PUSHAD386及后继执行操作PUSHA位通用寄存器依次入栈入栈次序为AX CX DX BX指令执行前的SP BP SI DISP SP-16PUSHAD位通用寄存器依次入栈入栈次序为EAX ECX EDX EBX指令执行前的ESP EBP ESI EDIESP ESP-326POPA/POP格式执行操作POPA位通用寄存器依次出栈出栈次序为DI SI BP SP BX DX CX AXSP SP+16POPAD位通用寄存器依次出栈出栈次序为EDI E SI EBP ESP EBX EDX ECX EAXESP ESP+32PUSHA POPA PUSHAD不影响标志位例例7交换交换指令执行操作OPR1OPR1OPR1例如XCHG EAX,EBX ; EAX 字AL 为要查找数据在表格2累加器专用传送指令EAX AX 传送信息IN OUT 输出程序设计中讲解换码指令格式执行操作累加器EAX AX AL例MOV BX, OFFSET TABLE ; (BX)=0040H长度不超过256)或EBX下标→(AL)3地址传送指令1LEA REG, SRC ;2LDS REG, SRC ;3LES REG, SRC ;4LFS REG, SRC ;5LGS REG, SRC ;6LSS REG, SRC ;把首地址偏移地址传送指令执行操作位有效地址位有效地址位有效地址截取低位有效地址零扩展后存入则MOV BX LEA BXBX =3412H BX=0100HBLOCK的区别假设0100H BLOCK =3412H 例值而不是该地址所在的存储单元的内容必须注意取地址到和寄存器指令执行操作或SREG ←位寄存器REG 不能是段R R LFS 段址偏移地址偏移地址段址例LDS SI, [10H]例LES DI, [BX]例TABLE DW 40H, 3000H , 2000HLSS ESP TABLE ;ESP=30000040H; (SS) =2000H4标志寄存器传送指令执行操作送标志寄存器指令执行操作(FLAGS标志进栈指令执行操作PUSHF: (SP)标志出栈指令执行操作LAHFSAHF例PUSHF TF=1TF15类型转换CBW AL的符号扩展到AH形成中的字CWD/CWDECWD AX的符号扩展到DX形成DX AX双字CWDE AX的符号扩展到EAX形成EAX双字CDQ EAX的符号扩展到EDX形成EDX EAXBSWAP 486及后继机型可用格式BSWAP R32 R32位寄存器操作将位寄存器的字节次序变反即14字节互换23字节互换指令合法的指令格式堆栈操作指令的指令与指令的区别掌握XCHG XLAT MOVSX MOVZX类型转换其余堆栈操作指令标志操作指令MOVSX作业。
8086汇编语⾔程序设计——第⼀个程序本系列以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。
Intel8086指令系统中有100多条指令,利⽤这些指令可以编写出复杂的程序实现更多功能。
汇编语⾔是直接控制计算机硬件⼯作的最简便的语⾔。
学习了汇编语⾔可具有在CPU寄存器级上进⾏控制和操作的能⼒,可获得直接对计算机硬件底层编程的经验。
⼀个计算的例⼦例 *编写⼀个汇编语⾔程序,实现下列公式计算。
假设X=4,Y=5汇编指令如下:如果在DEBUG下⽤A命令输⼊这些指令,必须把X、Y换成具体的数值;Z、Z1是存储单元地址,最后两条指令可写为MOV [0],AL和MOV [1],AH,这样才能⽤T命令执⾏。
D:\dos〉DEBUG-AMOV AL,4ADD AL,5MOV BL,8IMUL BLMOV BL,4MOV BH,0SUB AX,BXMOV BL,2IDIV BLMOV [0],ALMOV [1],AH采⽤DEBUG的A命令输⼊程序的做法明显不⽅便,⼀是⽆法给出变量名即符号地址,⼆是调试修改程序不便。
1. 编写⼀个完整的汇编语⾔源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。
伪指令与C语⾔等⾼级语⾔中的说明性语句的含义类似,起到说明作⽤。
⽤记事本gedit或者vi编写,保存到dos⽬录下注释符号为;号2. 汇编、链接、执⾏汇编语⾔源程序既可以⽤⼤写字母也可以⽤⼩写字母书写。
汇编语⾔程序建⽴及汇编过程如图所⽰。
⽤户编写的源程序要经汇编程序MASM汇编(翻译)后⽣成⼆进制⽬标程序,⽂件名默认与源程序同名、扩展名为.OBJ;再经过LINK连接⽣成可执⾏程序,⽂件名默认与源程序同名、扩展名为.EXE。
注意:源程序⼀定要和MASM和LINK⽂件放在同⼀个⽂件夹中。
执⾏MASM和LINK命令时需要按多次回车。
3. 在DEBUG下执⾏程序MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。
80X86伪指令系统一.伪指令概述构成汇编语言程序的语句可以分为三种:指令性语句(指令语句)、指示性语句(伪指令语句)和指令语句(宏调用语句)。
指令语句,又称可执行语句,表示计算机具有的一个基本能力。
比如数据传送,数据相加、相减等。
伪指令语句,又称命令语句,告诉汇编程序如何对程序进行汇编。
比如段定义、储存单元分配等。
一个汇编语言程序经汇编,连接和装入内存后,在执行程序之前:1.指示性语句的功能已经完成,故又称伪操作。
2.指令性语句的功能尚未完成,需控制CPU去执行,才能完成。
二、伪指令详解符号定义语句1.等值语句格式:符号名EQU 需等值的表达式功能:用符号名等值指定的表达式;其中表达式可以是任何有效的操作数,汇编时用语句中的表达式代替程序中符号所在的地方。
说明:▲可用于定义符号常量,方便修改程序。
▲某表达式多次出现时,用等值伪操作可以方便编程。
▲等值语句表达式的种类(1)常数或数值表达式COUNT EQU 10NUM EQU 89*3+5-9(2)地址表达式ADD1 EQU V AR2+10H(3)变量或标号CON EQU V AR▲在EQU语句右边出现的标号需在EQU语句以前进行定义。
2.等号语句格式:符号=需等值的表达式功能:把等号“=”右边表达式的值或符号赋给等号“=”左边的符号。
表达式可以是任何有效的操作数。
说明:EQU语句与“=”的区别:在同一源程序中,EQU语句定义的符号不能被重新赋值或者说不能被重新定义,同一符号只能定义一次,符号的数值不能被改变。
“=”定义的符号可以被重新赋值,同一符号的数值在同一个程序中可以改变。
数据定义语句格式:变量名类型助记符操作数[ ,操作数, ……]功能:用于在内存中为常数、初始数据或者变量分配储存单元。
说明:(1)变量名指示内存操作数所占用的内存单元地址(符号地址),在程序中,可以通过变量,名对内存单元进行访问。
变量名为用户自定义标识符,表示初值表首元素的逻辑地址。
第二章答案Tarzan 版题2.1 8086/8088通用寄存器的通用性表现在何处?8个通用寄存器各自有何专门用途?哪些寄存器可作为存储器寻址方式的指针寄存器?答:8086/8088通用寄存器的通用性表现在:这些寄存器除了各自规定的专门用途外,他们均可以用于传送和暂存数据,可以保存算术逻辑运算中的操作数和运算结果;8个通用寄存器的专门用途如下:AX 字乘法,字除法,字I/OBX 存储器指针CX 串操作或循环控制中的计数器DX 字乘法,字除法,间接I/OSI 存储器指针(串操作中的源指针)DI 存储器指针(串操作中的目的指针)BP 存储器指针(存取堆栈的指针)SP 堆栈指针其中BX,SI,DI,BP可作为存储器寻址方式的指针寄存器题2.2 从程序员的角度看,8086/8088有多少个可访问的16位寄存器?有多少个可访问的8位寄存器?答:从程序员的角度看,8086/8088有14个可访问的16位寄存器;有8个可访问的8位寄存器;题2.3 寄存器AX与寄存器AH和AL的关系如何?请写出如下程序片段中每条指令执行后寄存器AX的内容:MOV AX,1234HMOV AL,98HMOV AH,76HADD AL,81HSUB AL,35HADD AL,AHADC AH,ALADD AX,0D2HSUB AX,0FFH答: MOV AX,1234H AX=1234HMOV AL,98H AX=1298HMOV AH,76H AX=7698HADD AL,81H AX=7619HSUB AL,35H AX=76E4HADD AL,AH AX=765AHADC AH,AL AX=D15AHADD AX,0D2H AX=D22CHSUB AX,0FFH AX=D12DH题2.4 8086/8088标志寄存器中定义了哪些标志?这些标志可分为哪两类?如何改变这些标志的状态?答: 8086/8088标志寄存器中定义了9个标志,如下:CF: Carry FlagZF: Zero FlagSF: Sign FlagOF: Overflow FlagPF: Parity FlagAF: Auxiliary Carry FlagDF: Direction FlagIF: Interrupt-enable FlagTF: Trap Flag这些标志可分为两类,分别为:1、运算结果标志;2、状态控制标志;采用指令SAHF可把AH中的指定位送至标志寄存器低8位SF、ZF、AF、PF、CF;采用CLC可清除CF,置CF到0采用STC可置CF到1采用CLD可置DF到0采用sTD可置DF到1采用CLI可置IF到0采用STI可置IF到1另外,在某些指令执行过程中会改变部分标志的状态;题2.5 请说说标志CF和标志OF的差异。
汇编语言的程序设计方法(循环结构和分支结构)汇编语言中常见的形式有:顺序程序设计,分支程序设计,循环程序设计以及子程序设计今天通过实例来详细说明分支程序设计,和循环程序设计1.分支程序设计根据不同的条件做出不同的处理,把不同的方法编织成各自的处理程序段,运行时由机器根据不同的条件自动做出选择判断。
绕过某些指令,仅执行相应的处理程序段。
按这种方法处理成为分支结构。
分支程序是机器利用改变标志位的指令和转移指令来实现的。
分支程序设计实例给定以下符号函数:给定X值,假设为-25,且存放于X单元,函数值Y存放于Y于单元,根据给定的X值确定Y得值程序如下DATAX SEGMENTx DB-25y DB?DATAX ENDSCODEX SEGMENTMAIN PROC FARASSUME CS:CODEX, DS:DATAXSTART:PUSH DSMOV AX,0PUSH AXMOVAX,DATAXMOVDS,AXMOVAL,xCMPAL,0JGE LOOP1MOVAL,OFFHMOVy,ALRETLOOP1:JELOOP2MOVAL,1MOVY,ALRETLOOP2:MOVAL,0MOVy,ALRETMAIN ENDPCODEX ENDSENDSTART2.循环程序设计(1)计数控制循环(限于循环次数已知) 该方法简单直观易于程序设计(2)用条件控制循环无法确定循环次数的时候用该方法下面通过实例讲解DATASSEGMENTnDW?sumDW?DATASENDSCODES SEGMENTMAINPROCFARASSUMECS:CODES,DS:DATAS START:PUSHDSMOVAX,0PUSHAXMOVAX,DATASMOVDS,AXMOVAX,0MOVBX,0MOVCX,0LOOPT: INC BXADDAX,BXINCCXCMP AX.1000JBELOORTMOVn,CXMOVsum,AXRETMAIN ENDPCODESENDSENDSTART问渠哪得清如许?为有源头活水来!持续不断地输入,才会厚积薄发!有遗漏的地方大家指正。
80x86汇编语言程序设计80x86汇编语言程序设计是一门专门研究如何使用汇编语言在80x86架构的计算机上编写程序的学科。
80x86架构是Intel公司开发的一种微处理器架构,它包括了8086、80286、80386、80486等处理器,以及后来的Pentium系列。
汇编语言是一种低级语言,它与机器语言非常接近,通常用于编写性能要求极高的程序或者进行底层系统开发。
汇编语言基础汇编语言的指令与机器指令一一对应,但使用助记符来代替二进制代码,使得程序更加易于编写和理解。
汇编语言的基本元素包括指令、寄存器、内存地址和立即数。
- 指令:是汇编语言的基本操作单位,用于执行特定的操作,如数据传输、算术运算、逻辑运算等。
- 寄存器:是CPU内部的存储单元,用于快速存取数据。
80x86架构有多个寄存器,包括通用寄存器、段寄存器、指令指针寄存器等。
- 内存地址:是存储在RAM中的数据的位置,汇编语言可以通过内存地址访问和操作数据。
- 立即数:是指令中直接给出的数值,不需要通过寄存器或内存地址访问。
汇编语言指令80x86汇编语言提供了丰富的指令集,用于执行各种操作。
以下是一些基本的指令类型:- 数据传输指令:如MOV(移动数据)、PUSH(将数据压入堆栈)、POP(从堆栈中弹出数据)等。
- 算术指令:如ADD(加法)、SUB(减法)、MUL(乘法)、DIV(除法)等。
- 逻辑指令:如AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR (逻辑异或)等。
- 控制流指令:如JMP(无条件跳转)、JE(等于时跳转)、JNE(不等于时跳转)、LOOP(循环)等。
汇编程序结构一个典型的汇编程序包括以下部分:1. 程序声明:声明程序的名称和起始点。
2. 数据定义:定义程序中使用的数据和常量。
3. 代码段:包含程序的指令和逻辑。
4. 堆栈段:用于存储临时数据和调用函数时的参数。
5. 常量段:定义程序中使用的常量。
6. 外部引用:引用其他程序或库中的代码和数据。
课程性质与设置目的要求《汇编语言程序设计》课程是计算机专业高等教育的专业基础必修课程。
通过该课程的学习,使学生掌握汇编语言程序设计的基本方法和技术,从而加深对计算机系统的认识和理解;以有利于今后计算机相关专业课程的学习。
同时本课程作为一门面向机器硬件的软件设计技术,可以在计算机应用开发中得到应用,能够帮助学生今后从事有关计算机应用及研究工作。
本课程采用汇编程序MASM 6.0版,强调对基本指令的理解和掌握,重点介绍16位机的指令系统和程序设计技术。
要求掌握基本的编程技术,强调上机实验,熟练进行程序的调试,培养学生的动手能力。
先修课程要求:本课程的先修课程为《数字逻辑》、《高级语言程序设计》。
本课程学分为4分。
总学时数为90,其中54学时为课堂教学,36学时为上机实践。
教学手段:课堂教学运用多媒体教学手段和上机实践等相结合。
考核方法:采用笔试,结合平时成绩。
考试成绩占70%,平时成绩占30%引言:●关于本书●我们要学习本书中的哪些内容?●时间安排●平时成绩计算方法目录第一章基础知识1.1汇编语言简介1.1.1什么是汇编语言1.1.2为什么要学习汇编语言1.2计算机中数据的表示1.3计算机组织1.3.1计算机系统概述1.3.2 中央处理机CPU1.3.3 存储器1.3.4 外部设备第二章汇编语言程序实例及上机操作2.1汇编语言程序实例2.2工作环境及上机操作2.3 DEBUG主要命令2.4 常用的DOS命令2.5 几个常用的DOS系统功能调用(INT 21H)第三章指令系统和寻址方式3.1 寻址方式3.2 指令系统第四章汇编语言程序格式4.1汇编程序功能4.2 伪操作4.3 程序格式4.4 汇编语言上机第五章循环与分支程序设计5.1 循环程序设计5.2 分支程序设计第六章子程序6.1 子程序的设计方法6.2 子程序的嵌套(见书)6.3 子程序举例第七章高级汇编语言技术第一章基础知识1.1 汇编语言简介1.1.1什么是汇编语言机器语言汇编语言高级语言1.1.2为什么要学习汇编语言1.2计算机中数据的表示1.2.1 不同进位计数制及其相互转换二进制及进制十进制数: 123.6(D)=1×102+2×101+3×100+6×10 -1各位权值10k二进制数: 101101(B) = 1×25+1×23+1×22+1×20=45(D) 各位权值2k十六进制数: 5F(H)=5×161+15×160(D)各位权值16k1.2.2 二进制数、十进制数和十六进制数转换(1)二进制数转换为十进制数(按权展开)1101.1(B)=23+22+20+2-1=8+4+1+0.5=13.5(D)(2)十进制数转换为二进制数. 降幂法:(适用于数值不大的数)13.5(d)=8+4+1+0.5 =1101.1100001000001+ 0.1 1101.1★对于小数有:例1.2:N=0.8125D (降幂法)2-12-22-32-40.5 0.25 0.125 0.0625计算过程:0.8125- 0.5 =0.3125 (b1=1)0.3125- 0.25 =0.0625 (b2=1)0.0625- 0.125 <0 (b3=0)0.0625- 0.0625=0 (b4=1)N=0.8125D=0.1101B例1.4: N=0.8125D (乘2取整法)0.8125 × 2 1.6250.625 × 2 1.250.25 × 2 0.50.5 × 2 1.00.8125D =0.1101B★对于整数有:除法:(除2取余法,对整数而言)N=13 除2即二进制数去掉最右一位13/2=6 余1 (余1表明N是奇数,得到一位)6/2=3 余0 商为6即可写出1103/2=1 余11/2=0 余113(d)=1101(b)1011B = 11D1101B = 13D(3)十六进制数与二进制数转换每四位二进制数表示一位十六进制数例:0011 0101 1011 1111 3 5 B F即0011010110111111(B)= 3 5 B F(H)(4)十六进制数与十进制数转换方法同二进制数与十进制数转换,不过是基数为十六进制数所对应的权。