《微机原理及应用》课件-项目6:指令系统概述与寻址方式_第1页
《微机原理及应用》课件-项目6:指令系统概述与寻址方式_第2页
《微机原理及应用》课件-项目6:指令系统概述与寻址方式_第3页
《微机原理及应用》课件-项目6:指令系统概述与寻址方式_第4页
《微机原理及应用》课件-项目6:指令系统概述与寻址方式_第5页
已阅读5页,还剩179页未读 继续免费阅读

下载本文档

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

文档简介

微机原理及应用项目6:指令系统概述与寻址方式第1讲指令系统概述指令系统概述首先,我们来看几个概念,第一个是指令,指令是控制计算机完成指定操作并能够被计算机所识别的命令,也就是说我们人类下达给计算机让他去执行某项操作的一些命令指令控制计算机完成指定操作能被计算机所识别机器指令,机器指令是指令的二进制代码的形式。我们说计算机能够识别的只有二进制数,所以计算机能够识别并且能够看懂的指令就是二进制的代码表示的,比如CD21h,它的二进制代码的形式是这样子的,指令写成这样计算机才能够识别,但是,写成这样的指令对于人类来说既不好识别,也不好理解机器指令指令的二进制代码形式例:CD21H(1100110100100001)计算机能识别,人类不好识别理解于是就有汇编指令,汇编指令是我们把二进制的代码用助记符的形式表示出来的指令,助记符就是帮助人来记忆的符号,所以说汇编指令纯粹是为了便于人写代码和看懂代码而设计的编程语言,比如int21h,它就是把二进制代码用助记符的形式来表示了,这样人比较容易能够看懂,但是,这样的话,人看懂了,计算机又看不懂了呀,没关系,程序员开发了编译软件,能够将汇编语言编程成二进制代码的形式,再给计算机去执行。汇编指令用助记符形式表现的指令便于人写代码和看懂代码例:INT21H编译软件:将汇编语言编程成二进制代码形式同学们都学过C语言,汇编语言和C语言的不同,C语言汇编语言C语言属于高级语言,而汇编语言属于低级语言,这里的高级和低级的含义是相对硬件来说。高级语言C语言低级语言汇编语言硬件由于汇编语言更贴近硬件的处理,所以它属于低级语言,而C语言更贴近人的想法和需求所以它属于高级语言。学习了汇编语言更便于你去理解计算机的硬件在做的处理。高级语言C语言低级语言汇编语言更贴近硬件的处理更贴近人的想法和需求最后是指令系统,指令系统是CPU所有指令和它的使用规则构成的系统,指令系统CPU所有指令及其使用规则的集合我们将要学习的就是8086指令系统,包括一系列的指令和这些指令的使用规则。下面来看一下指令的基本构成,我们这里说的指令是汇编语言写成的指令8086指令系统(一系列指令及其使用规则)指令的基本构成(汇编语言写成的指令)指令一条指令包括操作码和操作数,这里我们把操作数放到方括号里的含义是说这个操作数它可能有也可能没有,换句话说,在一条指令中,可能有一个操作数,也可能有两个操作数,也可能没有操作数,这要看具体的指令使用规则操作码操作数指令一条指令包括操作码和操作数,这里我们把操作数放到方括号里的含义是说这个操作数它可能有也可能没有,换句话说,在一条指令中,可能有一个操作数,也可能有两个操作数,也可能没有操作数,这要看具体的指令使用规则该操作数可有可无可以有0个、1个或2个操作码操作数[]指令操作码体现的是我们想要需要计算机执行什么样的操作,说明要执行什么操作操作码操作数[]指令比如,你想让他传送数据,还是让他进行算数运算,这些都在操作码中体现,操作码(例:传送数据、算数运算)说明要执行什么操作操作数[]指令一般操作码用三个大写字母表示,通常是对应的英文单词的简写操作码用三个大写字母表示(对应英文单词的简写)操作数[]指令比如数据传送指令用MOVE的前三个大写字母MOV来表示,加法运算用Addition的前三个大写字母ADD来表示,这才便于人去记忆和使用操作码数据传送指令MOVE:MOV操作数[]加法运算Addition:ADD便于记忆便于使用指令我们说操作数最多有两个,那我们来看两个操作数的情况,两个操作数中间要用逗号分隔,它们表示本操作要执行的那个对象。比如说我们要进行加法运算,那要给两个数才能相加呀,操作码操作数[]操作数[],本操作的执行对象加法运算指令所以你看ADD的后面就有两个操作数,这两个操作数就是加数和被加数操作码操作数[]操作数[],ADDAX,[SI+6]加数和被加数但是,操作数放的位置不一样,它们的含义也不同指令操作码操作数[]操作数[],位置不同,含义不同离操作码比较近的这个操作数是目的操作数,指令操作码操作数[]操作数[],目的操作数指令操作来源或是操作后的存储目的地它既可能是操作的来源,也可能是操作完成后要存储的目的地操作码操作数[]操作数[],目的操作数指令逗号后边的这个操作数是操作数的来源操作码操作数[]操作数[],操作数来源指令只表示来源不表示目的地他只表示操作数的一个来源不表示操作数的目的地,说到这里,老师就要提醒同学们,源操作数可以是任何数字或者CPU能够获取的数值,但是目的操作数它要存放操作的结果,所以它必须是一个能够存放数据的地方,否则就不能做目的操作数使用。操作码操作数[]操作数[],操作数来源源操作数:任何数字或者CPU能够获取的数值目的操作数:可以存放数据的空间下面通过几条指令来熟悉一下操作码和操作数通过指令熟悉操作码和操作数下面通过几条指令来熟悉一下操作码和操作数,第一个moveax逗号bx,这里的操作码是mov,ax和bx是两个操作数,MOVAX,BX操作码操作数因为他们用逗号相隔了,AX更靠近操作码因此它是目的操作数,MOVAX,BX目的操作数BX在逗号的后面,所以BX是源操作数MOVAX,BX源操作数这条指令的含义是把BX的内容传送给AX,你看作为目的操作数,AX必须要能够存放数据的空间。MOVAX,BX含义:把BX的内容传送给AXAX:能够存放数据的空间下一条指令中add是操作码,AX是目的操作数,SI加六加方括号是源操作数ADDAX,[SI+6]操作码目的操作数源操作数这里SI+6用方括号括起来了,表示它来自内存单元,由于这是一个数据,所以它应该在数据段里,它的段基址是DSADDAX,[SI+6]方括号表示来自内存单元在数据段里,段基址是DSSI+6的值就是偏移地址,当你知道了DS和SI+6的大小,就可以按图索骥,从内存中找到这个操作数了ADDAX,[SI+6]值为偏移地址再看下一条指令,操作码是INC,操作数是BX加方括号INC[BX]操作码操作数这里只有一个操作数,那这个操作数既是源操作数又是目的操作数最后一条指令hlt它没有操作数,只有一个操作码,这就是操作数是零的情况INC[BX]既是源操作数又是目的操作数这里只有一个操作数,那这个操作数既是源操作数又是目的操作数,最后一条指令hlt它没有操作数,只有一个操作码,这就是操作数是零的情况HLT没有操作数,只有一个操作码操作数是零我们将会在这一章里面介绍这些常用的指令,包括进行数据传送的指令,进行算术运算的指令,还有逻辑运算指令,移位的指令以及串操作的指令和进行控制转移相关的指令数据传送指令算术运算指令逻辑运算指令移位指令串操作指令控制转移相关指令请同学们在学习的过程中注意理解操作码的含义,通过多使用去掌握这些指令的用法00000助记符数据传送数据传送MOV,PUSH/POP,XCHG等地址传送LEA,LDS,LES输入输出IN,OUT算术运算加法ADD,ADC,INC减法SUB,SBB,DEC,NEG,CMP乘/除法MUL,IMUL,DIV,IDIV逻辑AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制转移JMP,JXX,LOOP,CALL/RET,INT/IRET微机原理及应用第2讲指令系统概述指令系统概述首先,我们来看几个概念,第一个是指令,指令是控制计算机完成指定操作并能够被计算机所识别的命令,也就是说我们人类下达给计算机让他去执行某项操作的一些命令指令控制计算机完成指定操作能被计算机所识别机器指令,机器指令是指令的二进制代码的形式。我们说计算机能够识别的只有二进制数,所以计算机能够识别并且能够看懂的指令就是二进制的代码表示的,比如CD21h,它的二进制代码的形式是这样子的,指令写成这样计算机才能够识别,但是,写成这样的指令对于人类来说既不好识别,也不好理解机器指令指令的二进制代码形式例:CD21H(1100110100100001)计算机能识别,人类不好识别理解于是就有汇编指令,汇编指令是我们把二进制的代码用助记符的形式表示出来的指令,助记符就是帮助人来记忆的符号,所以说汇编指令纯粹是为了便于人写代码和看懂代码而设计的编程语言,比如int21h,它就是把二进制代码用助记符的形式来表示了,这样人比较容易能够看懂,但是,这样的话,人看懂了,计算机又看不懂了呀,没关系,程序员开发了编译软件,能够将汇编语言编程成二进制代码的形式,再给计算机去执行。汇编指令用助记符形式表现的指令便于人写代码和看懂代码例:INT21H编译软件:将汇编语言编程成二进制代码形式同学们都学过C语言,汇编语言和C语言的不同,C语言汇编语言C语言属于高级语言,而汇编语言属于低级语言,这里的高级和低级的含义是相对硬件来说。高级语言C语言低级语言汇编语言硬件由于汇编语言更贴近硬件的处理,所以它属于低级语言,而C语言更贴近人的想法和需求所以它属于高级语言。学习了汇编语言更便于你去理解计算机的硬件在做的处理。高级语言C语言低级语言汇编语言更贴近硬件的处理更贴近人的想法和需求最后是指令系统,指令系统是CPU所有指令和它的使用规则构成的系统,指令系统CPU所有指令及其使用规则的集合我们将要学习的就是8086指令系统,包括一系列的指令和这些指令的使用规则。下面来看一下指令的基本构成,我们这里说的指令是汇编语言写成的指令8086指令系统(一系列指令及其使用规则)指令的基本构成(汇编语言写成的指令)指令一条指令包括操作码和操作数,这里我们把操作数放到方括号里的含义是说这个操作数它可能有也可能没有,换句话说,在一条指令中,可能有一个操作数,也可能有两个操作数,也可能没有操作数,这要看具体的指令使用规则操作码操作数指令一条指令包括操作码和操作数,这里我们把操作数放到方括号里的含义是说这个操作数它可能有也可能没有,换句话说,在一条指令中,可能有一个操作数,也可能有两个操作数,也可能没有操作数,这要看具体的指令使用规则该操作数可有可无可以有0个、1个或2个操作码操作数[]指令操作码体现的是我们想要需要计算机执行什么样的操作,说明要执行什么操作操作码操作数[]指令比如,你想让他传送数据,还是让他进行算数运算,这些都在操作码中体现,操作码(例:传送数据、算数运算)说明要执行什么操作操作数[]指令一般操作码用三个大写字母表示,通常是对应的英文单词的简写操作码用三个大写字母表示(对应英文单词的简写)操作数[]指令比如数据传送指令用MOVE的前三个大写字母MOV来表示,加法运算用Addition的前三个大写字母ADD来表示,这才便于人去记忆和使用操作码数据传送指令MOVE:MOV操作数[]加法运算Addition:ADD便于记忆便于使用指令我们说操作数最多有两个,那我们来看两个操作数的情况,两个操作数中间要用逗号分隔,它们表示本操作要执行的那个对象。比如说我们要进行加法运算,那要给两个数才能相加呀,操作码操作数[]操作数[],本操作的执行对象加法运算指令所以你看ADD的后面就有两个操作数,这两个操作数就是加数和被加数操作码操作数[]操作数[],ADDAX,[SI+6]加数和被加数但是,操作数放的位置不一样,它们的含义也不同指令操作码操作数[]操作数[],位置不同,含义不同离操作码比较近的这个操作数是目的操作数,指令操作码操作数[]操作数[],目的操作数指令操作来源或是操作后的存储目的地它既可能是操作的来源,也可能是操作完成后要存储的目的地操作码操作数[]操作数[],目的操作数指令逗号后边的这个操作数是操作数的来源操作码操作数[]操作数[],操作数来源指令只表示来源不表示目的地他只表示操作数的一个来源不表示操作数的目的地,说到这里,老师就要提醒同学们,源操作数可以是任何数字或者CPU能够获取的数值,但是目的操作数它要存放操作的结果,所以它必须是一个能够存放数据的地方,否则就不能做目的操作数使用。操作码操作数[]操作数[],操作数来源源操作数:任何数字或者CPU能够获取的数值目的操作数:可以存放数据的空间下面通过几条指令来熟悉一下操作码和操作数通过指令熟悉操作码和操作数下面通过几条指令来熟悉一下操作码和操作数,第一个moveax逗号bx,这里的操作码是mov,ax和bx是两个操作数,MOVAX,BX操作码操作数因为他们用逗号相隔了,AX更靠近操作码因此它是目的操作数,MOVAX,BX目的操作数BX在逗号的后面,所以BX是源操作数MOVAX,BX源操作数这条指令的含义是把BX的内容传送给AX,你看作为目的操作数,AX必须要能够存放数据的空间。MOVAX,BX含义:把BX的内容传送给AXAX:能够存放数据的空间下一条指令中add是操作码,AX是目的操作数,SI加六加方括号是源操作数ADDAX,[SI+6]操作码目的操作数源操作数这里SI+6用方括号括起来了,表示它来自内存单元,由于这是一个数据,所以它应该在数据段里,它的段基址是DSADDAX,[SI+6]方括号表示来自内存单元在数据段里,段基址是DSSI+6的值就是偏移地址,当你知道了DS和SI+6的大小,就可以按图索骥,从内存中找到这个操作数了ADDAX,[SI+6]值为偏移地址再看下一条指令,操作码是INC,操作数是BX加方括号INC[BX]操作码操作数这里只有一个操作数,那这个操作数既是源操作数又是目的操作数最后一条指令hlt它没有操作数,只有一个操作码,这就是操作数是零的情况INC[BX]既是源操作数又是目的操作数这里只有一个操作数,那这个操作数既是源操作数又是目的操作数,最后一条指令hlt它没有操作数,只有一个操作码,这就是操作数是零的情况HLT没有操作数,只有一个操作码操作数是零我们将会在这一章里面介绍这些常用的指令,包括进行数据传送的指令,进行算术运算的指令,还有逻辑运算指令,移位的指令以及串操作的指令和进行控制转移相关的指令数据传送指令算术运算指令逻辑运算指令移位指令串操作指令控制转移相关指令请同学们在学习的过程中注意理解操作码的含义,通过多使用去掌握这些指令的用法00000助记符数据传送数据传送MOV,PUSH/POP,XCHG等地址传送LEA,LDS,LES输入输出IN,OUT算术运算加法ADD,ADC,INC减法SUB,SBB,DEC,NEG,CMP乘/除法MUL,IMUL,DIV,IDIV逻辑AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制转移JMP,JXX,LOOP,CALL/RET,INT/IRET微机原理及应用第3讲操作数下面我们来学习操作数操作数主要分三类,第一类是立即数操作数,其实就是常数在指令中的常数一般是十进制的数或者是十六进制的数立即数操作数常数十进制十六进制z操作数如果是十进制的数,不需要写任何后缀,如果是十六进制的数,就要用大写的H做为后缀而且如果是16进制的数,它最开始的这个数字是字母的话呢,前面要加零。好,这些是书写的规则十进制十六进制不需要写后缀用H为后缀开始的数字是字

母,前面要加零立即数操作数使用规则我们再来看一下立即数操作数的使用规则。立即数操作数作为操作数的一部分,它只能放在源操作数的这个位置上,不能放在目的操作数据位置上,因为他只表示一个常数,而不是一个能够存储数据的空间,因此它不能作为一个目的操作数使用,第二就是立即操作数它不会因为指令的执行而发生任何变化,因为它是常数是不变的只能用作源操作数表示一个常数,不是能存储数据的空间不因指令的执行而发生变化了解了它的使用规则我们来看下面两条指令,第一条是moveax逗号3acfh,这条指令里3acfh明显是一个常数,也就是我们说的立即数操作数把它放在源操作数这个位置上,这条指令是正确的MOVAX,3ACFH常数立即数操作数放源操作数位置上指令正确第二条指令将3acfh这个立即数操作数放在了目的操作数的位置上我们说立即操作数不能作为目的操作数使用,所以第二条指令是错误的MOV3ACFH,AX放目的操作数位置上指令错误再来看一下第二种操作数,寄存器操作数寄存器操作数就是我们前面学过的寄存器。寄存器操作数寄存器12个寄存器操作数我们一共学习了14个寄存器,除了IP和FR以外的12个寄存器都可以被用作操作数。寄存器操作数寄存器14个寄存器除IP和FR外的12个寄存器被用作操作数这12个寄存器操作数包括八个通用寄存器和四个段寄存器寄存器操作数12个寄存器操作数8个通用寄存器:AX、BX、CX、DX、SP、BP、SI、DI4个段寄存器:CS、DS、SS、ES由于寄存器操作数是可以能够存储数据的空间,所以它既可以被用做源操作数,也可以被用作目的操作数,寄存器操作数存储数据的空间源操作数目的操作数指令指针寄存器IP是由操作系统自行更改的,而不是给程序员开放使用的,所以它不能用作操作数IP操作系统自行更改不能用作操作数不给程序员开放使用寄存器操作数FR它不是我们通常意义下的16位数据的存储空间,它是按比特来进行一个存储和修改的,所以它比较特殊,它也不能作为操作数使用寄存器操作数FR不是16位数据的存储空间按比特来进行存储和修改不能用作操作数最后一种操作数是存储器操作数存储器操作数我们在之前的例子中见过的,就是放到方括号里面的这种操作数,它表示内存空间中的数既然是放到内存空间的操作数,那它自然是能够存储数据的空间存储器操作数[XXX]内存空间中的数存储数据的空间所以存储器操作数既可以做源操作数也可以作为目的操作数存储器操作数[XXX]内存空间中的数存储数据的空间源操作数目的操作数但是请同学们注意,通常情况下,存储器操作数不能同时成为原操作数和目的操作数,也就是说我们不能把方括号同时放到原操作数和目的操作数的位置上,除非是在字符串操作的时候,在字符串操作中,原操作数和目的操作数可以同时使用存储器操作数,在其他的情况下就不可以存储器操作数源操作数目的操作数存储器操作数不能同时为原操作数和目的操作数字符串操作时源操作数和目的操作数同时使用存储器操作数为了能够正确的找到这个内存单元,我们需要确定这个操作数它在哪一个段,也就是要先确定它的段寄存器如果指令中没有指明它的段寄存器的话,我们就用CPU默认的那些段寄存器存储器操作数确定该操作数所在段,即先确定段寄存器若指令中没有指明所用段寄存器,则CPU采用默认段寄存器下面来看一下指令执行的时间,一条指令执行的时间可能包括多个时钟周期它包括取指令,如果有操作数还需要取操作数,取完操作数再执行指令,最后传送结果指令执行时间执行时间(xx时钟周期)包含:取指令取操作数执行指令传送结果加速方法一为了加速指令执行的时间,其实还是有一些技巧可循,首先我们可以加速取操作数的时间,我们都知道CPU跟寄存器进行数据交互的速度要远远快于他跟内存储器交互数据的速度所以我们的操作数应尽量使用寄存器操作数就可以加速指令的执行尽量使用寄存器作为操作数加速取操作数的时间CPU和寄存器CPU和内存储器快慢加速方法二第二个,在选择操作码的时候,尽量用简单的运算代替复杂的运算,比如用移位来代替乘除法,因为移位的运算速度是比较快用移位代替乘除法简单运算代替复杂运算加速方法三第三个,就是尽量使用比较简单的寻址方式,这样也是可以加速指令的执行尽量使用简单的寻址方式加速指令执行微机原理及应用第4讲寻址方式之立即寻址和寄存器寻址下面我们来学习寻址方式寻址方式之立即寻址和寄存器寻址从本课开始,我们来给大家介绍寻址方式,这里的寻址方式就是CPU去寻找操作数的地址的方法,CPU寻找的操作数一般是指原操作数,寻址方式CPU去寻找操作数的地址方法(操作数:原操作数)在8086指令系统中,有八种寻址方式,分别是立即寻址,寄存器寻址,直接寻址,寄存器间接寻址、寄存器相对寻址,基址变址寻址,相对基址变址寻址和隐含寻址,我们会逐一给大家介绍,在老师介绍的过程中,请同学们结合操作数的分类来进行区分八种寻址方式立即寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址隐含寻址首先是立即寻址,立即寻址这里的源操作数,就是我们说的立即数操作数,它作为指令的一部分,紧跟着操作码存放在代码段里立即寻址源操作数立即数操作数存放于代码段它的好处是,CPU在取指令的时候将操作码和操作数一同取到了指令预取队列中,而不需要再另行去取操作数,因此,这种寻址方式的执行速度比较快立即寻址只能是原操作数,立即寻址取指令时将操作码和操作数一同取到指令预取队列中源操作数立即数操作数存放于代码段执行速度快如果立即数操作数是一个16位的数,那么它的高8位存放在代码段的高地址单元中,低8位存放在代码段的低地址单元中立即寻址立即数操作数:16位的数高8位存放在高地址单元中低8位存放在低地址单元中我们来看一个例子,比如moveAX,3102h这条指令,在这条指令中3102h就是立即数操作数,它会跟MOV这个操作码一起放在代码段中例子moveAX,3102h立即数操作数存放于代码段中如图所示,在代码段中,先存放了操作码,后边紧跟着放了这个立即数操作数。在代码段中,3102h中的31h存放在高地址的单元中,02h存放在低地址的单元中,这条指令的含义就是将3102h传输到ax这个寄存器中,那么这条指令执行完了以后呢,ax的值就是3102h,其中02h被存放到al寄存器中,31h被存放到ah寄存器中,这是立即寻址方式,MOV操作码02H31H代码段操作码低8位高8位代码段立即数AHALAX3102H立即寻址方式我们再来看一下寄存器寻址,寄存器寻址方式就是原操作数是一个寄存器,对这种寻址方式,要求它的原操作数和目的操作数的字长相同寄存器寻址源操作数是寄存器原操作数目的操作数字长相同比如Move[3F00H],ax这条指令,Ax是寄存器,存放了16位的数据,要把它的存放到内存单元中,没有显示的说明的情况下,应该是放在内存的数据段中,我们知道DS为2000h,例子move[3F00H],AX寄存器:存放16位的数据存放于内存数据段中那么我们可以算出这个单元的物理地址为23000h,但是这个单元只能存放8位的数据,存不下16位的数据,因此,我们用两个连续的单元来存放16位的数据,一个单元是物理地址是23000h的单元,另一个单元是跟它相邻的地址更高的23001h单元。因为我们要求源操作数和目的操作数的字长相同,因此,只要有一个操作数的大小确定了,另一个的大小也就确定了例子move[3F00H],AX寄存器:存放16位的数据存放于内存数据段中物理地址:23000h只能存放8位的数据23000h23001h单元一单元二我们再看这张图,指令执行完毕后,AX的数据被存放到内存中,物理地址是23000h的单元和它下一个单元…12H34H内存…34H12HAXmove[3F00H],AX23000H字长不同如果指令中,很明显逗号两边的字长不一致,那么这条指令就是错误的,在编译的时候,编译软件会报错。…12H34H内存…34H12HAXmove[3F00H],AX23000H字长不同指令错误编译软件报错我们来看下面这几个例子,首先看moveAX逗号bx这条指令,逗号两边AX和bx的字长相同,这条指令是正确的例子MOVAX,BX字长相同BL:八比特的寄存器下一条指令MOVBL,ax这里,逗号两边的寄存器的大小是不相同的,bl是八比特的寄存器,AX是16比特的寄存器,所以这条指令是错误的例子MOVAX,BX逗号两边寄存器大小不同MOVBL,AXAX:16比特的寄存器都是八个比特的寄存器再下一条movbl,ch这条指令是正确的,因为在逗号两边,两个寄存器的大小是相同的,bl和ch都是八个比特的寄存器例子MOVAX,BX逗号两边寄存器大小相同MOVBL,AXMOVBL,CH微机原理及应用第5讲寻址方式之直接寻址下面我们来学习直接寻址寻址方式之直接寻址直接寻址是指源操作数来自内存单元,而内存单元的偏移地址直接写了指令中,这种方式叫直接寻址,就是16位的偏移地址直接给出的意思。这里的偏移地址我们用EA来表示,直接寻址源操作数来自内存单元内存单元的偏移地址直接写指令16位的偏移地址直接给出EA因为它指向的是内存单元,在没有给定段基址的前提下,默认段基址是ds,EA内存单元没有定段基址的前提DS当然程序员可以通过段超越前缀去修改段基址,这里的偏移地址可以用符号地址来表示通过段超越前缀修改段基址偏移地址可用符号地址表示ADDRVAR程序员举例说明,比如这条指令moveAX,[3102h],这里的3102h被放到方括号里边,说明这是一个存储器操作数,执行后,AL

[3102H],AH

[3103H]moveAX,[3102h]存储器操作数在没有特别说明的情况下,我们认为这个存储器操作数的段基址是DS,而3102h就是它的段内偏移量存储器操作数的段基址是DSmoveAX,[3102h]段内偏移量假设ds的值是2000h,我们可以计算出来这个内存单元的物理地址是23102h,找到这个单元以后,我们从23102h和23103h两个单元中取出16位的数据,把它存放到ax中,我们看到,23102h中存放的是CDH,23103h中存放的是Abh,因此我们实际是将CDh存放在al中,将ABh存放在ah中则操作数的物理地址为:若(DS)=2000H20000H+3102H=23102H[23103H]=ABH若[23102H]=CDH指令执行后:[AX]=ABCDH代码段数据段AHALAXMOV操作码02H31H…CDHABH23102H23103HMOV操作码02H31H代码段…CDHABH数据段AHALAX23102H23103H直接寻址是一般的数据存取方式,因此它其实是需要指定段基址的,只是我们默认的段基址是ds,直接寻址一般的数据存取方式需要指定段基址默认的段基址DS01我们再来看三个例子,第一个是MOV[2f10h],al,这条指令的含义是把al的值存放到数据段中偏移地址是2f10h单元中那,由于al只有八个比特,所以用这一个单元就可以存放得下这个数据。第二例子是move[2f10h],ax,ax是16位的数据,所以要把它存放到两个连续的内存单元中,其中AL的内容存放在逻辑地址是DS:2f10H的内存单元中,AH的内存存放在逻辑地址是DS:2F11H的内存单元中。第三个例子是moveax,es:[2510h],这里通过段超越前缀ES加冒号,指定了内存单元的段基址是ES,那么这条指令就是将附加段中偏移地址是2510h的这个单元和偏移地址是2511h的单元里的16位的数据存放到ax中al只有八个比特MOV[2f10h],al将AL的内容移入DS:2F10H单元中02ax是16位的数据move[2f10h],axAL03moveax,es:[2510h]将ES作为指定的段基址,以取替默认的段基址DSDS:2F10HAHDS:2F11H2510h和2511h的单元里的16位的数据存放到ax中微机原理及应用第6讲寻址方式之寄存器间接寻址和寄存器相对寻址下面我们来学习寻址方式中的寄存器间接寻址和寄存器相对寻址寻址方式之寄存器间接寻址和寄存器相对寻址首先来看寄存器间接寻址,寄存器间接寻址还是寻址的内存空间,我们将内存空间的偏移地址存放在寄存器中,然后将寄存器放到方括号中,这样得到的寻址方式叫寄存器间接寻址,放到方括号里的寄存器统称为间址寄存器,间址寄存器只有四种寄存器间接寻址寄存器间接寻址寻址的内存空间操作数的偏移地址(有效地址EA)放在寄存器中,且寄存器必须在方括号里方括号里的寄存器间址寄存器分别是BXBPSI和DI,其他八种寄存器是不能放到方括号里用作寄存器间接寻址的,既然寄存器被放入了方括号里,那么它就要有相应的段基址,寄存器间接寻址间址寄存器BXBPSIDI其他八种寄存器不能放到方括号里用作寄存器间接寻址寄存器被放入方括号里要有相应的段基址默认情况下,BX,SI,DI的段基址是DS,BP对应的段基址是SS,寄存器间接寻址间址寄存器BXBPSIDI其他八种寄存器不能放到方括号里用作寄存器间接寻址寄存器被放入方括号里要有相应的段基址DSSS[DS]×10H+[BX]

[DS]×10H+[SI]

[DS]×10H+[DI]相应的内存单元的物理地址的计算公式是段基址后填0再跟寄存器的值相加寄存器间接寻址间址寄存器BXBPSIDI其他八种寄存器不能放到方括号里用作寄存器间接寻址寄存器被放入方括号里要有相应的段基址DS[SS]×10H+[BP]SS了解了寄存器间接寻址的含义,我们来看一下下面几条指令是否正确首先MOVax,[BX]这条指令判断下面几条指令是否正确MOVax,[BX]MOVCL,ES:[DI]MOVAX,[DX]MOVCL,[AX]BX作为间址寄存器被放在了方括号中,所以这条指令是寄存器间接寻址,BX作为4个间址寄存器之一是可以被放入方括号中的,所以这条指令是正确的,MOVax,[BX]寄存器间接寻址,BX作为4个间址寄存器之一是可以被放入方括号中✔×判断下面几条指令是否正确再看下一条,MOVCL,ES:[DI],这里方括号前面的ES加冒号是段超越前缀,可以将内存单元的段基址修改为ES,内存单元的偏移地址是DI的内容判断下面几条指令是否正确MOVax,[BX]MOVCL,ES:[DI]段超越前缀,将内存单元的段基址改为ES,内存单元的偏移地址是DI的内容再来下一条,MOVAX,[DX],这条指令将DX放入了方括号里面是不对的,DX不是间址寄存器不能放入方括号中,所以这条指令是错误的,判断下面几条指令是否正确MOVax,[BX]MOVCL,ES:[DI]MOVAX,[DX]DX不是间址寄存器不能放入方括号中下一条是MOVCL,[AX],同理,由于AX不是间址寄存器所以也不能放入方括号中,这条指令也是错误的判断下面几条指令是否正确MOVax,[BX]MOVCL,ES:[DI]MOVAX,[DX]MOVCL,[AX]AX不是间址寄存器不能放入[]中下面来举一个具体的例子,比如这条指令MOVax逗号SI,SI作为间址寄存器用来存放内存单元的偏移地址,它的值是1200h,所以内存单元的偏移地址是1200h,在默认情况下,SI的段基址是DS,DS的值是6000h,那我们可以基于SI和DS的值,计算内存单元的物理地址为61200hMOVAX,[SI]SI1200H60000H+1200H61200HDS6000H61200h这个单元存放的是44h,它的下一个单元61201h里面存放的是33h,通过move指令,将3344h这个数据传送到了ax中,44H33H…数据段33H44HAX61200HMOVAX,[SI]61201H这条指令执行完毕时,Ax的内容是3344h,其中33h存放到了ah中,44h存放到了al中44H33H…数据段33H44HAX61200HMOVAX,[SI]61201H指令执行完毕时,Ax的内容是3344h33h存放到ah中,44h存放到al中再来看寄存器相对寻址,在寄存器间接寻址的基础上再加上一个位移量就变成了寄存器相对寻址,所以在寄存器相对寻址中,内存单元的偏移地址由间址寄存器的值加上八位或16位的位移量来获得同样,这里的间址寄存器只能时BX,BP和SI,DI当间址寄存器为BX,SI和DI时,默认的段寄存器是ds当间址寄存器为BP时,默认的段寄存器是ss寄存器相对寻址常用于存取表格或者一维数据中的内容我们可以把位移量看成表格的起始地址,把间址寄存器的内容看成查询表格时的下标或者把间址寄存器的内容看成是表格的起始地址,把位移量看成查询表格时的下标寄存器相对寻址在寄存器间接寻址基础再加一个位移量内存单元的偏移地址由间址寄存器的值加上八位或16位的位移量获得寄存器相对寻址同样,这里的间址寄存器只能时BX,BP和SI,DI,间址寄存器BXBPSIDI寄存器相对寻址当间址寄存器为BX,SI和DI时,默认的段寄存器是ds,当间址寄存器为BP时,默认的段寄存器是ssBXBPSIDIDSSS寄存器相对寻址MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BP]VAR默认段寄存器为SS寄存器相对寻址常用于存取表格或者一维数据中的内容,我们可以把位移量看成表格的起始地址,把间址寄存器的内容看成查询表格时的下标。寄存器相对寻址存取表格或一维数据中的内容表格的起始地址查询表格时的下标位移量间址寄存器的内容或者把间址寄存器的内容看成是表格的起始地址,把位移量看成查询表格时的下标寄存器相对寻址存取表格或一维数据中的内容表格的起始地址查询表格时的下标位移量间址寄存器的内容位移量可以放到方括号中,用一个加号跟间址寄存器连接或者放到方括号的前边或者后边都可以位移量放方括号中,用一个加号跟间址寄存器连接放方括号的前边或者后边寄存器相对寻址下面我们再举一个具体的例子,比如说moveax,data[bx]这条指令,在方括号的内部时间址寄存器,在方括号的外面还有位移量data,所以我们知道这是寄存器相对寻址,此时,我们要寻址的内存单元的偏移地址就是data与bx之和,Bx的值是1000h,data是2A00h,那么我们可以计算出来内存单元的偏移地址是3A00h,它默认的段基址是ds,我们拿ds和偏移地址一起计算出物理地址是63A00h,这条指令中目标操作数是AX,因此我们需要传送16位的数据16位的数据来自于物理地址是63A00h的单元和63A01h的单元也就是5566h其中55h会存放到ah中,66h会存放到al中BX1000H60000H+1200H63A00HDS6000Hmoveax,data[bx]DATA2A00H2A00H这条指令中目标操作数是AX,因此我们需要传送16位的数据。16位的数据来自于物理地址是63A00h的单元和63A01h的单元,也就是5566h,其中55h会存放到ah中,66h会存放到al中moveax,data[bx]代码段数据段AHALAXMOV操作码00H2AH…66H55H63A00H63A01H传送16位的数据微机原理及应用第7讲寻址方式之基址变址寻址下面我们来学习寻址方式中基址变址寻址寻址方式之基址变址寻址8086指令集规定bx和bp是基址寄存器,si和di是变址寄存器BXBP基址寄存器SIDI变址寄存器寻址方式之基址变址寻址当内存单元的偏移地址用基址寄存器的值和变址寄存器的值共同构成时,这种寻址方式称为基址变址寻址BXBP基址寄存器SIDI变址寄存器内存单元的偏移地址用基址寄存器和变址寄存器的值共同构成基址变址寻址寻址方式之基址变址寻址基址变址寻址方式要求在指令中不能同时出现两个基址寄存器或者两个变址寄存器同一指令中不能出现两个寄存器BXBP基址寄存器SIDI变址寄存器内存单元的偏移地址用基址寄存器和变址寄存器的值共同构成基址变址寻址我们通过一些例子来巩固一下,第一个例子是MOVAx,[Bx][si],这里的bx是基址寄存器,si是变址寄存器,源操作数中,既有基址寄存器又有变址寄存器,这条指令属于基址变址寻址方式,是正确的例子MOVAX,[BX][SI]基址寄存器变址寄存器既有基址寄存器又有变址寄存器第二条指令是MOVAX,[bx+SI],这条指令中把基址和变址和作为偏移量,所以也属于基址变址寻址例子MOVAX,[BX][SI]基址和变址作为偏移量第三条指令是MOVAX,ES:[BP][DI],括号中BP是基址,DI是变址,前面加上了段超越前缀ES,它是内存单元的段基址指定为附加段,这条指令也是对的例子MOVAX,ES:[BP][DI]基址变址内存单元的段基址指定为附加段下面一条指令moveax,[bx][bp],这里bx和bp都是基址寄存器,不能同时出现,所以这条指令是错误的例子MOVAX,[BX][BP]BX和BP都是基址寄存器最后一条指令是movAx,[di][si]这里di和si都是变址寄存器,不能同时出现,所以这条指令也是错误的例子MOVAX,[BX][BP]DI和SI都是变址寄存器MOVAX,[DI][SI]在基址变址寻址中,要计算内存单元的物理地址先要知道它的段基址基址变址寻址物理地址段基址那我们就看基址寄存器,当基址寄存器是bx时,它默认的段寄存器是ds,它的物理地址是ds左移一位以后跟bx和变址寄存器的值相加基址变址寻址物理地址段基址物理地址:[DS]×10H+[BX]+[SI/DI]基址寄存器为BX,段寄存器用DS当变址寄存器是BP时,它默认的段寄存器是ss,它的物理地址是ss左移一位以后跟bp和变址寄存器的值相加,说到这里我们就可以理解,为什么指令中不能同时出现两个基址或两个变址。如果同时出现两个基址,那么段基址就没有办法确定,究竟是DS还是SS,如果同时出现两个变址,那么段基址就根本没有被指定了。基址变址寻址物理地址段基址物理地址:[DS]×10H+[BX]+[SI/DI]基址寄存器为BX,段寄存器用DS物理地址:[SS]×10H+[BP]+[SI/DI]基址寄存器为BP,段寄存器用SS当然,我们依然可以使用段超越前缀,修改段基址例如,用ES加冒号的方式可以将段基址修改为附加段基址变址寻址物理地址段基址物理地址:[DS]×10H+[BX]+[SI/DI]基址寄存器为BX,段寄存器用DS物理地址:[SS]×10H+[BP]+[SI/DI]基址寄存器为BP,段寄存器用SSMOVAX,ES:[BX][SI]寻址方式使用段跨越前缀时的格式下面我们举一个具体的例子,比如这条指令,MOVAX,[bx][si],这里Bx是基址寄存器,SI是变质寄存器,所以这条指令属于基址变址寻址,由于基址寄存器是bx,那么默认的段基址是DS,我们可以基于已知的数据计算出来内存单元的物理地址是83000h例子MOVAX,[BX][SI]基址寄存器变质寄存器段基址是DS物理地址:83000h物理地址是83000h的内存单元的内容是EEh,物理地址是83001h的内存单元的内容是FFh,这两个单元共同构成的16位数据被存放到ax中,其中ffh存放到ah中,EEh存放在al中例子AHALAXMOV操作码……内存…EEHFFH代码段数据段83000H83001H微机原理及应用下面我们来学习相对基址-变址寻址和隐含寻址,第8讲

寻址方式之相对基址变址

寻址和隐含寻址首先来看相对基址-变址寻址,相对基址-变址寻址是在基址变址寻址的基础上再加上一个相对位移量,其他的注意事项跟基址-变址寻址是相同的寻址方式之相对基址变址寻址和隐含寻址相对基址相对位移量变址寻址两者相同相对位移量比如说两个基址和两个变址不能同时出现在指令中相对基址相对基址相对基址变址寻址变址寻址变址寻址不能同时出现在获取段基址的时候主要看基址寄存器,如果基址寄存器是BX的话,那么默认的段基址是DS,[DS]×10H+[BX]+[SI/DI]+8/16位位移量[DS]×10H+[BX]+[SI/DI]+8/16位位移量基址寄存器段基址如果基址寄存器是BP的话,那么默认的段基址是SS[DS]×10H+[BX]+[SI/DI]+8/16位位移量[DS]×10H+[BX]+[SI/DI]+8/16位位移量[SS]×10H+[BP]+[SI/DI]+8/16位位移量基址寄存器基址寄存器段基址段基址在计算物理地址的时候,要注意,偏移量的成分除了基址和变址以外,还要加上位移量[DS]×10H+[BX]+[SI/DI]+8/16位位移量[SS]×10H+[BP]+[SI/DI]+8/16位位移量基址寄存器基址寄存器段基址段基址

偏移量成分:除基址和变址外,加上位移量位移量在指令中的位置比较灵活,它可以放到基址和变址寄存器的方括号的前面,也可以放到两个方括号的中间,或者是后,还可以放到方括号的内部,用加号跟基址或变址寄存器连接MOVAX,BASE[SI][BX]MOVAX,[BX+BASE][SI]MOVAX,[BX+SI+BASE]MOVAX,[BX]BASE[SI]MOVAX,[BX+SI]BASEBASE为符号地址基址寄存器变址寄存器位移量操作码指令例题下面来看具体的例子比如这条指令moveax,data[bx][di]这里有两个方括号,一个方括号中BX是基址寄存器,另一个方括号中di是变址寄存器,方括号外的data是偏移量,所以这条指令是相对基址变址寻址MOVAX,DATA[BX][DI]若[DS]=8000H,[BX]=2000H,[DI]=1000H,DATA=200H指令执行后:[AH]

[83201H],[AL]

[83200H]基址寄存器变址寄存器偏移量待访问的内存单元的偏移量是由bx加di再加上偏移量data共同构成的,bx是2000h,di是1000h,data是200h,它的偏移地址就是3200h例题MOVAX,DATA[BX][DI]若[DS]=8000H,[BX]=2000H,[DI]=1000H,DATA=200H指令执行后:[AH]

[83201H],[AL]

[83200H]偏移地址由于基础寄存器是bx,所有默认的段基址是dsds的值是8000h8000HDS83200H

+

2000H2000HBX80000H1000HDI1000H200HDATA0200H例题MOVAX,DATA[BX][DI]若[DS]=8000H,[BX]=2000H,[DI]=1000H,DATA=200H指令执行后:[AH]

[83201H],[AL]

[83200H]基础寄存器段基址我们可以计算出内存单元的物理地址是83200h,由于我们要向ax传输数据,所以要选择两个连续的内存单元就是83200h和83201h例题物理地址8000HDS83200H

+

2000H2000HBX80000H1000HDI1000H200HDATA0200HMOV操作码代码段…DDHCCH数据段AHALAX83200H83201H……MOVAX,DATA[BX][DI]若[DS]=8000H,[BX]=2000H,[DI]=1000H,DATA=200H指令执行后:[AH]

[83201H],[AL]

[83200H]将他们的内容分别存放到ax中,其中83201h的内容存放到AH中83200h的内容存放到al中例题8000HDS83200H

+

2000H2000HBX80000H1000HDI10

温馨提示

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

评论

0/150

提交评论