《汇编语言程序设计》教案.pdf
欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!1 汇编语言程序设计 教 案 编 号:1 第一章 基础知识 教学目的:(1)了解机器语言 (2)理解汇编语言的涵义(3)理解 8086CPU 硬件系统结构 教学重点及难点:汇编语言的涵义,CPU 对存储器的读写原理,内存地址空间的分配 教学方法:讲授、示例、练习 教学过程:1.提出三个问题 什么是汇编语言 为什么学汇编语言 如何学习汇编语言 2.介绍本书内容结构及特点 3.教学内容 引言 汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。1.1 机器语言 机器语言是机器指令的集合。阐述机器语言的原理,发展及弊端。1.2 汇编语言的产生 汇编语言的主体是汇编指令。汇编指令是机器指令的助记符(两者一一对应)。1.3 汇编语言的组成 汇编语言由以下 3 类组成:1、汇编指令(机器码的助记符)2、伪指令 (由编译器执行)3、其它符号(由编译器识别)汇编语言的核心是汇编指令,它决定了汇编语言的特性。1.4 存储器 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!2 CPU 是计算机的核心部件 它控制整个计算机的运作并进行运算,要想让一个 CPU 工作,就必须向它提供指令和数据。指令和数据在存储器中存放,也就是平时所说的内存。1.5 指令和数据 指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。1.6 存储单元 存储器被划分为若干个存储单元,每个存储单元从 0 开始顺序编号;例如:一个存储器有 128 个存储单元,编号从 0127。存储器的计量单位 B、KB、MB、GB、TB 1.7 CPU 对存储器的读写 CPU 要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行三类信息的交互:存储单元的地址(地址信息)地址总线 器件的选择,读或写命令(控制信息)数据总线 读或写的数据(数据信息)数据总线 CPU 在内存中读或写的数据演示:读演示、写演示 机器码:101000000000001100000000 对应的汇编指令:MOV AX,3 含义:传送 3 号单元的内容到 AX 1.8 地址总线 CPU 是通过地址总线来指定存储单元的。一个 CPU 有 N 根地址总线,则可以说这个 CPU 的地址总线的宽度为 N。这样的 CPU 最多可以寻找的 N 次方个内存单元。1.9 数据总线 CPU 与内存或其它器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了 CPU 和外界的数据传送速度。1.10 控制总线 CPU 对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着 CPU 提供了对外部器件的多少种控制。所以,控制总线的宽度决定了 CPU 对外部器件的控制能力。1.11 内存地址空间(概述)什么是内存地址空间 不同的计算机系统的内存地址空间分配情况是不同的。讲解 8086PC 机内存地址空间分配的基本情况 作业:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!3 汇编语言程序设计 教 案 编 号:2 第二章 寄存器 教学目的:(1)理解通用寄存器的逻辑结构及其存储原理(2)理解物理地址、段地址及偏移地址的本质含义(3)理解 8086CPU 读取执行指令的工作原理,及代码段寄存器 CS 和指令指针寄存器 IP的含义,并掌握其使用方法 教学重点及难点:8086CPU 读取执行指令的工作原理,及代码段寄存器 CS 和指令指针寄存器 IP 的使用方法 教学方法:讲授、示例、练习 教学过程:1.CPU 概述 一个典型的 CPU 由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。内部总线实现 CPU 内部各个器件之间的联系。外部总线实现 CPU 和主板上其它器件的联系。2.寄存器概述 8086CPU 有 14 个寄存器 它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。3.教学内容 2.1 通用寄存器 8086CPU 所有的寄存器都是 16 位的,可以存放两个字节。AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。讲解寄存器的逻辑结构。为保证兼容性,这四个寄存器都可以分为两个独立的 8 位寄存器使用。2.2 字在寄存器中的存储 一个字可以存在一个 16 位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高 8 位寄存器和低 8 位寄存器中。2.3 几条汇编指令 汇编指令不区分大小写 注意:在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!4 2.4 物理地址 CPU 访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。2.5 16 位结构的 CPU 概括的讲,16 位结构描述了一个 CPU 具有以下几个方面特征:1、运算器一次最多可以处理 16 位的数据。2、寄存器的最大宽度为 16 位。3、寄存器和运算器之间的通路是 16 位的。2.6 8086CPU 给出物理地址的方法 8086CPU 采用一种在内部用两个 16 位地址合成的方法来形成一个 20 位的物理地址。地址加法器合成物理地址的方法:物理地址=段地址16+偏移地址 2.7“段地址16+偏移地址=物理地址”的本质含义 用两个比喻说明 2.8 段的概念 错误认识:内存被划分成了一个一个的段,每一个段有一个段地址。其实:内存并没有分段,段的划分来自于 CPU,由于 8086CPU 用“(段地址16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。两点需要注意(1)段地址16 必然是 16 的倍数,所以一个段的起始地址也一定是 16 的倍数;(2)偏移地址为 16 位,16 位地址的寻址能力为 64K,所以一个段的长度最大为 64K。结论:CPU 可以用不同的段地址和偏移地址形成同一个物理地址。2.9 节2.12 节 1、段地址在 8086CPU 的寄存器中存放。当 8086CPU 要访问内存时,由段寄存器提供内存单元的段地址。8086CPU 有 4 个段寄存器,其中 CS 用来存放指令的段地址。2、CS 存放指令的段地址,IP 存放指令的偏移地址。8086 机中,任意时刻,CPU 将 CS:IP 指向的内容当作指令执行。3、8086CPU 的工作过程:(1)从 CS:IP 指向内存单元读取指令,读取的指令进入指令缓冲器;(2)IP 指向下一条指令;(3)执行指令。(转到步骤(1),重复这个过程。)4、8086CPU 提供转移指令修改 CS、IP 的内容。作业:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!5 汇编语言程序设计 教 案 编 号:3 第三章 寄存器(内存访问)教学目的:(1)掌握汇编指令访问内存的方法(2)理解汇编指令 mov、add、sub 的格式及含义,并掌握其使用方法(3)理解 CPU 的堆栈机制,掌握汇编指令 push、pop 的含义及其使用方法(4)理解数据段、代码段、栈段的内涵 教学重点及难点:汇编指令访问内存的方法,汇编指令格式,及堆栈机制 教学方法:讲授、示例、练习 教学过程:1.引言 在第 2 章中,我们主要从 CPU 如何执行指令的角度讲解了 8086CPU 的逻辑结构、形成物理地址的方法、相关的寄存器以及一些指令。这一章中,我们从访问内存的角度继续学习几个寄存器。2.教学内容 3.1 内存中字的存储 结论:任何两个地址连续的内存单元,N 号单元和 N+1 号单元,可以将它们看成两个内存单元,也可以看成一个地址为 N 的字单元中的高位字节单元和低位字节单元。3.2 DS 和address CPU 要读取一个内存单元的时候,必须先给出这个内存单元的地址;在 8086PC 中,内存地址由段地址和偏移地址组成。8086CPU 中有一个 DS 寄存器,通常用来存放要访问的数据的段地址。问题:如何用 mov 指令从 10000H 中读取数据?结论:mov bx,1000H mov ds,bx mov al,0 注意:8086CPU 不支持将数据直接送入段寄存器的操作,ds 是一个段寄存器。(硬件设计的问题)mov ds,1000H 是非法的。3.3 字的传送 因为 8086CPU 是 16 位结构,有 16 根数据线,所以,可以一次性传送 16 位的数据,也就是一次性传送一个字。欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!6 3.4 mov、add、sub 指令 已学 mov 指令的几种形式:mov 寄存器,数据 mov 寄存器,寄存器 mov 寄存器,内存单元 mov 内存单元,寄存器 mov 段寄存器,寄存器 根据已知指令进行推测:mov 段寄存器,寄存器 mov 寄存器,段寄存器(验证)mov 内存单元,寄存器 mov 内存单元,段寄存器 mov 段寄存器,内存单元 注意:add 和 sub 指令同 mov 一样,都有两个操作对象。3.5 数据段 定义:将一组长度为 N(N64K)、地址连续、起始地址为 16 的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。访问数据段中的数据:用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。示例 3.6 栈 栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。栈有两个基本的操作:入栈和出栈。入栈:将一个新的元素放到栈顶;出栈:从栈顶取出一个元素。栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。栈的操作规则:LIFO(Last In First Out,后进先出)3.7 CPU 提供的栈机制 8086CPU 提供入栈和出栈指令:(最基本的)PUSH(入栈)POP (出栈)push ax:将寄存器 ax 中的数据送入栈中;pop ax:从栈顶取出数据送入 ax。注意:8086CPU 的入栈和出栈操作都是以字为单位进行的。push 指令的执行过程:push ax 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!7(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 指令出栈,都将发生栈顶超界问题。栈顶超界是危险的。我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。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 的倍数的内存单元,当作栈来用,从而定义了一个栈段。访问:如何使用如 push、pop 等栈操作指令访问我们定义的栈段呢?将 SS:SP 指向我们定义的栈段。3、段的综述 我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们自己的安排。我们可以用一个段存放数据,将它定义为“数据段”;我们可以用一个段存放代码,将它定义为“代码段”;我们可以用一个段当作栈,将它定义为“栈段”;一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。关键在于 CPU 中寄存器的设置,即:CS、IP、SS、SP、DS 的指向。作业:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!8 汇编语言程序设计 教 案 编 号:4 第四章 第一个程序 教学目的:(1)掌握源程序书写格式(2)理解一个源程序从写出到执行的过程(3)掌握程序的执行过程及其跟踪方法 教学重点及难点:汇编语言源程序的书写格式,执行过程及跟踪方法 教学方法:讲授、示例、练习 教学过程:4.1 一个源程序从写出到执行的过程 编写源程序编译链接执行 注意:解释可执行文件 4.2 源程序 汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终为 CPU 所执行。1.伪指令 没有对应的机器码的指令,最终不被 CPU 所执行。3 种伪指令(1)段定义伪指令 segment 和 ends(2)汇编结束伪指令 END(3)ASSUME 段分配伪指令 2.标号:一个标号指代了一个地址。(代表某一存储单元地址的名字)字母:AZ 数字:09 特殊字符:?._$codesg:放在 segment 的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。start:放在某个指令前,作为程序的入口,程序加载到内存后,CS:IP 会指向这个标号,从 start 指向的指令开始运行。3.源程序中的“程序”汇编源程序:伪指令(编译器处理)、汇编指令(编译为机器码)程序:源程序中最终由计算机执行、处理的指令或数据。4.汇编语言源程序的结构 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!9 一般来说,一个完整的汇编源程序应由三个程序段组成,即代码段、数据段和堆栈段,每个段都以 SEGMENT 开始,以 ENDS 结束,代码段包含程序要执行的指令;堆栈段用来在内存中建立一个堆栈区;数据段用来在内存中建立一个适当容量的工作区,以存放程序中所需的数据。注意:一个源程序中,代码段是必须的,而数据段和堆栈段可以没有或有其中一个。段定义时一般最后定义代码段。5.程序返回 我们的程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,那么,它怎样得到运行呢?(讨论)现在,我们知道,一个程序结束后,将 CPU 的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。应该在程序的末尾添加返回的程序段。mov ax,4c00H int 21H 注意:几个和结束相关的内容:段结束、程序结束、程序返回 6.语法错误和逻辑错误 语法错误:程序在编译时被编译器发现的错误;容易发现。逻辑错误:程序在编译时不能表现出来的、在运行时发生的错误;不容易发现。4.3.编辑源程序 使用工具:可使用各种文本编辑工具(记事本、写字板、WORD 等),我们使用 notepad+文本编辑器。功能:产生一个存储源程序的文本文件。使用方法:输入汇编源程序并保存为.asm 文件。4.4 对源程序进行编译 使用工具:使用 MASM6.15 编译器 功能:使用编译器对源程序文件进行编译,生成包含机器代码的目标文件(.obj)。使用方法:在 dos 下运行 masm.exe 程序 对源程序的编译结束,编译器输出的最后两行告诉我们这个源程序有没有警告错误和必须要改正的错误。4.5 对目标文件进行连接 使用工具:使用 LINK.EXE 连接器 功能:对目标文件(.obj)进行连接,从而得到一个可执行文件.EXE。使用方法:在 DOS 下运行 link.exe 程序:注意讲解连接的作用 4.6 以简化的方式进行编译和连接 用一种较为简捷的方式进行编译、连接。欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!10 C:MASM masm XXX;C:MASM link XXX;C:MASM ml XXX.asm;4.7 1.exe 的执行 提问:程序到底运行没有?程序运行了,只是从屏幕上不可能看到任何运行结果。我们的程序没有像显示器输出任何信息。程序只是做了一些将数据送入寄存器和加法的操作,而这些事情,我们不可能从显示屏上看出来。程序执行完成后,返回,屏幕上再次出现操作系统的提示符。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(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:debug xxx.exe(后缀不能省略)作业:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!11 汇编语言程序设计 教 案 编 号:5 第五章 bx和 loop 指令 教学目的:(1)理解汇编语言的循环结构(2)掌握bx和 loop 联合使用访问内存实现循环结构的方法(3)掌握汇编指令 loop 的格式,理解其工作原理(4)掌握段前缀的使用 教学重点及难点:bx和 loop 联合使用实现循环结构,及 loop 指令的工作原理 教学方法:讲授、示例、练习 教学过程:1、几个概念 1.bx和内存单元的描述 2.loop:英文单词“loop”有循环的含义,显然这个指令和循环有关。3.描述性符号“()”:为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号“()”来表示一个寄存器或一个内存单元中的内容。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 中的值,不为零则转至标号处执行程序,如果为零则向下执行。欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!12 注意:loop 循环中用 CX 作计数器控制程序的循环次数。补充:通用寄存器:AX:Accumulator 累加器 常用于存放算术逻辑运算中的操作数 BX:Base register 基址寄存器 常用来存放访问内存时的基址(段地址)CX:Count register 计数器 在循环和串操作指令中用作计数器 DX:Data register 一般数据寄存器 在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放 I/O 的端口地址。5.3 在 Debug 中跟踪用 loop 指令实现的循环程序 示例:计算 ffff:0006 单元中的数乘以 3,结果存储在 dx 中。分析:(1)运算后的结果是否会超出 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 模式中,随意向一段内存空间写入内容是很危险的,因为这段空间中可能存放着重要的系统数据或代码。汇编语言程序直接面向机器,如果我们要向内存空间写入数据时,要保证所写入的内存中没有重要的数据,否则会影响系统的正常运行,在一般的 PC 机中都不使用0:2000:2ff(00200h002ffh)这段 256 个字节内存空间,所以我们可以放心使用这段安全的空间。5.8 段前缀的使用 将内存 ffff:0ffff:b 段元中的数据拷贝到 0:2000:20b 单元中。作业:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!13 汇编语言程序设计 教 案 编 号:6 第六章 包含多个段的程序 教学目的:(1)理解在代码段中使用数据的原理及不便之处(2)理解在代码段中使用栈的原理及不便之处(3)掌握将数据、代码、栈放入不同的段的应用 教学重点及难点:将数据、代码、栈放入不同的段的应用 教学方法:讲授、示例、练习 教学过程:1、引言 前面我们写的程序中,只有一个代码段。现在有一个问题是:如果程序需要用其他空间来存放数据,我们使用哪里呢?我们将以这样的顺序来深入地讨论多个段的问题:(1)在一个段中存放数据、代码、栈,我们先来体会一下不使用多个段时的情况;(2)将数据、代码、栈放入不同的段中。6.1 在代码段中使用数据(将数据定义在代码段中)示例:编程计算以下 8 个数据的和,结果存在 ax 寄存器中:0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。6.3 将数据、代码、栈放入不同的段 在前面的内容中,我们在程序中用到了数据和栈,我们将数据、栈和代码都放到了一个段里面。我们在编程的时候要注意何处是数据,何处是栈,何处是代码。这样做显然有两个问题:(1)把它们放到一个段中使程序显得混乱;(2)前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题。但如果数据、栈和代码需要的空间超过 64KB,就不能放在一个段中(一个段的容量不能大于 64 KB,是我们在学习中所用的 8086 模式的限制,并不是所有的处理器都这样)。所以,我们应该考虑用多个段来存放数据、代码和栈。作业:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!14 汇编语言程序设计 教 案 编 号:7 第七章 更灵活的定位内存地址的方法 教学目的:(1)掌握汇编逻辑运算指令 and 和 or 的格式及含义(2)理解字符串大小写转换问题,并掌握其实现方法(3)掌握内存的寻址方式,并会灵活应用 教学重点及难点:逻辑运算指令的格式及应用,内存的寻址方式 教学方法:讲授、示例、练习 教学过程:1、引言 前面,我们用0、bx的方法,在访问内存的指令中,定位内存单元的地址。在这一章中,我们主要讲解一些更灵活的定位内存地址的方法和相关的编程方法。2、教学内容 7.1 and 和 or 指令(1)and 指令:逻辑与指令,按位进行与运算。通过该指令可将操作对象的相应位设为 0,其他位不变。(2)or 指令:逻辑或指令,按位进行或运算。通过该指令可将操作对象的相应位设为 1,其他位不变。7.2 关于 ASCII 码 世界上有很多编码方案,有种方案叫做 ASCII 编码,是在计算机系统中通常被采用的。简单地说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。比如说,在 ASCII 编码方案中,用 61H 表示“a”,62H 表示“b”。7.3 以字符形式给出的数据 在汇编程序中,用一对单引号括起的内容作为字符处理。编译器将把它们转化为相对应的 ASCII 码。7.4 大小写转换的问题 首先分析一下,我们知道同一个字母的大写字符和小写字符对应的 ASCII 码是不同的,比如“A”的 ASCII 码是 41H,“a”的 ASCII 码是 61H。要改变一个字母的大小写,实际上就是要改变它所对应的 ASCII 码。举例说明 7.5 bx+idata 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!15 在前面,我们可以用bx的方式来指明一个内存单元,我们还可以用一种更为灵活的方式来指明内存单元:bx+idata:表示一个内存单元,它的偏移地址为(bx)+idata(bx 中的数值加上 idata)。注意:用bx+idata的方式亦可进行数组的处理 7.7 SI 和 DI si 源变址寄存器 di 目的变址寄存器 si 和 di 只能用作 16 位寄存器,常用于对内存单元的寻址,功能与 bx 寄存器相近。7.8 bx+si和bx+di 在前面,我们用 bx(si 或 di)bx(si 或 di)+idata 的方式来指明一个内存单元,我们还可以用更灵活的方式:bx+si bx+di bx+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+idata bx+si+idata和bx+di+idata的含义相似,我们以bx+si+idata为例进行讲解。bx+si+idata表示一个内存单元 它的偏移地址为(bx)+(si)+idata。(即 bx 中的数值加上 si 中的数值再加上 idata)(段地址在 ds 中)注意指令 mov ax,bx+si+idata的其他表示方式 7.10 不同的寻址方式的灵活应用 idata 用一个常量来表示地址,可用于直接定位一个内存单元。例:1000h bx 用一个变量来表示内存地址,可用于间接定位一个内存单元。bx+idata 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元。bx+si 用两个变量表示地址。bx+si+idata 用两个变量和一个常量表示地址。从idata一直到bx+si+idata,我们可以用更加灵活的方式来定位一个内存单元的地址。这使我们可以从更加结构化的角度来看待所要处理的数据。举例说明。作业:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!16 汇编语言程序设计 教 案 编 号: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、bp 在 8086CPU 中,只能使用这 4 个寄存器寻址内存单元。在 中,这 4 个寄存器可以单个出现,或只能以下列组合出现:bx 和 si、di;bp和 si、di;只要在 中使用寄存器 bp,段地址就默认在 ss 中。8.2 机器指令处理的数据所在位置 数据处理的方式:读、写、运算 数据所在位置:CPU 内部、内存、端口 8.3 汇编语言中数据位置的表达 立即数 要处理的数据直接包含在指令中 寄存器 要处理的数据在指令中的寄存器中 段地址(SA):偏移地址(EA)要处理的数据在内存中 8.4 寻址方式 当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,基址变址相对寻址。欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!17 8.5 指令要处理的数据有多长?8086CPU 可以处理的数据长度:8 位 byte 字节型数据 16 位 word 字数据 汇编语言中的处理方法:通过寄存器指明要处理的数据长度;在没有寄存器的情况下用 word ptr/byte ptr 指明数据长度 其他方法(默认长度):push 8.6 寻址方式的综合应用 任务:编程修改内存中的过时数据。一般来说,我们可以用bx+idata+si的方式来访问结构体中的数据。用 bx 定位整个结构体,用 idata 定位结构体中的某一个数据项,用 si 定位数组项中的每个元素。为此,汇编语言提供了更为贴切的书写方式。如: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 定义字节型数据和字型数据。dd 是用来定义 dword(double word双字)型数据的。8.9 dup dup 是一个操作符,在汇编语言中同 db、dw、dd 等一样,也是由编译器识别处理的符号。它是和 db、dw、dd 等数据定义伪指令配合使用的,用来进行数据的重复。dup 的使用格式如下:db 重复的次数 dup(重复的字节型数据)dw 重复的次数 dup(重复的字型数据)dd 重复的次数 dup(重复的双字数据)作业:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!18 汇编语言程序设计 教 案 编 号:9 第九章 转移指令的原理 教学目的:(1)理解汇编语言的分支结构(2)掌握无条件转移指令 jmp 的格式、分类、原理及其应用(3)掌握有条件转移指令 jcxz 的格式、原理及应用 教学重点及难点:无条件转移指令 jmp 的格式、分类及其应用 教学方法:讲授、示例、练习 教学过程:1、引言:转移指令就是可以控制 CPU 执行指令顺序的指令(即可以修改 IP,或者同时修改 CS 和 IP的指令)。8086CPU 的转移行为分为:段内转移只修改 IP 的值。短转移:IP 的变化范围为-128+127 近转移:IP 的变化范围为-32768+32767 段间转移同时修改 CS 和 IP 的值。8086CPU 的转移指令分为以下几类:无条件转移指令(如:jmp),条件转移指令,循环指令(如:loop),过程,中断 9.1 操作符 offset 操作符 offset 在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。9.2 jmp 指令 jmp 为无条件转移,可以只修改 IP,也可以同时修改 CS 和 IP;jmp 指令要给出两种信息:转移的目的地址(直接转移、间接转移)转移的距离(段内短转移,段内近转移、段间转移)1、段内转移 段内转移又可分为下面三种形式:段内直接短转移,段内直接近转移,段内间接转移 2、段间转移 段间转移又可分为下面二种形式:段间直接转移,段间间接转移 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!19 9.3 依据位移进行转移的 jmp 指令 jmp short 标号(转到标号处执行指令)注意:在“jmp short 标号”指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移。这个位移,使编译器根据汇编指令中的“标号”计算出来的。指令“jmp short 标号”的功能为(IP)=(IP)+8 位位移。(1)8 位位移=“标号”处的地址-jmp 指令后的第一个字节的地址;(2)short 指明此处的位移为 8 位位移;(3)8 位位移的范围为-128127,用补码表示。(4)8 位位移由编译程序在编译时算出。jmp near ptr 标号 它实现的是段内近转移。指令“jmp near ptr 标号”的功能为:(IP)=(IP)+16 位位移。指令“jmp near ptr 标号”的说明:(1)16 位位移=“标号”处的地址-jmp 指令后的第一个字节的地址;(2)near ptr 指明此处的位移为 16 位位移,进行的是段内近转移;(3)16 位位移的范围为 -3276932767,用补码表示;(4)16 位位移由编译程序在编译时算出。9.4 转移的目的地址在指令中的 jmp 指令 指令“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 内存单元地址(段内转移)功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。内存单元地址可用寻址方式的任一格式给出。(2)jmp dword ptr 内存单元地址(段间转移)功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。(CS)=(内存单元地址+2)(IP)=(内存单元地址)欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!20 9.7 jcxz 指令有条件转移指令 指令格式:jcxz 标号 功能:如果(cx)=0,则转移到标号处执行。注意:所有的有条件转移都是段内短转移,在对应的机器码中包含转移的位移,对 IP的修改范围都为-128127。jcxz 标号 指令操作:当(cx)=0 时,(