汇编语言程序设计(刘慧婷 第3版)微课版 课件全套 第1-9章 汇编语言基础知识-宏汇编及其它高级伪操作_第1页
汇编语言程序设计(刘慧婷 第3版)微课版 课件全套 第1-9章 汇编语言基础知识-宏汇编及其它高级伪操作_第2页
汇编语言程序设计(刘慧婷 第3版)微课版 课件全套 第1-9章 汇编语言基础知识-宏汇编及其它高级伪操作_第3页
汇编语言程序设计(刘慧婷 第3版)微课版 课件全套 第1-9章 汇编语言基础知识-宏汇编及其它高级伪操作_第4页
汇编语言程序设计(刘慧婷 第3版)微课版 课件全套 第1-9章 汇编语言基础知识-宏汇编及其它高级伪操作_第5页
已阅读5页,还剩602页未读 继续免费阅读

下载本文档

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

文档简介

第一章汇编语言基础知识1.1汇编语言简介1.2计算机中数据的表示1.1汇编语言简介1.1.1机器语言与汇编语言1.1.2汇编语言的组成1.1.3为什么要学习汇编语言1.1.1机器语言与汇编语言机器指令:cpu能直接识别并遵照执行的指令,用二进制编码表示,由操作码,操作数组成,编码只含二进制0或1。机器语言:用二进制编码组成的机器指令的集合和一组使用机器指令的规则。汇编语言:对机器指令中的操作码用英文单词的缩写描述(助记符),对操作数用标号、变量、常量描述。

用汇编语言编写的程序称为汇编源程序。

但是,汇编语言源程序要翻译成机器语言程序才可以由计算机执行。这个翻译的过程称为“汇编”,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序。

1.1.2汇编语言的组成汇编语言有以下三类指令组成:汇编指令:机器码的助记符,有对应的机器码。它是汇编语言的核心。伪指令:没有对应的机器码,由编译器执行,计算机并不执行。其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码。

1.1.3为什么要学习汇编语言汇编语言程序是用符号指令写成的,本质上还是机器语言,与具体机机型的硬件密切相关,可以直接有效地控制计算机硬件,程序运行速度快,程序短小精悍,占用内存少,在某些特殊应用场合更能发挥作用。如:智能化仪表,家用电器,实时控制系统,单片机控制,病毒研究等。学习汇编语言是从根本上认识和理解计算机工作过程的最好方法。汇编程序与汇编源程序的区别是什么?汇编源程序是指用汇编语言编写的程序,而汇编程序特指将汇编源程序汇编成目标文件的编译程序。正确不正确AB提交单选题15分1.2计算机中数据的表示1.2.1不同进位计数制及其相互转换1.2.2二进制数和十六进制数的运算1.2.3带符号数的表示1.2.4补码的加法和减法1.2.5无符号数的表示1.2.6字符的表示1.2.7基本逻辑运算1.2.1不同进位计数制及其相互转换1.进位计数制对于任意一个进位计数制,如果用R表示基数,那么任何一个数S均可用如下多项式表示:

S=knRn+kn-1Rn-1+…+k0R0+k-1R-1+k-2R-2+…+k-mR-m

十进制数:423.5=4×10^2+2×10^1+3×10^0+5×10^-1

各位权值10^k

二进制数:101101(B)=1×2^5+1×2^3+1×2^2+1×2^0=45(D)

各位权值2^k

十六进制数:5F(H)=5×16^1+15×16^0(D)各位权值16^k

在书写不同进位计数制数时,常常在尾部用一个字母来表示该数是什么进位计数制的数。结尾用B(2进制数)、O(8进制数)、D(10进制数)、H(16进制数)。缺省为十进制数。例如712O、9198D、10010B、BE49H等等。

2.各种数制间的相互转换例如:13.8125D=

1101.1101B=D.DH

二进制数转换为十进制数方法:各位二进制数码乘以对应的权之和例:1.1N=101101.1B=1×2^5+1×2^3+1×2^2+1×2^0+1×2^-1=45.5D十六进制数转换为十进制数方法:各位十六进制数码乘以对应的权之和例:1.2

N=5FH=5×16^1+15×16^0=80+15=95D

十进制数转换为二进制数(1)降幂法:先写出小于此数的各位二进制权值,然后再求和。(适用于数值不大的数)例:1.3

求N=13.5D的二进制数。小于此数的各位二进制权值为:

84210.5

13.5D=8+4+1+0.5=1101.1B

100001000001+0.11101.1

十进制数转换为二进制数(2)除法:不断除以2,计下余数,直到商为0为止。(仅适用于整数部分)例:1.4求N=13D的二进制数。13/2=6余1(b0)6/2=3余0(b1)3/2=1余1(b2)1/2=0余1(b3)13D=b3b2b1b0=1101B对于十进制数的小数部分除了可以使用降幂法也可采用乘法,即不断乘2,并计下整数,而小数部分再乘2,直到结果为0为止。并非所有的十进制小数都能用二进制完全表示,可按需要取一定精度即可。例:1.5求N=0.625D的二进制数。0.625×2=1.25(b-1=1)0.25×2=0.5(b-2=0)0.5×2=1.0(b-3=1)N=0.625D=b-1b-2b-3=0.101B

十进制数转换为十六进制数(1)降幂法:先写出小于此数的各位十六进制权值,然后再求和。(适用于数值不大的数)例:1.6求N=95D的十六进制数。小于此数的各位十六进制权值为:161显然应选16×5,再选1×F,所以N=95D=80+15=16×5+1×F=5FH

十进制数转换为十六进制数(2)除法:不断除以16,计下余数,直到商为0为止。(仅适用于整数部分)例:1.7求N=95D的十六进制数。95/16=5余15(h0)5/16=0余5(h1)N=95D=h1h0=5FH

对于十进制数的小数部分除了可以使用降幂法也可采用乘法,即不断乘16,并计下整数,而小数部分再乘16,直到结果为0为止。并非所有的十进制小数都能用十六进制完全表示,可按需要取一定精度即可。

二进制数和十六进制数的相互转换直接转换,每四位一组,整数从低位开始,小数从高位开始,不足位补0。例:1.8N=1011111.11(B)=01011111.1100(B)=5F.C(H)

把十进制数67转换为二进制数和十六进制数。1000011,431000101,451000011,411000101,43ABCD提交单选题15分把十进制数123转换为二进制数和十六进制数。1111101,7D1111011,7B1111100,7C1111111,7FABCD提交单选题15分把二进制数01101101转换为十六进制数和十进制数。6D,1076C,1076D,1096B,107ABCD提交单选题15分1.2.2二进制数和十六进制数运算二进制运算加法规则:0+0=01+0=10+1=11+1=0(进位1)乘法规则:0×0=01×0=00×1=01×1=1

十六进制数运算原则:逢十六进一

1.2.2二进制数和十六进制数运算例1.9 43A5+5A349DD9例1.10 5A34-43A5168F1.2.2二进制数和十六进制数运算例1.11 2A34×0025D304

+546861984(H)1.2.3带符号数的表示带符号数最高位是符号位。正数的符号位为0,负数的符号位为1。表示方法:原码、补码、反码。例1.12用8位二进制来表示,求[-3]补。先写出+3:00000011各位取反为:11111100最低位加1为:11111101[-3]补=11111101,或用十六进制表示,[-3]补=FDH数的补码表示

定义:

(X>=0时)[X]补=符号+|X|------(1)

(X<0时)[X]补=2^n-|X|=(2^n-1-|X|)+1---(2)即X<0时:

[X]补+|X|=2^n数的补码具体操作是:正数不变,负数则用绝对值取反+1例1.13依据补码定义写出以下各数的补码,以8位二进制表示。[-1]补=256-1=100000000-1=11111111,直接由(2)式得到。[-127]补=2^8-127=(256-1-127)+1=(11111111-01111111)+1=10000000+1=10000001例1.14识别以下各数的十进制值。[a]补=11111111,求补后为00000001=[1]补,所以,a=-1[b]补=10000000,求补后为10000000=[128]补,所以,b=-128[c]补=10000001,求补后为01111111=[127]补,所以,C=-1271.2.4补码的加减法加法规则:[X+Y]补=[X]补+[Y]补减法规则:[X-Y]补=[X]补+[-Y]补例:1.158位补码的加法运算十进制 二进制

25 00011001+(-32)+11100000

-7111110013200100000+(-25)+11100111700000111 1↙

根据补码定义把十进制数-24表示为8位二进制补码。[10011000]

补[11100111]补[11101000]补ABC提交单选题15分此处添加题目描述11111001000010011111011111110110ABCD提交多选题25分1.2.5无符号数的表示对于正数,不保留符号位,把符号位也作为数值,这样的数叫无符号数。1.2.6字符的表示ASCII码扩充的ASCII码表1.2回车:0dh换行:0ah空格:20h0~9:30h~39hA~Z:41h~5aha~z:61h~7ah1.2.7基本逻辑运算逻辑运算按位操作与运算AND或运算OR异或运算XOR非运算NOT第2章计算机基本原理2.1计算机系统组成2.2存储器2.3中央处理器(CPU)中的寄存器2.4外部设备和接口2.532位80x86CPU的工作模式2.1计算机系统组成计算机的基本工作原理是存储程序和程序控制。冯诺依曼原理的计算机结构2.2存储器

2.2.116位结构的CPU2.2.2存储器2.2.3存储器分段2.2.4逻辑地址2.2.5CPU对内存的读写操作2-1 8086CPU结构2.2.116位结构的CPU8086是16位结构的CPU。16位结构的CPU具有以下几方面的结构特征:(1)数据总线为16位;(2)运算器一次最多可以处理16位的数据;(3)寄存器的最大宽度为16位;(4)寄存器和运算器之间的通路为16位。2.2.2存储器1.基本存储单元计算机存储信息的最小单位是一个二进制位(bit)8位二进制位组成一个字节(Byte)2个字节(16位)组成一个字(Word)2个字(32位)称为双字。80x86微机的内存储器以字节为基本存储单位,或叫基本存储单元2.2.2存储器2.内存中字的存储字与字节的对应关系从31200H单元开始存放的字数据为A28FH,从31202H单元开始存放的字数据为1234H,分别记为:(31200H)字=A28FH(31202H)字=1234H2.2.3存储器分段1.分段的概念内存并没有分段,分段只是CPU管理内存的方式。图2-4分段示意图2.2.3存储器分段2.段的类型代码段—用于存放指令,代码段段基址存放在段寄存器CS数据段—用于存放数据,数据段段基址段地址存放在段寄存器DS附加段—用于辅助存放数据,附加段段基址存放在段寄存器ES堆栈段—是重要的数据结构,可用来保存数据、地址和系统参数,堆栈段段基址存放在段寄存器SS2.2.4逻辑地址逻辑地址是用户编程时使用的地址,分为段地址和偏移地址两部分。段地址:偏移地址2.2.4逻辑地址

可以写下3位数据的纸条可以写下4位数据的纸条如何描述从宿舍到教室的距离?2.2.4逻辑地址例题2-1段基址为1896H,偏移地址为1655H。其物理地址为多少?18960H+1655H=19FB5H给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围从

[填空1]

[填空2]

要求:填空1和填空2需要用完整的五位十六进制来表示,末尾还要加上十六进制数的标志H.作答填空题50分已知8086系统某存储单元物理地址为:52506H,段基址的最大值是

[填空1]

,最小值是

[填空2]

。要求:填空1和填空2需要用完整的4位十六进制来表示,末尾还要加上十六进制数的标志H.作答填空题50分2.2.5CPU对内存的读写操作

CPU要想进行数据的读写,必须和外部器件(芯片)进行下面3类的信息交互。(1)存储单元的地址(地址信息)(2)器件的选择,读或写命令(控制信息)(3)读或写的数据(数据信息)2.2.5CPU对内存的读写操作CPU从地址为3的内存单元中读取数据的过程(1)CPU通过地址线将要进行操作的内存单元地址“3”发出;(2)CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据(3)存储器将内存单元地址为“3”中的数据“32H”通过数据线送入CPU

2.2.5CPU对内存的读写操作写操作与读操作的步骤相似,如向地址为“3”的单元写入数据“FFH”。(1)CPU通过地址线将要进行操作的内存单元地址“3”发出;(2)CPU通过控制线发出内存写命令,选中存储器芯片,并通知它,要向其中写入数据。(3)CPU通过数据线将数据“FFH”送入内存的地址为“3”的单元中。2.2.5CPU对内存的读写操作要让一个计算机或微处理器工作,应向它输入能够驱动它进行工作的电平信息(即机器码)。

对于8086CPU,下面的机器码,能够完成从内存地址为“3”的单元读数据。机器码:101000010000001100000000含义:从内存地址为“3”的单元读取数据送入寄存器AX机器码是01串,难以记忆和书写,用汇编指令来表示,情况如下。对应的汇编指令:MovAX,[3]含义:从内存地址为“3”的单元读取数据送入寄存器AX2.3中央处理器(CPU)中的寄存器2.3.1寄存器介绍2.3.2CS和IP2.3.3堆栈2.3.1寄存器介绍1.通用数据寄存器8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,有时候也可以存放地址,被称为通用数据寄存器。①AX:累加器,运算时较多使用这个寄存器,有些指令规定必须使用它。

②BX:基址寄存器,除了存放数据,它经常用来存放一段内存的起始偏移地址。

③CX:计数寄存器,除了存放数据,它经常用来存放重复操作的次数。

④DX:数据寄存器,除了存放数据,它有时存放32位数据的高16位。2.3.1寄存器介绍2.地址寄存器16位的8086处理器有4个16位的通用地址寄存器。它们的主要作用是存放数据的所在偏移地址,也可以存放数据。这4个寄存器不能再拆分使用。

①SP:堆栈指针,这是一个专用的寄存器,存放堆栈栈顶的偏移地址。

②BP:基址指针,可以用来存放内存中数据的偏移地址。

③SI:源变址寄存器,它经常用来存放内存中源数据区的偏移地址,所谓变址寄存器,是指在某些指令作用下它可以自动地递增或递减其中的值。

④DI:目的变址寄存器,它经常用来存放内存中目的数据区的偏移地址,并在某些指令作用下可以自动地递增或递减其中的值。2.3.1寄存器介绍3.段寄存器16位80x86处理器有4个16位的段寄存器,分别命名为CS,SS,DS,ES。它们用来存放4个段的段基址。

①CS:代码段寄存器,用来存放当前正在执行的程序段的段基址。

②SS:堆栈段寄存器,用来存放堆栈段的段基址。

③DS:数据段寄存器,用来存放数据段段基址。

④ES:附加段寄存器,用来存放另一个数据段的段基址。

2.3.1寄存器介绍4.指令指针寄存器IP:指令指针寄存器,存放即将执行指令的偏移地址。5.指令指针寄存器FLAGS:存放CPU的两类标志。

状态标志:反映处理器当前的状态,如有无溢出,有无进位等。

状态标志有6个:CF、PF、AF、ZF、SF和OF

控制标志:用来控制处理器的工作方式,如是否响应可屏蔽中断等

控制标志有3个:TF、IF和DF二、寄存器结构16位标志寄存器PSW只用了其中的9位作标志位,即6个状态标志位,3个控制标志位。2.3.2CS和IP8086CPU的工作过程可以简要描述如下。(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;(2)IP=IP+所读取指令的长度,从而指向下一条指令;(3)执行指令,转到步骤(1),重复这个过程。CS和IP的内容提供了CPU要执行指令的地址。IA-3232位通用寄存器IA-32为IntelArchitecture32-bit简称,即英特尔32位体系架构,从1985年面世的80386直到Pentium4,都是使用IA-32体系结构的处理器。2.3.3堆栈堆栈区就是这样一个特殊的存储区,它的末单元称为栈底,数据先从栈底开始存放,最后存入的数据所在单元称为栈顶。当堆栈区为空时,栈顶和栈底是重合的。数据在堆栈区存放时,必须以字存入,每次存入一个字,后存入的数据依次放入栈的低地址单元中。栈指针SP每次减2,由栈指针SP指出当前栈顶的位置,数据存取时采用后进先出的方式栈底进栈地址A递减B递增?2.4外部设备和接口外部设备是计算机系统的不可缺少的重要组成部分。通过输入设备把程序和数据输入计算机主机(CPU和内存),通过输出设备把结果输出给用户或保存起来。根据不同用途,接口中的寄存器(端口)分为以下3类。(1)数据端口(2)控制端口(3)状态端口CPU与I/O接口中端口的信息传输也都是通过数据总线进行的。2.532位80X86CPU的工作模式实模式保护模式虚拟8086模式第3章汇编语言程序实例及上机操作

<<汇编语言程序设计>>实践性很强,结合上机是最好的学习方法。3.1汇编语言的工作环境3.1.1汇编语言的系统工作文件

3.1.2进入DOS命令行的方式3.1.3常用的DOS命令3.1.1汇编语言的系统工作文件

使用编辑程序编辑源程序文件(.asm)使用汇编程序(MASM)将源程序文件(.asm)汇编成目标文件(.obj)使用连接程序(LINK),将目标文件(.obj)连接成可执行文件(.EXE)使用调试程序(DEBUG),调试可执行文件运行汇编语言程序需要以下文件编辑程序EDIT.COM汇编程序MASM.EXE连接程序LINK.EXE调试程序DEBUG.EXE注意几点本书使用MicrosoftMasm6.15,MicrosoftLINK5.13版本。EDIT.COM和DEBUG.EXE为系统自带。为方便操作,系统文件和用户文件尽可能放在同一文件目录下。3.1.2进入DOS命令行方式程序---附件---命令提示符运行---CMD退出用EXIT3.1.3常用的DOS命令1.盘:;选择盘符如果屏幕显示为C:\>,表示你当前在C盘,你希望到E盘,则可键入:C:\>E:↙(↙表示Enter键)3.1.3常用的DOS命令2.CD;选择目录例如:E:\>CD;显示当前目录,当前目录是根目录E:\>CDMASM;进到MASM子目录,E:\>MASM>CDMY;从当前目录MASM进到下一级MY子目录E:\>MASM\MY>CD‥;从当前目录MY退到上一级目录MASME:\>MASM>CD\

;从当前目录MASM退到根目录E:\>3.1.3常用的DOS命令3.DIR;显示目录和文件例如:E:\>MASM>DIR;列出当前目录下的子目录和文件E:\>MASM\>DIR*.ASM;列出所有扩展名为ASM的文件,*为通配符E:\>MASM>DIRHELLO.*;列出所有名为HELLO而扩展名不限的文件E:\>MASM>DIRHE*.???;列出所有文件名前2个字符为’HE’而扩展名有3个字符的文件3.1.3常用的DOS命令4.REN;改变文件名例如:E:\>RENH1.TXTH2.ASM;把文件H1.TXT改名为H1.ASM3.1.3常用的DOS命令5.CLS;清除屏幕6.DEL;删除文件例如:E:\>DELC.TXT;删除文件C.TXT7.MD;建立目录例如:E:\>MDMASM;建立MASM目录3.1.3常用的DOS命令8.RD;删除目录例如:E:\>MASM\>RDASM;删除下级子目录ASM3.1.3常用的DOS命令9.COPY;复制文件例如:E:\>COPYH1.TXTH2.TXT;复制文件H1.TXT到文件H2.TXTE:\>COPYA+BC.TXT;把文件A和B连接后得到文件C.TXT3.1.3常用的DOS命令10.TYPE显示文本文件的内容例如:E:\>TYPEC.TXT;显示文件C.TXT的内容11.>;输出的重定向操作符例如:E:\>DIR>THIS.TXT;把DIR显示结果输出到文件THIS.TXT3.1.3常用的DOS命令12.HELP显示命令格式和用法E:\>HELP;显示所有命令的格式E:\>HELPDIR;显示DIR命令的用法3.2汇编语言程序实例3.2.1实例13.2.2实例2例3.1单个字符的键盘输入与显示输出程序

codesegmentassumecs:codestart:movah,1int21hmovdl,aladddl,1movah,2int21hmovah,4chint21hcodeendsendstart运行结果:键入A接着显示B,键入K接着显示L例3.2编写显示“HELLO,WORLD!”程序。

datasegmentStringdb‘HELLO,WORLD!$’dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovdx,offsetstringmovah,9int21hmovah,4chint21hcodeendsendstart

3.3程序实例的上机步骤3.3.1编辑--建立ASM源程序文件3.3.2汇编--产生OBJ二进制目标文件3.3.3连接--产生EXE可执行文件3.3.4关于LST列表文件3.3.5程序的运行和调试3.3.1编辑建立ASM源程序文件1.进入DOS命令行方式。2.假定汇编语言的系统工作文件目录为D:\MASM6.15\,其中D:\表示D盘的根目录。可以通过以下命令指向D盘:D:↙3.如果屏幕显示不在此目录,可以通过以下命令进入该目录:D:\>CD\MASM6.15↙注意,加黑字体是键入的命令。当屏幕显示进入该目录后,用如下命令编辑源程序文件:D:\>MASM6.15\>EDITHELLO.ASM↙3.3.2汇编--产生OBJ二进制目标文件假定汇编语言源程序文件HELLO.ASM已经在当前目录D:\MASM6.15\下,用如下命令进行汇编:D:\>MASM6.15\>MASMHELLO↙注意,加黑字体是键入的命令。该命令执行后,将产生一个同名的二进制目标文件HELLO.OBJ。下一步就是对这个HELLO.OBJ文件进行连接以产生最后的可执行文件。如果源程序有语法错误,则不会产生目标文件。同时报错,提示源程序的出错位置和错误原因。3.3.3连接产生EXE可执行文件使用连接程序LINK把目标文件(OBJ)转换为可执行的EXE文件。键入以下命令:D:\>MASM6.15\>LINKHELLO↙因为源程序中没有定义堆栈段,所以连接程序给出无堆栈段的警告,其实并不是错误,并不影响程序的运行。到此为止,连接过程已经结束。3.3.4关于LST列表文件D:\>MASM6.15\>MASMHELLOHELLOHELLO↙列表文件报告了汇编过程中产生的很多有价值的参考信息。主要包括源程序和机器语言清单、指令和变量的偏移地址等等。3.3.5程序的运行建立了EXE文件后,就可以直接在DOS的提示符下,输入EXE文件的文件名,如:

D>Hello↓

直接运行程序。对EXE文件无需扩展名就可执行。真正的可执行文件是生成的,不是用改名操作得到的。3.3.6程序的调试调试程序DEBUG.EXE是WINDOWS系统自带的。DEBUGHello.EXE“-”DEBUG命令提示符1.反汇编命令U格式1:U地址地址用偏移地址或者段地址:偏移地址表示。该命令从指定的地址开始,把机器语言反汇编为汇编语言。若省去指定地址,则以上一个U命令反汇编的最后一条指令地址的下一个单元作为起始地址。2.运行程序命令G格式:G[=起始地址][中止地址]起始地址规定了执行的起始地址。中止地址是断点地址,让程序暂停在某个位置=不能省掉。若省掉起始地址,则以当前CS:IP作为起始地址。默认段地址在段寄存器CS中。3.跟踪程序命令T格式1:T[=起始地址]单步执行程序,在指令执行中逐条进行跟踪,若省去地址,则从CS:IP现行值执行。格式2:T[=起始地址][指令条数]

可对多条指令进行跟踪。注意:对于INT指令不能使用T命令跟踪。4.单步执行程序指令PP命令,用以执行循环、重复的字符串指令、软件中断或子例程。例如T命令无法一次执行的INT指令,P命令就可以一次执行完这个系统例行程序,回到用户程序中。5.退出命令Q用Q命令退出DEBUG。/learn/UESTC-1002047009?tid=%201002147007#/learn/content?type=detail&id=1003315756&sm=15.退出命令Q用Q命令退出DEBUG。3.4在Win7系统中执行汇编对于初学者,使用DosBox是一个较好的64位环境下编译汇编程序的解决方案。下载安装DosBox,安装目录缺省为C:\ProgramFiles(x86)\DOSBox-0.74。3.4在Win7系统中执行汇编DosBox为Windows环境下Dos模拟器,可以将Dos程序放置在该环境中运行。其过程即为挂载。挂载命令为mount。这里需要挂载的Dos程序为汇编编译程序MASM6.15,如图3-19所示。在DosBox环境下Z:>提示符下键入命令mountC:D:\MASM6.15如果挂载成功,会在该命令的下面自动出现提示语句:DriveCismountedaslocaldirectoryD:\MASM6.15\3.4在Win7系统中执行汇编在DosBox环境下,查看C:目录下的文件,可以看出和Windows下D:\MASM6.15的文件完全一样。即mount命令将原本存放在Windows环境下的文件映射到了DosBox中。3.4在Win7系统中执行汇编需要提醒的是,如果在实际存放目录(本例中为D:\MASE6.15)中新存放一个事先写好的汇编程序,在DosBox中需要重新启动并进行挂载,才能对该汇编程序进行debug等相关操作。3.5几个常用的DOS系统功能调用21H号中断是DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能。汇编语言程序设计需要采用系统的各种功能程序。功能调用的格式通常按照如下4个步骤进行:⑴在AH寄存器中设置系统功能调用号⑵在指定寄存器中设置入口参数⑶执行指令INT21H,实现中断服务程序的功能调用⑷根据出口参数分析功能调用执行情况1.键盘输入一个字符并回显DOS功能调用INT21H功能号:AH=01H出口参数:AL=输入字符的ASCII码功能:等待从键盘输入一个字符,该字符的ASCII码送AL,并送屏幕显示。调用此功能时,若无输入,则会一直等待,直到输入后才继续。movah,01h ;功能号:ah←01h int21h ;功能调用

cmpal,’Y’ ;处理出口参数al jeyeskey ;是“Y” cmpal,’N’ jenokey ;是“N” yeskey: ...nokey: ...2.显示一个字符DOS功能调用INT21H功能号:AH=02H入口参数:DL=输出字符功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。在当前显示器光标位置显示一个问号movah,02h ;设置功能号:ah←02hmovdl,'?' ;提供入口参数:dl←'?'int21h ;DOS功能调用:显示问号3.显示字符串DOS功能调用INT21H功能号:AH=09H入口参数:DS:DX=欲显示字符串在主存中的首地址;字符串应以$(24H)结束功能:显示由DS:DX指定的字符串

stringdb'Hello,Everybody!$‘;在数据段定义要显示的字符串

...movah,09h;设置功能号ah←09hmovdx,offsetstring;提供入口参数 dx←字符串的偏移地址int21h ;DOS功能调用字符串显示第五周汇编语言程序设计2024-3-264.键盘输入到缓冲区DOS功能调用INT21H功能号:AH=0AH入口参数:DS:DX=缓冲区首地址(DS:DX)=缓冲区字节数功能:输入到缓冲区

缓冲区的定义第1字节事先填入最多欲接收的字符个数(包括回车字符,可以是1~255)第2字节将存放实际输入的字符个数(不包括回车符)第3字节开始将存放输入的字符串实际输入的字符数多于定义数时,多出的字符丢掉,且响铃

buffer db81;定义缓冲区;第1个字节填入可能输入的 最大字符数

db?;存放实际输入的字符数

db81dup(?);存放输入的字符串

... movdx,segbuffer ;伪指令seg取得buffer的段 地址

movds,dx ;设置数据段DS movdx,offsetbuffer movah,0ah int21h5.结束程序返回DOSDOS功能调用INT21H功能号:AH=4CH入口参数:AL=返回码功能:结束程序返回DOS

MOVAH,4CHINT21H第4章操作数的寻址方式4.1立即寻址方式4.2寄存器寻址方式4.3直接寻址方式4.4寄存器间接寻址方式4.5寄存器相对寻址方式4.6基址变址寻址方式4.7相对基址变址寻址方式第4章操作数的寻址方式计算机中的指令由操作码和操作数组成。操作数字段可以有一个、两个或三个,通常称为一地址、二地址或三地址指令。二地址指令中两个操作数分别称为源操作数和目的操作数。所谓寻址方式就是指令中寻找操作数的方式。80x86汇编语言指令的一般格式位:[标号:]指令助记符[操作数][;注释][]中的内容位可选项。标号:符号地址,表示指令在内存中的位置。标号后应加冒号:。指令助记符:指令名称,是指令功能的英文缩写。操作数:指令要操作的数据或数据所在的地址。寄存器,常量,变量,表达式。注释:每行以分号“;”开头,汇编程序不处理。4.1立即寻址方式立即寻址方式操作数就在指令中,紧跟在操作码之后,操作数作为指令的一部分存放在代码段。例4.1MOVAL,6H执行完此条指令后(AL)=06H例4.2MOVAX,12AFHAX=12AFH,即AH=12H,AL=AFH

注意:执行时无需去内存取数,因此称为立即数。主要用于寄存器赋初值。立即数只能作为源操作数,并且长度与目的操作数一致。4.2寄存器寻址方式操作数就是寄存器中的值。指令中给出寄存器名。例3.3MOVAX,BX指令执行后,AX=BX,BX保持不变。例MOVAL,BLMOVAX,BXMOVAL,BX错

MOVAX,BL错

注意:以上两种寻址方式都与存储器无关。以下各种寻址方式的操作数都在存储器中。偏移地址也称为有效地址(EA)。4.3直接寻址方式操作数的有效地址EA就在指令中。机器默认段地址在DS中。4.3直接寻址方式(1)存储器读操作例4-4MOVAX,DS:[2000H]该指令表示从数据段的2000H单元读出一个字送入AX。其中(DS)=1500H,(17000H)=31H,(17001H)=65H,(AX)=1020H。则有效地址EA=2000H物理地址=(DS)*10H+EA=15000H+2000H=17000H执行指令后:(AX)=6531H4.3直接寻址方式(2)存储器写操作如果要实现CPU写内存操作,只要把MOV指令的目的操作数变为存储单元,源操作数为CPU的寄存器即可。例4-5MOVDS:[4000H],AX将AX的值写入数据段的4000H单元。已知(DS)=1500H,(AX)=3946H。则有效地址EA=4000H物理地址=(DS)*10H+EA=15000H+4000H=19000H执行指令后:(19000H)=46H(19001H)=39H4.3直接寻址方式(3)符号地址直接寻址方式除了用数值作为有效地址之外,还可以用符号地址的形式。为存储单元定义一个名字,该名字就是符号地址。如果把存储单元看成变量,该名字也是变量名。4.3直接寻址方式(4)段前缀在与内存有关的寻址方式中,操作数的段地址默认为数据段,80X86规定除了数据段之外,数据还可以存放在其他三种段中。如果操作数在其他段中存放,称为段超越,需要在指令中用段超越前缀指出,即用操作数前加上段寄存器名和冒号表示。4.3直接寻址方式例4-7VALUEEQU1000HMOVAX,DS:[VALUE]MOVAX,ES:[VALUE]若已知(ES)=3600H,EA=VALUE=1000H,则有段超越前缀ES的指令源操作数的物理地址计算为:物理地址=(ES)*10H+EA=36000H+1000H=37000H若字单元(37000H)=9091H执行完MOVAX,ES:[VALUE]后:(AX)=9091H4.4寄存器间接寻址方式操作数的有效地址在寄存器中,只允许使用BX、BP、SI和DI寄存器。物理地址=10Hx(DS)+(BX)

物理地址=10Hx(DS)+(SI)物理地址=10Hx(DS)+(DI)

物理地址=10Hx(SS)+(BP)

4.4寄存器间接寻址方式4.4寄存器间接寻址方式例4-8MOVAX,[BX]已知(DS)=1500H,(BX)=4580H,则EA=(BX)=4580H物理地址=(DS)*10H+EA=15000H+4580H=19580H若(19580H)=2364H执行指令后:(AX)=2364H4.4寄存器间接寻址方式例4-9MOVES:[DI],AX已知(ES)=2500H,(DI)=5318H,则EA=(DI)=5318H物理地址=(ES)*10H+EA=25000H+5318H=2A318H若(AX)=2468H执行指令后:(2A318H)=68H(2A319H)=24H4.4寄存器间接寻址方式例4-10MOVAX,[BX];默认DS寄存器作段地址MOVDX,[BP];默认SS寄存器作段地址MOVES:[DI],AX;指定ES寄存器作段地址4.5寄存器相对寻址方式操作数的有效地址是一个寄存器和位移量之和。

物理地址=10Hx(DS)+(BX)+8(16)位位移量物理地址=10Hx(DS)+(SI)+8(16)位位移量物理地址=10Hx(DS)+(DI)+8(16)位位移量

物理地址=10Hx(SS)+(BP)+8(16)位位移量

4.5寄存器相对寻址方式例4-11MOVAX,TOP[SI]以上指令TOP为符号地址,即位移量。已知(DS)=1500H,(SI)=7310H,TOP=25H,则有效地址EA=(SI)+TOP=7310H+25H=7335H物理地址=(DS)*10H+EA=15000H+7335H=1C335H若(1C335H)=2428H,执行指令后,(AX)=2428H4.5寄存器相对寻址方式例4-12MOVAX,[BX+2623H]或写成MOVAX,[BX].2623H已知(DS)=1500H,(BX)=6854H,则有效地址EA=(BX)+2623H=8E77H物理地址=(DS)*10H+EA=15000H+8E77H=1DE77H若(1DE77H)=3567H,执行指令后:(AX)=3567H4.5寄存器相对寻址方式例4-13MOVAX,ARRY[BX]MOVAX,[ARRY][BX]MOVAX,[ARRY+BX]MOVAL,BUF[BX]MOVAL,[BX+8H]MOVAL,[BX].8H4.6基址变址寻址方式操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。基址寄存器BX和BP,变址寄存器SI和DI。默认段寄存器搭配和寄存器间接寻址方式一样。4.6基址变址寻址方式例4-14MOVAX,[BX+DI]执行前:已知(DS)=2100H,(BX)=0158H,(DI)=10A5H,(221FD)=34H,(221FE)=95H,(AX)=0FFFFH。则有效地址EA=(BX)+(DI)=0158H+10A5H=11FDH物理地址=(DS)*10H+EA=21000H+11FDH=221FDH执行后,(AX)=9534H4.6基址变址寻址方式例4-15MOVAX,[BX][SI];默认DS寄存器作段地址MOVAX,[BP][DI];默认SS寄存器作段地址MOVAX,ES:[BX][DI];指定ES寄存器作段地址MOVDX,[BP][SI] ;默认SS寄存器作段地址MOV[BX+DI],CX ;默认DS寄存器作段地址MOV[BP+SI],AL ;默认SS寄存器作段地址4.7相对基址变址寻址方式操作数的有效地址是一个基址寄存器和一个变址寄存器以及一个位移量之和。基址寄存器BX和BP,变址寄存器SI和DI。默认段寄存器搭配和寄存器间接寻址方式一样。4.7相对基址变址寻址方式4.7相对基址变址寻址方式例4-16MOVAX,MASK[BX][SI];默认DS寄存器作段地址MOVAX,[MASK+BX+SI] ;默认DS寄存器作段地址MOVAX,[BX+SI].MASK ;默认DS寄存器作段地址以上三种表示形式实现的功能是一样的。其有效地址EA=MASK+(BX)+(SI);物理地址=(DS)*10H+EA。选择题(1)movax,9(源操作数)

(2)movbyteptr[bx],9(目的操作数)

(3)movbx,[di](源操作数)

(4)movax,bx(源操作数)

1.寄存器寻址2.立即数寻址3.寄存器间接寻址

此处添加题目描述2,1,1,32,3,1,32,3,3,13,1,1,2ABCD提交单选题50分选择题(1)mov[si+bx],9(目的操作数)

(2)movarray[bx],cx(目的操作数)

(3)movax,array+9(源操作数)

(4)movax,array[bx+di](源操作数)

1寄存器相对寻址2直接寻址3相对基址变址寻址4基址变址寻址此处添加题目描述1,4,3,24,1,1,34,4,2,34,1,2,3ABCD提交单选题50分本章小结各种寻址方式总结注意:(1)

双操作数指令的两个操作数,长度须匹配。(2)

双操作数指令的两个操作数中,不能两个操作数同为内存单元。本章小结操作数的有效地址前可以加段跨越前缀,但在以下三种情况下不允许:串处理指令的目的串必须用ES段PUSH指令的目的和POP指令的源必须用SS段指令必须存放在CS段第5章常用指令系统80x86汇编语言指令的一般格式为:[标号:]指令助记符[操作数][;注释][]中的内容为可选项。例如:START:MOVAX,DATA;DATA送AX标号:符号地址,表示指令在内存中的位置。标号后应加冒号:。指令助记符:指令名称,是指令功能的英文缩写。操作数:指令要操作的数据或数据所在的地址。寄存器,常量,变量,表达式。注释:每行以分号“;”开头,汇编程序不处理。8086指令系统可以分为5组:

(1)数据传送指令(2)算术运算指令(3)逻辑指令与移位指令(4)串操作指令(5)程序转移指令5.1数据传送指令通用数据传送指令累加器专用传送指令地址传送指令标志寄存器传送5.1.1通用数据传送指令MOV传送PUSH进栈POP出栈XCHG交换(1)MOV传送指令格式:MOVDST,SRC操作:(DST)←(SRC)DST表示目的操作数,SRC表示源操作数。功能:将源操作数传送到目的操作数。

双操作数指令的规定源操作数与目的操作数的长度必须一致。源操作数与目的操作数不能同时为存储器。目的操作数不能为CS和IP,因为CS:IP是程序当前地址。目的操作数不可以是立即数。例5.1立即数与寄存器的传送MOVAH,89 ;十进制数MOVAX,2016H;十六进制数,后面加HMOVAX,0ABCDH ;十六进制数,因非数字(0~9)开头,前面加0MOVAL,10001011B ;二进制数,后面加BMOVAL,‘A’

;字符‘A’的ASCII码是41H,相当于立即数以下指令是错误的: MOVAH,258 ;258超出8位(二进制) MOVAX,DH;两个操作数长度不一致例5.2在指令中说明内存单元的类型,以便操作数长度匹配。 MOV[BX],AX以下指令是错误的: MOV[BX],0指令改写为: MOVBYTEPTR[BX],0 MOVWORDPTR[BX],0例5.3段地址寄存器的传送 MOVAX,DATA_SEGMOVDS,AX段地址寄存器须通过寄存器得到段地址,不能直接由符号地址、段寄存器、立即数得到。以下指令是错误的: MOVDS,DATA_SEG;段寄存器不接受符号地址 MOVDS,ES;段寄存器之间不能直接传送 MOVDS,1234;段寄存器不接受立即数 MOVCS,AX;指令合法,但代码段寄存器不能赋值例5.4传送变量 MOVBX,TABLE;假定TABLE是16位的变量把变量TABLE的值送给BX。以下指令是错误的: MOVBL,TABLE;TABLE是16位的变量,操作数长度不一致 MOV[BX],TABLE;两个操作数不能同为内存单元例5.5传送地址 MOVBX,OFFSETTABLE OFFSET为偏移地址属性操作符,通常是把变量TABLE的偏移地址送给BX。以下指令是错误的: MOVBL,OFFSETTABLE

不管变量类型如何,其有效地址总是16位。(2)PUSH进栈指令格式:PUSHSRC操作:(SP)←(SP)-2((SP)+1,(SP))←(SRC)堆栈:后进先出内存区,以字为单位传送,SS:SP总是指向栈顶。(3)POP出栈指令格式:POPDST操作:(DST)←((SP)+1,(SP))

(SP)←(SP)+2

例5.6进栈和出栈 MOVBX,1234H PUSHBX POPAX例5.7在DEBUG下如下指令也是合法的: PUSH[2016];把地址为DS:[2016]的字送往栈顶(SS:SP所指内存) POP[2016];把栈顶(SS:SP所指内存)的字送往DS:[2016]的内存(4)XCHG交换指令格式:XCHGOPR1,OPR2操作:(OPR1)(OPR2)功能:把两个操作数互换位置。遵循双操作数指令的规定,但操作数不能为立即数。例5.8 XCHGAX,BX;两个寄存器长度相等 XCHGAX,[BX];AX要求[BX]也取字单元 XCHGAX,VAR;VAR必须是字变量以下指令是错误的: XCHGAX,5;显然操作数不能为立即数 XCHG[BX],VAR;操作数不能同为内存单元 XCHGAX,BH;操作数长度要一致5.1.2累加器专用传送指令IN;从I/O端口输入OUT;向I/O端口输出XLAT;换码其中I/O端口是CPU与外设传送数据的接口,单独编址,不属于内存,端口地址范围0000~FFFFH.这组指令只限于AX,AL累加器。(1)IN输入指令长格式:INAL,PORT(字节);00~FFHINAX,PORT(字)操作:AL←(PORT)AX←(PORT)功能:把端口PORT的数据输入到累加器。

短格式:INAL,DX(字节);PORT放入DXINAX,DX(字)操作:AL←((DX))AX←((DX))功能:把DX指向的端口的数据输入到累加器。例5.9读端口 INAX,61H MOVBX,AX 把端口61H的16位数据输入到累加器AX,再转送BX。例5.10 MOVDX,2F8H INAL,DX 把端口2F8H的8位数据输入到累加器AL。INAX,2F8H;错,端口号超出8位,不能用长格式INAX,[DX];错,端口地址不能用[](2)OUT输出指令长格式:OUTPORT,AL(字节);00-FFHOUTPORT,AX(字)操作:PORT←ALPORT←AX功能:把累加器的数据输出到端口PORT。短格式:OUTDX,AL(字节);0000-FFFFHOUTDX,AX(字)

操作:(DX)←AL

(DX)

←AX功能:把累加器的数据输出到DX指向的端口。例5.11写端口 OUT61H,AL OUTDX,AL(3)XLAT换码指令格式:XLAT操作:AL←(BX+AL)功能:把BX+AL的值作为有效地址,取出其中的一个字节送AL。

例5.12换码

mov

ax,data

mov

ds,ax

movbx,100H

moval,4

xlat

int21hXLAT执行前XLAT执行后5.1.3地址传送指令LEA有效地址送寄存器LDS指针送寄存器和DSLES指针送寄存器和ES(1)LEA有效地址送寄存器指令格式:LEAREG,SRC 操作:REG←SRC功能:把源操作数的有效地址EA送到指定的寄存器。例5.13取变量的有效地址 LEABX,TABLE MOVBX,OFFSETTABLE 上面2条指令等效。TABLE无论是何类型的变量,其有效地址总是16位。例5.14 LEABX,[2016H]MOVBX,OFFSET

[2016H] 指令执行后,BX=2016H。(2)LDS指针送寄存器和DS指令格式:LDSREG,SRC操作:REG←(SRC)

DS←(SRC+2)功能:把源操作数SRC所指向的内存单元中的两个字送到指定的寄存器REG和DS。例5.15 LDSSI,[BX] 指令执行前,如DS=2000H,BX=0400H,(2000:0400)=1234H,(2000:0402)=5678H, 指令执行后,SI=1234H,DS=5678H。(3)LES指针送寄存器和ES指令格式:LESREG,SRC操作:REG←(SRC)

ES←(SRC+2)功能:把源操作数SRC所指向的内存单元中的两个字送到指定的寄存器REG和ES。例如LESDI,[10H]DS=C000H,(C0010H)=0180H,(C0012H)=2000H结果DI=0180H,ES=2000H

5.1.4标志寄存器传送指令LAHF标志寄存器FLAGS的低字节送AHSAHFAH送FLAGS的低字节PUSHF标志进栈POPF标志出栈以上传送类指令均不影响标志位,除SAHF,POPF外.例5.16 LAHF;标志寄存器低字节送AH寄存器 SAHF;AH送标志寄存器 PUSHF;标志入栈 POPF;标志出栈5.2算术运算指令

加减乘除四则运算是计算机经常进行的基本操作。算术运算指令主要实现二进制(和十进制)数据的四则运算。5.2.1类型扩展指令CBW:AL扩展为AXCWD:AX扩展为DX,AX扩展方法为符号扩展。例5.17正数的扩展

温馨提示

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

评论

0/150

提交评论