




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言程序设计 教 案编号:1第一章 基础知识教学目的:(1) 了解机器语言 (2) 理解汇编语言的涵义(3) 理解8086CPU硬件系统结构教学重点及难点:汇编语言的涵义,CPU对存储器的读写原理,内存地址空间的分配教学方法:讲授、示例、练习教学过程:1. 提出三个问题n 什么是汇编语言n 为什么学汇编语言n 如何学习汇编语言2. 介绍本书内容结构及特点3. 教学内容引言n 汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。1.1 机器语言n 机器语言是机器指令的集合。n 阐述机器语言的原理,发展及弊端。1.2 汇编语言的产生n 汇编语言的主
2、体是汇编指令。n 汇编指令是机器指令的助记符 (两者一一对应)。1.3 汇编语言的组成n 汇编语言由以下3类组成:n 1、汇编指令(机器码的助记符)n 2、伪指令(由编译器执行)n 3、其它符号(由编译器识别)n 汇编语言的核心是汇编指令,它决定了汇编语言的特性。1.4 存储器n CPU 是计算机的核心部件它控制整个计算机的运作并进行运算,要想让一个CPU 工作,就必须向它提供指令和数据。n 指令和数据在存储器中存放,也就是平时所说的内存。1.5 指令和数据n 指令和数据是应用上的概念。n 在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。1.6 存储单元n 存储器被划分为若干个存储单元
3、,每个存储单元从0开始顺序编号;n 例如:一个存储器有128个存储单元,编号从0127。n 存储器的计量单位B、KB、MB、GB、TB1.7 CPU对存储器的读写n CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行三类信息的交互:n 存储单元的地址(地址信息)地址总线n 器件的选择,读或写命令(控制信息)数据总线n 读或写的数据(数据信息)数据总线n CPU在内存中读或写的数据演示:读演示、写演示 机器码:10 对应的汇编指令:MOV AX,3 含义:传送3 号单元的内容到AX1.8 地址总线n CPU是通过地址总线来指定存储单元的。n 一个CPU有N根地址总线,则可以说这个C
4、PU的地址总线的宽度为N。n 这样的CPU最多可以寻找的N次方个内存单元。1.9 数据总线n CPU及内存或其它器件之间的数据传送是通过数据总线来进行的。n 数据总线的宽度决定了CPU和外界的数据传送速度。1.10 控制总线n CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。n 有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。1.11 内存地址空间(概述)n 什么是内存地址空间n 不同的计算机系统的内存地址空间分配情况是不同的。n 讲解8086PC机内存地址空间分配的基本情
5、况作业:汇编语言程序设计 教 案编号:2第二章 寄存器教学目的:(1) 理解通用寄存器的逻辑结构及其存储原理(2) 理解物理地址、段地址及偏移地址的本质含义(3) 理解8086CPU读取执行指令的工作原理,及代码段寄存器CS和指令指针寄存器IP的含义,并掌握其使用方法教学重点及难点:8086CPU读取执行指令的工作原理,及代码段寄存器CS和指令指针寄存器IP的使用方法教学方法:讲授、示例、练习教学过程:1.CPU概述n 一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。n 内部总线实现CPU内部各个器件之间的联系。n 外部总线实现CPU和主板上其它器件的联系。2.寄存
6、器概述n 8086CPU有14个寄存器它们的名称为: AX、BX、CX、DX、SI、DI、SP、BP、 IP、CS、SS、DS、ES、PSW。3. 教学内容2.1 通用寄存器n 8086CPU所有的寄存器都是16位的,可以存放两个字节。n AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。n 讲解寄存器的逻辑结构。n 为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。2.2 字在寄存器中的存储n 一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。2.3 几条汇编指令汇编指令不区分大小写注意:在进行数据传送或
7、运算时,要注意指令的两个操作对象的位数应当是一致的。2.4 物理地址n CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。2.5 16位结构的CPUn 概括的讲,16位结构描述了一个CPU具有以下几个方面特征:n 1、运算器一次最多可以处理16位的数据。n 2、寄存器的最大宽度为16位。n 3、寄存器和运算器之间的通路是16位的。2.6 8086CPU给出物理地址的方法n 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。n 地址加法器合成物理地址的方
8、法:物理地址=段地址16+偏移地址2.7 “段地址16+偏移地址=物理地址”的本质含义n 用两个比喻说明2.8 段的概念n 错误认识:内存被划分成了一个一个的段,每一个段有一个段地址。n 其实:内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。n 两点需要注意(1)段地址16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;(2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。n 结论:CPU可以用不同的段地址和偏移地址形成同一个物理地址
9、。2.9节2.12节n 1、段地址在8086CPU的寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。n 2、CS存放指令的段地址,IP存放指令的偏移地址。 8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。n 3、8086CPU的工作过程:(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;(2)IP指向下一条指令;(3)执行指令。(转到步骤(1),重复这个过程。)n 4、8086CPU提供转移指令修改CS、IP的内容。作业:汇编语言程序设计 教 案编号:3第三章 寄存器(内存
10、访问)教学目的:(1) 掌握汇编指令访问内存的方法(2) 理解汇编指令mov、add、sub的格式及含义,并掌握其使用方法(3) 理解CPU的堆栈机制,掌握汇编指令push、pop的含义及其使用方法(4) 理解数据段、代码段、栈段的内涵教学重点及难点:汇编指令访问内存的方法,汇编指令格式,及堆栈机制教学方法:讲授、示例、练习教学过程:1.引言在第2章中,我们主要从 CPU 如何执行指令的角度讲解了8086CPU的逻辑结构、形成物理地址的方法、相关的寄存器以及一些指令。这一章中,我们从访问内存的角度继续学习几个寄存器。2.教学内容3.1 内存中字的存储结论:任何两个地址连续的内存单元,N号单元和
11、 N+1号单元,可以将它们看成两个内存单元 ,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。3.2 DS和addressCPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;在8086PC中,内存地址由段地址和偏移地址组成。8086CPU中有一个 DS寄存器,通常用来存放要访问的数据的段地址。问题:如何用mov指令从10000H中读取数据?结论:mov bx,1000Hmov ds,bxmov al,0注意:8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器。 (硬件设计的问题)mov ds,1000H 是非法的。3.3 字的传送因为8086CPU是1
12、6位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是一次性传送一个字。3.4 mov、add、sub指令已学mov指令的几种形式: mov 寄存器,数据 mov 寄存器,寄存器 mov 寄存器,内存单元 mov 内存单元,寄存器 mov 段寄存器,寄存器根据已知指令进行推测:mov 段寄存器,寄存器mov 寄存器,段寄存器(验证)mov 内存单元,寄存器mov 内存单元,段寄存器mov 段寄存器,内存单元注意:add和sub指令同mov一样,都有两个操作对象。3.5 数据段定义:将一组长度为N(N64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定
13、义了一个数据段。访问数据段中的数据:用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。示例3.6 栈栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。栈有两个基本的操作:入栈和出栈。入栈:将一个新的元素放到栈顶;出栈:从栈顶取出一个元素。栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。栈的操作规则:LIFO(Last In First Out,后进先出)3.7 CPU提供的栈机制8086CPU提供入栈和出栈指令: (最基本的) PUSH(入栈)POP (出栈) push ax:将寄存器ax中的数据送入栈中; pop ax
14、 :从栈顶取出数据送入ax。注意:8086CPU的入栈和出栈操作都是以字为单位进行的。push 指令的执行过程:push ax(1)SP=SP2;(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。pop 指令的执行过程:pop ax(1)将SS:SP指向的内存单元处的数据送入ax中;(2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。3.8 栈顶超界的问题当栈满的时候再使用push指令入栈,栈空的时候再使用pop指令出栈,都将发生栈顶超界问题。栈顶超界是危险的。我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈
15、空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。3.9 push、pop指令push和pop指令的格式(1)push 寄存器:将一个寄存器中的数据入栈pop寄存器:出栈,用一个寄存器接收出栈的数据push和pop指令的格式(2)push 段寄存器:将一个段寄存器中的数据入栈pop段寄存器:出栈,用一个段寄存器接收出栈的数据push和pop指令的格式(3)push 内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位)pop 内存单元:出栈,用一个内存字单元接收出栈的数据3.10 栈段定义:将长度为 N(N 64K )的一
16、组地址连续、起始地址为16的倍数的内存单元,当作栈来用,从而定义了一个栈段。访问:如何使用如push、pop 等栈操作指令访问我们定义的栈段呢?将SS:SP指向我们定义的栈段。3、段的综述我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们自己的安排。我们可以用一个段存放数据,将它定义为“数据段”;我们可以用一个段存放代码,将它定义为“代码段”;我们可以用一个段当作栈,将它定义为“栈段”;一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。关键在于CPU中寄存器的设置,即: CS、IP、SS、SP、DS的指向。作业:汇编
17、语言程序设计 教 案编号:4第四章 第一个程序教学目的:(1) 掌握源程序书写格式(2) 理解一个源程序从写出到执行的过程(3) 掌握程序的执行过程及其跟踪方法教学重点及难点:汇编语言源程序的书写格式,执行过程及跟踪方法教学方法:讲授、示例、练习教学过程:4.1 一个源程序从写出到执行的过程编写源程序编译链接执行注意:解释可执行文件4.2 源程序汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。1.伪指令没有对应的机器码的指令,最终不被CPU所执行。3种伪指令(1)段定义伪指令segment和ends(2)汇编结束伪指令END(3)ASSUME 段分配伪指令 2.标号:
18、一个标号指代了一个地址。(代表某一存储单元地址的名字)字母:AZ 数字:09特殊字符:? . _ $codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。start:放在某个指令前,作为程序的入口,程序加载到内存后,CS:IP会指向这个标号,从start指向的指令开始运行。3.源程序中的“程序”汇编源程序:伪指令(编译器处理)、汇编指令(编译为机器码)程序:源程序中最终由计算机执行、处理的指令或数据。4.汇编语言源程序的结构 一般来说,一个完整的汇编源程序应由三个程序段组成,即代码段、数据段和堆栈段,每个段都以SEGMENT开始,以E
19、NDS结束,代码段包含程序要执行的指令;堆栈段用来在内存中建立一个堆栈区;数据段用来在内存中建立一个适当容量的工作区,以存放程序中所需的数据。 注意:一个源程序中,代码段是必须的,而数据段和堆栈段可以没有或有其中一个。段定义时一般最后定义代码段。5.程序返回我们的程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,那么,它怎样得到运行呢?(讨论)现在,我们知道,一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。应该在程序的末尾添加返回的程序段。 mov ax,4c00H int 21H注意:几个和结束相关的内容:段结束、程序
20、结束、程序返回6.语法错误和逻辑错误语法错误:程序在编译时被编译器发现的错误;容易发现。逻辑错误:程序在编译时不能表现出来的、在运行时发生的错误;不容易发现。4.3.编辑源程序使用工具:可使用各种文本编辑工具(记事本、写字板、WORD等),我们使用notepad+文本编辑器。功能:产生一个存储源程序的文本文件。使用方法:输入汇编源程序并保存为.asm文件。4.4 对源程序进行编译使用工具:使用MASM6.15编译器功能:使用编译器对源程序文件进行编译,生成包含机器代码的目标文件 ( .obj)。使用方法:在dos下运行masm.exe程序对源程序的编译结束,编译器输出的最后两行告诉我们这个源程
21、序有没有警告错误和必须要改正的错误。4.5 对目标文件进行连接使用工具:使用 LINK . EXE连接器功能:对目标文件(.obj)进行连接,从而得到一个可执行文件 . EXE 。使用方法:在DOS下运行link.exe程序: 注意讲解连接的作用4.6 以简化的方式进行编译和连接用一种较为简捷的方式进行编译、连接。C: MASM masm XXX;C: MASM link XXX;C: MASM ml XXX.asm;4.7 1.exe的执行提问:程序到底运行没有?程序运行了,只是从屏幕上不可能看到任何运行结果。我们的程序没有像显示器输出任何信息。程序只是做了一些将数据送入寄存器和加法的操作,
22、而这些事情,我们不可能从显示屏上看出来。程序执行完成后,返回,屏幕上再次出现操作系统的提示符。4.8 谁将可执行文件中的程序装载进入内存并使它运行?1.exe的执行过程:(1)我们在提示符“C:masmml 1.asm” ,按Enter键。(编译连接)(2)1.exe中的程序运行;问题4.1(3)运行结束,返回,再次显示提示符“C:masm”。问题4.2两个问题问题4.1:执行第(2)步操作,有一个正在运行的程序将1.exe中的程序加载入内存,这个正在运行的程序是什么?它将程序加载入内存后,如何使程序得以运行?问题4.2:执行第(3)步操作,程序运行结束后,返回到哪里?回答问题4.1和4.2(
23、1)我们在DOS中直接执行 1.exe 时,是正在运行的command将1.exe中的程序加载入内存。(2)command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行。(3)程序运行结束后,返回到command中,CPU继续运行command。4.9 程序执行过程的跟踪使用工具:debug功能:观察程序的运行过程 (Debug 可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU 的控制,这样,我们就可以使用Debug 的相关命令来单步执行程序 ,查看每条指令指令的执行结果。)使用方法:在DOS下运行DEBUG . EXE程序。 C
24、: debug xxx.exe(后缀不能省略)作业:汇编语言程序设计 教 案编号:5第五章 bx和loop指令教学目的:(1) 理解汇编语言的循环结构(2) 掌握bx和loop联合使用访问内存实现循环结构的方法(3) 掌握汇编指令loop的格式,理解其工作原理(4) 掌握段前缀的使用教学重点及难点:bx和loop联合使用实现循环结构,及loop指令的工作原理教学方法:讲授、示例、练习教学过程:1、几个概念1.bx和内存单元的描述2.loop:英文单词“loop”有循环的含义,显然这个指令和循环有关。3.描述性符号“()”:为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号 “() ”
25、来表示一个寄存器或一个内存单元中的内容。4.约定符号idata表示常量2、教学内容5.1 bx下面指令的功能:mov ax,bx 功能:bx 中存放的数据作为一个偏移地址EA ,段地址SA 默认在ds 中,将SA:EA处的数据送入ax中。即: (ax)=(ds) *16 +(bx);mov bx,ax 功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处。即:(ds *16 +(bx) = (ax)。5.2 Loop指令(循环控制指令)格式:loop 标号CPU 执行loop指令的时候,要进行两步操作: (cx)=(cx)-1; 判断cx中的值
26、,不为零则转至标号处执行程序,如果为零则向下执行。注意:loop循环中用CX作计数器控制程序的循环次数。补充:通用寄存器:AX:Accumulator 累加器常用于存放算术逻辑运算中的操作数BX:Base register 基址寄存器常用来存放访问内存时的基址(段地址)CX:Count register计数器在循环和串操作指令中用作计数器DX:Data register一般数据寄存器在进行乘、除运算时,它可作为默认的操作数参及运算,也可用于存放I/O的端口地址。 5.3 在Debug中跟踪用loop指令实现的循环程序示例:计算ffff:0006单元中的数乘以3,结果存储在dx中。分析:(1)运
27、算后的结果是否会超出dx所能存储的范围?(2)我们用循环累加来实现乘法,用哪个寄存器进行累加?(3) ffff:0006单元是一个字节单元,ax是一个 16 位寄存器,数据长度不一样,如何赋值?5.4 Debug和汇编编译器Masm对指令的不同处理示例任务:将内存2000:0、2000:1 、2000:2、2000:3单元中的数据送入al,bl,cl,dl中。(1)在Debug中编程实现(2)汇编程序实现5.6 段前缀在访问内存单元的指令中,用于显式地指明内存单元的段地址的“段寄存器:”(ds:、cs:、ss:或es:),在汇编语言中称为段前缀。5.7 一段安全的空间在8086模式中,随意向一
28、段内存空间写入内容是很危险的 ,因为这段空间中可能存放着重要的系统数据或代码。汇编语言程序直接面向机器,如果我们要向内存空间写入数据时,要保证所写入的内存中没有重要的数据,否则会影响系统的正常运行,在一般的PC机中都不使用0:2000:2ff(00200h002ffh)这段256个字节内存空间,所以我们可以放心使用这段安全的空间。5.8 段前缀的使用将内存ffff:0ffff:b段元中的数据拷贝到 0:2000:20b单元中。作业:汇编语言程序设计 教 案编号:6第六章 包含多个段的程序教学目的:(1) 理解在代码段中使用数据的原理及不便之处(2) 理解在代码段中使用栈的原理及不便之处(3)
29、掌握将数据、代码、栈放入不同的段的应用教学重点及难点:将数据、代码、栈放入不同的段的应用教学方法:讲授、示例、练习教学过程:1、引言前面我们写的程序中,只有一个代码段。现在有一个问题是:如果程序需要用其他空间来存放数据,我们使用哪里呢?我们将以这样的顺序来深入地讨论多个段的问题:(1)在一个段中存放数据、代码、栈,我们先来体会一下不使用多个段时的情况;(2)将数据、代码、栈放入不同的段中。 6.1 在代码段中使用数据(将数据定义在代码段中)示例:编程计算以下8个数据的和,结果存在ax 寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。6
30、.3 将数据、代码、栈放入不同的段在前面的内容中,我们在程序中用到了数据和栈,我们将数据、栈和代码都放到了一个段里面。我们在编程的时候要注意何处是数据,何处是栈,何处是代码。这样做显然有两个问题:(1)把它们放到一个段中使程序显得混乱;(2)前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题。但如果数据、栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64 KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都这样)。 所以,我们应该考虑用多个段来存放数据、代码和栈。 作业:汇编语言程序设计 教 案编号:7第七章 更灵活的
31、定位内存地址的方法教学目的:(1) 掌握汇编逻辑运算指令and和or的格式及含义(2) 理解字符串大小写转换问题,并掌握其实现方法(3) 掌握内存的寻址方式,并会灵活应用教学重点及难点:逻辑运算指令的格式及应用,内存的寻址方式教学方法:讲授、示例、练习教学过程:1、引言前面,我们用0、bx的方法,在访问内存的指令中,定位内存单元的地址。在这一章中,我们主要讲解一些更灵活的定位内存地址的方法和相关的编程方法。2、教学内容7.1 and和or指令(1)and 指令:逻辑及指令,按位进行及运算。 通过该指令可将操作对象的相应位设为0,其他位不变。(2)or 指令:逻辑或指令,按位进行或运算。 通过该
32、指令可将操作对象的相应位设为1,其他位不变。7.2 关于ASCII码世界上有很多编码方案,有种方案叫做ASCII编码,是在计算机系统中通常被采用的。简单地说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。比如说,在ASCII编码方案中,用 61H 表示“a”,62H表示“b”。7.3 以字符形式给出的数据在汇编程序中,用一对单引号括起的内容作为字符处理。编译器将把它们转化为相对应的ASCII码。7.4 大小写转换的问题首先分析一下,我们知道同一个字母的大写字符和小写字符对应的 ASCII 码是不同的,比如 “A” 的 ASCII 码是41H,“a”的ASCII码是61H。要
33、改变一个字母的大小写,实际上就是要改变它所对应的ASCII 码。 举例说明7.5 bx+idata在前面,我们可以用bx的方式来指明一个内存单元, 我们还可以用一种更为灵活的方式来指明内存单元: bx+idata:表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)。注意:用bx+idata的方式亦可进行数组的处理7.7 SI和DIsi源变址寄存器di目的变址寄存器si和di只能用作16位寄存器,常用于对内存单元的寻址,功能及bx寄存器相近。7.8 bx+si和bx+di在前面,我们用bx(si或di)bx(si或di)+idata 的方式来指明一个内存单元,我们
34、还可以用更灵活的方式:bx+sibx+dibx+si和bx+di的含义相似,我们以bx+si为例进行讲解。bx+si表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值),段地址在ds中。mov ax,bx+si 指令也可写成格式:mov ax,bxsi 7.9 bx+si+idata和bx+di+idatabx+si+idata和bx+di+idata的含义相似,我们以bx+si+idata为例进行讲解。bx+si+idata表示一个内存单元它的偏移地址为(bx)+(si)+idata。 (即bx中的数值加上si中的数值再加上idata) (段地址在ds中)注意
35、指令mov ax,bx+si+idata的其他表示方式7.10 不同的寻址方式的灵活应用idata 用一个常量来表示地址,可用于直接定位一个内存单元。例:1000hbx 用一个变量来表示内存地址,可用于间接定位一个内存单元。bx+idata 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元。bx+si 用两个变量表示地址。bx+si+idata 用两个变量和一个常量表示地址。 从idata一直到bx+si+idata,我们可以用更加灵活的方式来定位一个内存单元的地址。 这使我们可以从更加结构化的角度来看待所要处理的数据。举例说明。作业:汇编语言程序设计 教 案编号:
36、8第八章 数据处理的两个基本问题教学目的:(1) 理解数据处理的基本问题一:指令要处理的数据在什么地方(2) 理解数据处理的基本问题二:指令要处理的数据长度是多少(3) 掌握汇编指令div,伪指令dd,操作符dup的格式及应用教学重点及难点:在理解数据处理的两个基本问题的基础上,掌握寻址方式的灵活应用教学方法:讲授、示例、练习教学过程:1、引言两个问题:(1)处理的数据在什么地方?(2)要处理的数据有多长?reg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di;sreg的集合包括:ds、ss、cs、es。8.1 bx、si、di、bpl
37、 在8086CPU中,只能使用这4个寄存器寻址内存单元。l 在 中,这4个寄存器可以单个出现,或只能以下列组合出现:bx和si、di ; bp和si、di ;l 只要在 中使用寄存器bp,段地址就默认在ss中。8.2 机器指令处理的数据所在位置数据处理的方式:读、写、运算数据所在位置:CPU内部、内存、端口8.3 汇编语言中数据位置的表达立即数要处理的数据直接包含在指令中寄存器要处理的数据在指令中的寄存器中段地址(SA):偏移地址(EA)要处理的数据在内存中8.4 寻址方式当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。直接寻
38、址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,基址变址相对寻址。8.5 指令要处理的数据有多长?8086CPU可以处理的数据长度:8位byte字节型数据16位word字数据汇编语言中的处理方法:l 通过寄存器指明要处理的数据长度;l 在没有寄存器的情况下用word ptr/byte ptr指明数据长度 l 其他方法(默认长度) :push8.6 寻址方式的综合应用任务:编程修改内存中的过时数据。一般来说,我们可以用bx+idata+si的方式来访问结构体中的数据。用bx定位整个结构体,用idata定位结构体中的某一个数据项,用 si 定位数组项中的每个元素 。为此,汇编语言提供了更为贴切的
39、书写方式。如:bx.idata、bx.idatasi。8.7 div 除法指令格式: div op(内存单元、寄存器)说明:div指令示例div byte ptr ds:0 含义为:(al)=(ax)/(ds)*16+0)的商; (ah)=(ax)/(ds)*16+0)的余数div word ptr es:0 含义为:(ax)=(dx)*10000H+(ax)/(ds)*16+0)的商;(dx)=(dx)*10000H+(ax)/(ds)*16+0)的余数编程: 利用除法指令计算100001/100。利用除法指令计算1001/100。8.8 伪指令 dd前面我们用db和dw定义字节型数据和字型
40、数据。dd是用来定义dword (double word双字)型数据的。8.9 dupdup是一个操作符,在汇编语言中同db、dw、dd 等一样,也是由编译器识别处理的符号。它是和db、dw、dd 等数据定义伪指令配合使用的,用来进行数据的重复。dup的使用格式如下:db 重复的次数 dup (重复的字节型数据)dw 重复的次数 dup (重复的字型数据)dd 重复的次数 dup (重复的双字数据)作业:汇编语言程序设计 教 案编号:9第九章 转移指令的原理教学目的:(1) 理解汇编语言的分支结构(2) 掌握无条件转移指令jmp的格式、分类、原理及其应用(3) 掌握有条件转移指令jcxz的格式
41、、原理及应用教学重点及难点:无条件转移指令jmp的格式、分类及其应用教学方法:讲授、示例、练习教学过程:1、引言:转移指令就是可以控制CPU执行指令顺序的指令(即可以修改IP,或者同时修改CS和IP的指令)。8086CPU的转移行为分为:段内转移只修改IP的值。短转移:IP的变化范围为-128+127近转移:IP的变化范围为-32768+32767段间转移同时修改CS和IP的值。8086CPU的转移指令分为以下几类:无条件转移指令 (如:jmp),条件转移指令,循环指令(如:loop),过程,中断9.1 操作符offset操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的
42、偏移地址。9.2 jmp指令jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP;jmp指令要给出两种信息:转移的目的地址(直接转移、间接转移)转移的距离(段内短转移,段内近转移、段间转移 )1、段内转移段内转移又可分为下面三种形式:段内直接短转移,段内直接近转移,段内间接转移2、段间转移段间转移又可分为下面二种形式:段间直接转移,段间间接转移 9.3 依据位移进行转移的jmp指令l jmp short 标号(转到标号处执行指令)注意:在“jmp short 标号”指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移。这个位移,使编译器根据汇编指令中的“标号”计算出来的。
43、指令“jmp short 标号”的功能为(IP)=(IP)+8位位移。(1)8位位移=“标号”处的地址-jmp指令后的第一个字节的地址;(2)short指明此处的位移为8位位移;(3)8位位移的范围为-128127,用补码表示。(4)8位位移由编译程序在编译时算出。l jmp near ptr 标号它实现的是段内近转移。指令“jmp near ptr 标号”的功能为:(IP)=(IP)+16位位移。指令“jmp near ptr 标号”的说明:(1)16位位移=“标号”处的地址-jmp指令后的第一个字节的地址;(2)near ptr指明此处的位移为16位位移,进行的是段内近转移;(3)16位位
44、移的范围为 -3276932767,用补码表示;(4)16位位移由编译程序在编译时算出。9.4 转移的目的地址在指令中的jmp指令l 指令 “jmp far ptr 标号”: 实现的是段间转移,又称为远转移。指令 “jmp far ptr 标号” 功能如下:(CS)=标号所在段的段地址;(IP)=标号所在段中的偏移地址。far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。9.5 转移地址在寄存器中的jmp指令指令格式:jmp 16位寄存器功能:IP =(16位寄存器)9.6 转移地址在内存中的jmp指令转移地址在内存中的jmp指令有两种格式:(1) jmp word ptr 内存单
45、元地址(段内转移) 功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。 内存单元地址可用寻址方式的任一格式给出。(2) jmp dword ptr 内存单元地址(段间转移) 功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。(CS)=(内存单元地址+2)(IP)=(内存单元地址) 9.7 jcxz指令有条件转移指令指令格式:jcxz 标号 功能:如果(cx)=0,则转移到标号处执行。注意:所有的有条件转移都是段内短转移,在对应的机器码中包含转移的位移,对IP的修改范围都为-128127。jcxz 标号 指令操作:当(cx)=0时,
46、(IP)=(IP)+8位位移)8位位移=“标号”处的地址-jcxz指令后的第一个字节的地址;8位位移的范围为-128127,用补码表示;8位位移由编译程序在编译时算出。当(cx)=0时,什么也不做(程序向下执行)。9.8 loop指令循环指令指令格式:loop 标号功能:(cx)=(cx)-1,如果(cx)0,转移到标号处执行。注意:所有的循环指令都是段内短转移,在对应的机器码中包含转移的位移,对IP的修改范围都为-128127。loop 标号 指令操作:(1)(cx)=(cx)-1;(2)如果(cx)0,(IP)=(IP)+8位位移。8位位移=“标号”处的地址-loop指令后的第一个字节的地
47、址;8位位移的范围为-128127,用补码表示;8位位移由编译程序在编译时算出。当(cx)=0,什么也不做(程序向下执行)。9.9 根据位移进行转移的意义前面我们讲到: jmp short 标号 jmp near ptr 标号 jcxz 标号 loop 标号 等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移。这样设计,方便了程序段在内存中的浮动装配。9.10 编译器对转移位移超界的检测注意,根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在
48、编译的时候,编译器将报错。作业:汇编语言程序设计 教 案编号:10第十章 CALL和RET指令教学目的:(1) 理解汇编语言的子程序结构及模块化程序设计思想(2) 掌握转移指令call的格式、分类、原理及其应用(3) 掌握转移指令call和ret的配合使用以实现子程序的机制(4) 掌握运算指令mul的格式及应用教学重点及难点:call指令的分类及原理,子程序结构中的参数和结果传递问题教学方法:讲授、示例、练习教学过程:1、引言call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现自程序的设计。2、教学内容10.1 ret 和 retf 返回指令ret指
49、令用栈中的数据,修改IP的内容,从而实现近转移;操作:相当于pop ipretf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;操作:相当于pop ippop cs10.2 call 指令CPU执行call指令,进行两步操作:(1)将当前的 IP 或 CS和IP 压入栈中; push ip或push cs、push ip;(2)转移。 修改当前ip或ip和cs指向目的地址。 call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同,下面的几个小节中 ,我们以给出转移目的地址的不同方法为主线,讲解call指令的主要应用格式:根据位移转移、转移的目的地址
50、在指令中、转移地址在寄存器中、转移地址在内存中。10.3 依据位移进行转移的call指令格式:call 标号功能:将当前IP压栈,IP=IP+16位的位移量,转移到标号处执行,实现近转移。相当于: push ipjmp near ptr 标号10.4 转移的目的地址在指令中的call指令格式: call far ptr 标号功能: 将当前CS、IP压栈,用标号所在地址修改CS和IP实现远转移(段间转移)。相当于: push cs push ip jmp far ptr 标号10.5 转移地址在寄存器中的call指令格式: call reg(16位的寄存器)功能: 将当前IP压栈,用寄存器中的值
51、修改IP实现近转移。相当于: push ipjmp 16位reg10.6 转移地址在内存中的call指令转移地址在内存中的call指令有两种格式:(1) call word ptr 内存单元地址功能: 将当前IP压栈,用内存单元中的字修改IP。汇编语法解释: push ip jmp word ptr 内存单元地址(2) call dword ptr 内存单元地址功能: 将当前IP、CS压栈,用内存单元中双字修改IP和CS。汇编语法解释: push cspush ip jmp dword ptr 内存单元地址10.7 call 和 ret 的配合使用前面,我们已经分别学习了 ret 和call指
52、令的原理。现在我们看一下,如何将它们配合使用来实现子程序的机制。举例说明。10.8 mul 指令乘法指令格式:mul reg mul 内存单元功能:字节(8位)或字(16位)的无符号相乘 说明:两个相乘的数位数相同,8位乘法(乘数和被乘数都为8位数);16位乘法(乘数和被乘数都为16位。)8位乘法中,一个乘数默认在AL中,另一个由指令给出,16位的结果默认保存在AX中。16位乘法中,一个乘数默认在AX中,另一个由指令给出,32位的结果中高位保存在DX中,低位在AX中。10.9 模块化程序设计在实际编程中,程序的模块化是必不可少的。因为现实的问题比较复杂,对现实问题进行分析时,把它转化成为相互联
53、系、不同层次的子问题,是必须的解决方法。从上面我们看到 ,call 及 ret 指令共同支持了汇编语言编程中的模块化设计。可使用call指令在主程序中调用子程序来解决子问题,子问题解决后用ret指令来返回主程序。10.10 参数和结果传递的问题子程序一般都要根据提供的参数处理一定的事务,处理后,将结果(返回值)提供给调用者。我们讨论参数和返回值传递的问题,实际上就是在探讨,应该如何存储子程序需要的参数和产生的返回值。 举例说明用寄存器来存储参数和结果是最常使用的方法。对于存放参数的寄存器和存放结果的寄存器,调用者和子程序的读写操作恰恰相反:调用者将参数送入参数寄存器(写),从结果寄存器中取到返回值(读);子程序从参数寄存器中取到参数(读),将返回值送入结果寄存器(写)。 10.11 批量数据的传递前面的例程中,子程序 cube 只有一个参数,放在bx中。如果有两个参数,那么可以用两个寄存器来放,可是如果需要传递的数据有3个、4个或更多直至 N个,我们怎样存放呢?寄存器的数量终究有限,我们不可能简单地用寄存器来存放多个需要传递的数据。对于返回值,也有同样的问题。在这种时候,我们将批量数据放到内存中,然
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 印刷帮消防火灾应急预案(3篇)
- 技术员信息处理考试的试题与答案的复盘
- 2025年网络全景知识试题及答案
- 网络管理员考试重点话题试题及答案
- 2025详解合同购买合同应当关注的法律问题
- 项目沟通与协调技巧试题及答案
- 增强自我反思能力的修炼计划
- VB语法基础试题及答案解析
- 行政管理考试的复习计划及试题及答案
- 2025软考网络优化策略试题及答案
- 乐山市市级事业单位选调工作人员考试真题2024
- 山东省济南市2025届高三三模生物试卷(含答案)
- 火力发电厂安全培训课件
- 宁波水产笔试题目及答案
- 中学金融知识讲座课件
- 2025凉山州继续教育公需科目满分答案-数字时代的心理健康
- 浙江百顺服装有限公司年产100万套服装及135万套床上用品生产线项目环境影响报告
- 玻璃维修安装合同协议
- 2024年中石油招聘考试真题
- 《抽水蓄能电站枢纽布置格局比选专题报告编制规程 》征求意见稿
- 校园景观园林绿化植物配置设计
评论
0/150
提交评论