8086汇编寻址方式教程
- 格式:doc
- 大小:47.00 KB
- 文档页数:4
8086对存储器和io端口的编址方式-回复8086微处理器是Intel公司于1979年推出的一款16位微处理器,广泛应用于个人电脑和工业控制系统等领域。
在8086中,存储器和I/O端口被分别编址,下面将一步一步回答关于8086对存储器和I/O端口的编址方式的问题。
一、存储器的编址方式:8086微处理器使用20位地址总线,整个寻址空间范围为1MB(2^20)。
这种编址方式称为“段:偏移”地址形式。
1. 段选择器:在8086中,用于选择段的寄存器有CS(Code Segment, 代码段)、DS (Data Segment, 数据段)、SS(Stack Segment, 栈段)和ES(Extra Segment, 附加段)。
这些寄存器的值是16位的,用于存储存储器段的起始地址,偏移地址的计算需要与这些寄存器的值相结合。
2. 偏移地址:8086通过16位的偏移地址来表示存储器中的特定字节。
偏移地址可以是由程序员指定的常数,也可以是由程序中的地址计算得出的。
3. 存储器地址计算:8086微处理器将段选择器的值左移4位(乘以16),加上偏移地址的值。
例如,当使用DS和SI寄存器来指定一个存储器地址时,计算公式为:物理地址= DS * 16 + SI二、I/O端口的编址方式:8086微处理器使用16位地址总线寻址I/O端口。
I/O端口被视为存储器中的特殊地址,可以访问外部设备。
1. I/O端口地址空间:8086将I/O端口地址空间映射到存储器地址空间的一部分,称为I/O端口地址空间。
I/O端口地址空间的范围为0x0000到0xFFFF,共有65536个端口地址。
2. IN指令:IN指令用于从指定的I/O端口读取数据。
它需要提供一个8位或16位的端口地址。
IN指令执行时,8086将相应的端口地址发送给外部设备,然后接收来自该设备的数据。
例如,以下指令从I/O端口0x01 读取数据:IN AL, 0x013. OUT指令:OUT指令用于向指定的I/O端口写入数据。
传送指令的用法及8086的寻址方法传送指令可以将数据从一个寄存器、内存或端口传送到另一个寄存器、内存或端口。
根据操作数的不同,传送指令可以分为两类:立即传送指令和直接传送指令。
立即传送指令:指令中给出的数据是立即数,直接传送到指定的操作数寄存器、内存或端口。
例如:MOV AX, 1234H;将立即数1234H传送到AX寄存器中。
直接传送指令:指令中给出的是一个地址,指令执行时会将该地址中的数据传送到指定的操作数寄存器、内存或端口。
例如:MOV AX, [BX];将BX寄存器中的偏移地址所指向的字存储单元中的数据传送到AX寄存器中。
8086的寻址方法:8086采用段地址和偏移地址的方式寻址。
在8086CPU中,每个地址由两个部分组成:段地址和偏移地址。
段地址乘以16再加上偏移地址,就是实际的物理地址。
通过将段地址和偏移地址通过两个8位的寄存器组合成16位的地址,来访问任意地址空间。
8086的寻址方式可以分为以下几种:1. 直接寻址:使用一个寄存器或一个立即数来指定一个地址,例如:MOV AX, [BX]。
2. 寄存器间接寻址:使用一个寄存器中存储的地址来访问内存,例如:MOV AX, [SI]。
3. 基址寻址:使用一个基地址加上一个偏移量的方式计算得到一个地址,例如:MOV AX, [BX+SI]。
4. 变址寻址:使用一个变址寄存器中的值来做地址的计算偏移,例如:MOV AX, [DI+1234H]。
5. 相对寻址:使用一个偏移量来计算相对于当前指令地址的距离,例如:JMP SHORT LABEL。
以上这些寻址方式可以对任意的内存地址进行访问,使得8086具有了很好的灵活性和通用性。
汇编(三)——8086的寻址方式指令由操作码和操作数两部分组成。
操作码说明计算机要执行哪种操作,是指令中不可缺少的部分。
操作数是指令执行的参与者,即各种操作对象。
用助记符表达的指令格式通常为:操作码操作数1,操作数2 ;注释双操作数中,操作数2称为源操作数,操作数1称为目的操作数。
一、8086的机器代码格式8086的机器代码(Machine Code)格式,操作码占1个或2个字节,后面的各个字节知名操作数。
其中“mod reg r/m”字节表明殉职操作数的方式,“位移量”字节给出某些寻址方式需要的对基地址的偏移量,“立即数”字节给出立即寻址方式需要的数值本身。
如下图代码指令一般占用1~6个字节,细分如下:其详细的通用指令格式如图:其中第一字节称为操作码字节。
2~7位为操作码(OPCODE),第1位称为D位,指出操作数传输的方向,D=0时,表示第2字节REG字段(第2字节3~5位)给出的寄存器为源操作数寄存器。
D=1时,REG字段指出的寄存器为目标操作数。
第一字节第0位为W位,指出操作数是字节还是字。
W=0表示参加运算的数为字节,W=1表示参加运算的数为字。
8086指令的寻址方式字节编码:二、寻址方式1、立即数寻址方式——指令中的操作imm直接存放在极其代码中,紧跟在操作码之后。
例:MOV AL,05H2、寄存器寻址方式——操作数存放在CPU的内部寄存器reg中,可以是8位寄存器r8:AH/AL/BH/BL/CH/CL/DH/DL;也可以是16位寄存器r16:AX/BX/CX/DX/SI/DI/BP/SP,操作数还可以存放在4个段寄存器seg中:CS/DS/SS/ES。
例:MOV AX,1234H ;源操作数采用寄存器寻址,目的操作数为立即数寻址MOV BX,AX ;两个操作数均为寄存器寻址3、存储器寻址方式——寻址贮存中存储的操作数称为存储器寻址方式,也称为主存寻址方式。
在这种寻址方式下,指令中给出的是有关操作数的主存地址信息。
8086寻址方式及举例8086寻址方式指的是在Intel 8086处理器中进行内存访问的方式。
8086寻址方式主要有以下几种:1. 直接寻址(Direct addressing):给出地址直接访问内存中的数据。
2. 寄存器寻址(Register addressing):使用寄存器中存放的地址进行内存访问。
3. 寄存器间接寻址(Register indirect addressing):使用寄存器中存放的地址作为内存地址的间接寻址方式。
4. 寄存器相对寻址(Register relative addressing):使用一个寄存器中存放的地址作为起始点,加上一个常数作为偏移量。
5. 基址加变址寻址(Base + index addressing):使用基址寄存器和变址寄存器相加得到内存地址。
6. 相对基址加变址寻址(Base + index + offset addressing):使用基址寄存器、变址寄存器和一个常数作为偏移量相加得到内存地址。
举例:1. 直接寻址: MOV AX, [1000H] 表示将内存地址为1000H的数据复制到AX寄存器中。
2. 寄存器寻址: MOV AX, BX 表示将BX寄存器中的数据复制到AX寄存器中。
3. 寄存器间接寻址: MOV AX, [BX] 表示将内存地址为BX寄存器中的数据所指向的内存单元中的数据复制到AX寄存器中。
4. 寄存器相对寻址: MOV AX, [BX+2] 表示将内存地址为BX寄存器中的数据加上2所得到的地址中的数据复制到AX寄存器中。
5. 基址加变址寻址: MOV AX, [BX+SI] 表示将基址寄存器BX和变址寄存器SI中的数据相加得到的地址中的数据复制到AX寄存器中。
6. 相对基址加变址寻址: MOV AX, [BX+SI+2] 表示将基址寄存器BX和变址寄存器SI中的数据相加得到的地址再加上2所得到的地址中的数据复制到AX寄存器中。
第三章 8086指令系统和寻址方式(一)3.1 汇编语言程序格式介绍两条常用指令:MOV 和 ADD•MOV dst, src ; (dst) (src)↑↑↑助记符目的源操作数操作数例: MOV AH,BL MOV AX,1234H•ADD dst, src ; (dst) (dst)+(src)↑↑↑助记符目的源操作数操作数例: ADD AL,36H ADD BX,CX1.一个简单程序实例;THE FORM OF AN ASSEMBLY LANGUAGE PROGRAMSTSEG SEGMENTDB 64 DUP(?)STSEG ENDS;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -DTSEG SEGMENTDATA1 DB 36HDATA2 DB 4BHSUM DB ?DTSEG ENDS;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -CDSEG SEGMENTMAIN PROC FAR ;this is the program entry pointASSUME CS:CDSEG,DS:DTSEG,SS:STSEGSTART: MOV AX,DTSEG ;load the data segment addressMOV DS,AX ;assign value to DSMOV AL,DATA1 ;get the first operandMOV BL,DATA2 ;get the second operandADD AL,BL ;add the operandsMOV SUM,AL ;store result in location SUMMOV AH,4CH ;set up toINT 21H ;return to DOSMAIN ENDPCDSEG ENDSEND START ;this is the program exit point1)汇编语句组成四个域:[标号:] 助记符 [操作数] [;注释]如: DATA1 DB 36H;变量-----数据的符号地址START: MOV AX, DTSEG ;标号----- 指令的符号地址2)伪指令(伪操作)伪指令是汇编程序对源程序进行汇编时处理的操作命令。
8086/8088七种寻址方式(一)8086/8088寄存器组(二)8086/8088寻址方式(1)立即寻址方式操作数就包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段。
这种操作数称为立即数,立即数可以是8位的也可以是16位的,如果立即数是16位的按“高高低低”的原则。
例如指令:MOV AX,1234H的存储和执行情况如下图:图中指令存放在代码段中,OP表示该指令的操作码部分再例如:MOV AL,5 则指令执行行,(AL)=05HMOV BX,3064H 则指令执行后,(BX)=3064H(2)寄存器寻址方式操作数在CPU内部的寄存器中,指令指定寄存器号。
对于16位操作数,寄存器可以是:AX,BX,CX,DX,SI,DI,SP,和BP等:对于8位数,寄存器可以是:AL,AH,BL,BH,CL,CH,DL,DH。
这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运算速度。
例如:MOV AX,BX如指令执行前(AX)=3064H,(BX)=1234H;则指令执行后,(AX)=1234H,(BX)保持不变例如:MOV SI,AXMOV AL,DH(3)直接寻址方式操作数在寄存器中,指令直接包含有操作数的有效地址(偏移地址)。
操作数一般存放在数据段所以操作数的地址由DS加上指令中直接给出的16位偏移得到。
如果采用段超越前缀,则操作数也可含在数据段外的其他段中。
如下图所示:在汇编语言指令中,可以用符叼地址代替数值地址。
如:MOV AX,VALUE此时VALUE为存放操作数单元的符号地址。
如写成:MOV AX,[VALUE]也是可以的,两者是相等的。
如VALUE在附加段中,则应指定段超越前缀如下:MOV AX,ES:VALUE或MOV AX,ES:[VALUE]直接寻址方式常用于处理单个存储器变量的情况。
它可实现在64K字节的段内寻找操作数。
直接寻址的操作数通常是程序使用的变量。
8086汇编寻址方式教程
对于汇编语言,寻址方式绝对是最核心的一个部分,但是纷乱复杂的寻址方式又常常让人找不到方向和思路。
所以今天我整理出一份教程,希望对初学者的学习能有所帮助。
一.寻址目的
所谓寻址,就是按照一定的规则寻找操作数。
这个基本概念一定要搞清楚,不要云里雾里记了一大堆都不知道是找什么的。
二.操作数可以存在什么地方?
⑴操作数存在于指令代码中,处理器译码时就立即获得了这个操作数,这就是立即(数)寻址方式。
汇编指令中,这个立即数(操作数)以常量形式出现。
⑵操作数存在于处理器内部寄存器中,处理器从寄存器中获得这个操作数,这就是寄存器寻址方式。
汇编指令中,这个寄存器操作数以寄存器名形式出现。
⑶操作数存在于主存中,处理器从主存单元获得这个操作数,这就是存储器寻址方式。
汇编指令中,这个存储器操作数以主存地址形式出现。
三.逻辑地址。
8086/8088处理器的主存地址在程序设计时采用逻辑地址。
逻辑地址分成段地址和偏移地址两部分。
(这个一定想清楚,寻址在逻辑地址范围内,而不是直接在物理地址上查找。
可以把存储系统看做一个黑匣子,我们程序员只考虑4g的寻址范围,具体怎么映射到物理地址上面,这是OS的任务,我们不必考虑)。
存储器寻址方式表达存储器地址时,段地址在默认的或段超越前缀指令指定的段寄存器中,偏移地址被称为有效地址EA(Effective Address)。
有效地址用中括号括起来。
四.对寻址方式有个整体印象
⑴有效地址直接给出,存在于指令代码中,就是直接寻址方式。
⑵有效地址存在寄存器中,就是通过寄存器的间接寻址方式。
⑶有效地址是两部分的和,一部分在基址(变址)寄存器中,另一部分直接给出(称为位移量),这就是基址(变址)寻址方式。
⑷有效地址是两部分的和,一部分在基址寄存器中(8086是BX和BP),另一部分在变址寄存器中(8086是SI和DI),这就是基址变址寻址方式。
⑸有效地址是三部分的和,第一部分在基址寄存器中(8086是BX 和BP),第二部分在变址寄存器中(8086是SI和DI),第三部分直接给出(称为位移量),这就是相对基址变址寻址方式。
五.寻址方式详细解读(要求:要记住脉络,理解寻址流程,脑子中能有图,最后记住关键点)
1. 立即寻址
立即寻址方式用来表示常数,它主要用于给寄存器赋初值,注意:只能用于源操
作数字段,不能用于目的操作数字段。
例1 MOV AL,5
2.直接寻址
在IBM PC机中将操作数的偏移地址称为有效地址EA。
在直接寻址方式中有效地址EA就在指令中,它存放在代码段中指令操作码之后,但操作数一般存放在数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数.
如操作数在数据段中,则物理地址=16d×(DS)十EA。
1BMPC机中允许数据存放在数据段以外的其他段中,此时应在指令中指定段跨越前缀,在计算物理地址时应使用指定的段寄存器。
例4 mov AX ,[2000H]
(DS)=3000H,地址32000H中的值为3050H则,执行结果为;(Ax)=3050H
因为实际mov AX中的内容为16d * (Ds) +2000H=32000H
在汇编语言指令中,可以用符号地址代替数值地址,如:
MOV AX,V ALUE
此时V AIUE为存放操作数单元的符号地址。
如写成
MOV AX,[V ALUE]
也是可以的.两者是等效的。
如果V ALUE在附加段中,则应该指定段跨越前缀如下;
MOV AX,ES:V ALUE
或MOV AX,ES:[V ALUE]
直接寻址方式适用于处理单个变量,例如需要处理某个存放在存储器里的变量,可用直接寻址方式,将该变量先取到一个寄存器中,然后在做处理。
IBM PC机规定:除在双操作数中,除立即数外,必须有一个操作数使用寄存器方式。
这也是一个常量常常送到寄存器去的原因。
3.寄存器间接址
操作数的有效地址在基址寄存器BX、BP或变垃寄存器SI、DI中,而操作数则在存储器中,如下图所示。
a.如果指令中指定的寄存器是BX、SI、DI,则操作数在数据段(DS)中,所以用DS寄存器的内容作为段地址,即操作数的物理地址为:
物理地址=16d×(DS)十(BX)
或物理地址;16 d×(DS)十(SI)
或物理地址=16d×(DS)十(DI)
b.如指令中指定SP寄存器,则操作数在堆栈段(SS)中,段地址在SS中,所以操作数的物理地址为:
物理地址=16d×(SS)十(SP)
MOV AX ,[BX]
如果(DS)=2000H ,(BX)=1000H 则
物理地址=16d×(DS)十(BX) = 20000H+1000H = 21000H
21000H地址里的内容为50A0H则执行结果为:(AX)=50A0H
c.指令中也可指定段跨越前缀来取得其他段中的数据。
如;
MOV AX,ES:[BX]
这种寻址方式可以用于表格处理,执行完一条指令后,只需要修改寄存器内容就可取出表格中的下一项。
4.寄存器相对寻址方式
操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量之和。
即
| (BX)
EA =| (BP) + 8位或者16位的位移量
| (SI)
| (DI)
同寄存器寻址一样BX BP DI 若没有段跨越前缀物理地址为=16d×(DS) +位移量+*
SP
物理地址为=16d×(SS)十(SP) + 位移量+ *
举个例子:
MOV AX,COUNT[SI] (也可表示为MOv AX,[COUKT十SI]
其中,COUNT 为16位位移量的符号地址。
如果(DS)=3000H,(SI)=2000H COUNT=3000H
则物理地址=30000十2000十3000 =35000H
5.基址变址寻址方式
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。
两个寄存器均由指令指定。
如果基址寄存器为BX,段寄存器使用DS;如基址寄存器为BP 时,段寄存器则用SS。
因此,物理地址为:
= 16D * DS + (BX) + SI(或者DI)
= 16D * SS + (BP) + SI(或者DI)
6.相对基址变址寻址方式
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之
和。
同样,当基址寄存器为BX时,使用DS段寄存器;而当基址寄存器为BP 时,则使用SS为段寄存器。
因此物理地址为:
= 16d * DS + BX + SI + 位移量(8位或16位)
= 16d * ss + BP + SI + 位移量(8位或16位)
刨MOV AX,MASK[BX][SI]
(也可以写成M0V AX,MASK[DX十SI]
或MoV AX.[MASK十BX十SI] )
如(DS)=3000H,(BX)=2000H、(SI)=l000H,MASK=0250H,
则物理地址=16d×(DS)十(BX)十(SI)十MASK
=30000十2000十1000十0250
=33250H
六.区别各种寻址方式时,注意各自的特点。
只有一个常量,是立即(数)寻址方式;
只有一个寄存器名,是寄存器寻址方式;
其他,则是存储器寻址方式。
用中括号括起一个常量,是直接寻址方式;
用中括号括起一个寄存器名,是寄存器间接寻址方式;
用中括号括起一个基址(变址)寄存器名和一个常量,是基址(变址)寻址方式;
用中括号括起两个寄存器名,是基址变址寻址方式;
用中括号括起两个寄存器名和一个常量,是相对基址变址寻址方式。
七. 其他说明
汇编语句中,上面的形式还可以有别的写法,多数很容易就能识别出意思,个别不理解的应进一步参考手册,几个例子如下:
位移量可用符号表示:
MOV AX,[SI+COUNT]
;COUNT是事先定义的变量或常量(就是数值)
MOV AX,[BX+SI+WNUM] ;WNUM是变量或常量
同一寻址方式可以写成不同的形式:
MOV AX,[BX][SI] ;MOV AX,[BX+SI]
MOV AX,COUNT[SI] ;MOV AX,[SI+COUNT]
MOV AX,WNUM[BX][SI]
;等同于MOV AX,WNUM[BX+SI]
;等同于MOV AX,[BX+SI+WNUM。