汇编寻址方式总结
- 格式:ppt
- 大小:387.50 KB
- 文档页数:11
汇编中的各种寻址方式(2011-11-18 11:41:32)转载▼标签:杂谈1,立即寻址方式操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段,这种操作数成为立即数。
例:mov al,5 执行完指令后al的值为05h2,寄存器寻址方式操作数在寄存器中,指令指定寄存器号。
例:mov ax,bx3,直接寻址方式操作数的有效地址包含位移量的一种成分,其值就存放在中指令的操作码之后。
例:mov ax,[2000h]在汇编语言指令中,可以用符号地址代替数值地址。
如:mov ax,valuevalue为存放操作数单元的符号地址。
如:mov ax,[value]4,寄存器间间接寻址操作数的有效地址只包含基址寄存器内容或变址寄存器内容的一种成分。
例:mov ax,[bx]如果(DS)=2000h,(bx)=1000h则物理地址=20000+1000=21000h5,寄存器相对寻址方式(或称直接变址寻址方式)操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位移量之和,所以有效地址由两种成分组成。
例:mov ax,count[si](也可以表示为mov ax,[count+si])6,基址变址寻址方式操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,所以有效地址由两种成分组成。
例:mov ax,[bx][di](或写为:mov ax,[bx+di])此类寻址方式使用段跨越前缀的格式为:mov ax,es:[bx][di]7,相对基址变址寻址方式操作数得意偶小弟值基址寄存器和一个变址寄存器的内容和指令中指定的位移量之和,所以有效地址由三种成分组成。
例:mov ax,mask[bx][si](也可写为mov ax,mask[bx+si]或者mov ax,[mask+bx+si])8,比例变址寻址方式操作数的有效地址是变址寄存器的内容乘以指令中指定的比例银子再加上位移量之和,所以由三种成分组成。
汇编的7种寻址⽅式
今天⼤三第⼀次写汇编的博客,希望读者,热爱计算机技术的兄弟姐妹们多多⽀持。
另外⼤家有什莫不懂得可以留⾔哦,哈哈哈
我们今天来讲讲汇编的7种寻址⽅式,今天讲前两类
主体分为三类:⽴即寻址,寄存器寻址,存储器寻址(存储器寻址有专门的寄存器,基址寄存器bx,bp;变址寄存器si,di
汇编的主要原理:1.寻址⽅式,2.⼀切问题⽤内存的原理去分析,就是忽略语⾔,去考虑怎末设计解决问题,
并判断问题的对错与否。
1.⽴即寻址:操作数在指令中直接给出
eg:
mov DST,SRC (DST是⽬的操作数,SRC是源操作数)
此时⽴即寻址的话,SRC应写成⽴即数
举例:mov ax,3 mov bx,45
注:DST,SRC的字长是⼀样的
2.寄存器寻址:把操作数放在寄存器中进⾏运算
eg:
mov ax,bx ;解释把(bx)之中的内容放到(ax)之中去,且bx中的内容是数字,这⾥“()”表⽰取内容的意思
练习和思考题
判断语句是否正确?为什莫?
1.mov al,-234
不正确,因为8进制带符号数能表⽰的范围是-128~127,⽽al是8为的寄存器,所以错误2.mov al,23
mov dx,al
第⼆条语句不正确,因为类型不匹配,dx是16位,al是8位的。
第二章寻址方式在8086微处理器中,一条指令通常由操作码加上操作数构成。
指令形式为:操作码[操作数1], [操作数2]; 注释其中,操作码指明执行的动作,操作数指明操作的对象。
由于寄存器数量有限,操作数不可能都放在寄存器中,实际上,操作数既可以放在寄存器中,也可以放在主存贮器中,这样就涉及到操作数的寻址问题。
我们将寻址操作数存放地址的方式称为寻址方式。
本章的内容包括:主存储器和物理地址的形成寻址方式常量与变量的定义2.1 主存贮器和物理地址的形成一、主存贮器计算机存贮系统分为:主存贮器(内存)、辅助存贮器(外存)。
●主存容量小、存取速度快、价格高;●辅存容量大、存取速度慢、价格低。
主存贮器的基本存贮单位是“位”(bit ),每8位组合成一个“字节”;每相邻的两个字节称为“字”;相邻的四个字节称为“双字”。
为了区别各个存贮单元,给每个单元编号,称为地址。
地址:字节单元的编号,也称为物理地址。
低字节放低位,高字节放高位。
例如:0004单元存放内容为1234H 。
0 10FFFFFH 低地址 高地址 从0~0FFFFFH ,共有220个单元,20根地址线。
表示:(0004)字=1234H二、存储器物理地址的形成早期的8086微处理器,有20根地址线,寻址范围2^20 = 1M 字节。
但是,8086内部为16位结构,与地址相关的寄存器均为16位,从而导致可寻址范围为64K。
因此,设计成为将主存分段使用,每段最大为64K字节。
用CS、DS、SS、ES保存当前可用段的段首地址。
规定:段首地址只能从任一“小段”的首地址开始,也就是必须最低4位为0,如果所有的段首地址都是这样,则可以忽略最低4位,而只将高16位放到段寄存器中。
因此,计算物理地址时,应将段寄存器内容左移4位,恢复段首址原值,然后再与本段中待访问单元的偏移地址相加,得到访问单元的物理地址。
因此,被访问单元物理地址PA = 段首址*16+偏移地址。
各种寻址方式1. 立即寻址:直接放在指令中的常数称为立即数,立即数只能是源操作数,立即数存放在指令操作码之后的存储单元中。
例:MOV AL,50HMOV DS, 1250H 错误2. 寄存器寻址:存放在寄存器中的数据为操作数,寄存器操作数可以是源操作数,也可以是目的操作数。
例:MOV AL,BLMOV CL, BX 错误以下寻址方式3~8,操作数都在存储器中。
存储器操作数具有类型属性,如字节(BYTE)、字(WORD)、双字(DWORD)等,反映了数据占用存储单元的字节数,指令书写中,约定用方括号内容表示存储器操作数的偏移地址;用类型名 PTR 偏移地址的形式说明指令中存储器操作数的类型,例:WORD PTR [1000H];用变量名DB/DW/DD数据序列的形式分别定义具有“变量名”的字节、字或双字存储器操作数,如BUF DB 10H,20H。
3. 存储器寻址(1)直接寻址:存储器操作数的16位偏移地址直接包含在指令的方括号中。
例:MOV AL,[1000H] 约定由DS提供段地址MOV AL,CS:[1000H] ;段超越,由CS提供段地址MOV AL,SS:[1000H] ;段超越,由SS提供段地址例:MOV AX, [2000H] 如果(DS)= 3000H,则AX的物理首地址为:3000*10+2000(2)寄存器间接寻址:操作数所在的存储单元的偏移地址放在指令给出的寄存器中。
可用于这种寻址方式的寄存器只能是SI、DI、BP和BX。
其中,SI、DI、BX约定的段寄存器是DS,而BP约定的段寄存器SS。
例:MOV AX,[SI] ;AX←DS:[SI]MOV [BX],AX ;DS:[BX]←AX例:MOV AX, [BX]如果(DS)= 2000H, (BX)= 1000H,则物理地址 = 20000H + 1000H = 21000H(3)寄存器相对寻址这种寻址方式通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址,计算物理地址的缺省段仍然是SI、DI和BX为DS,BP为SS。
在汇编语言中,寻址方式指的是指令如何访问内存中的操作数或数据。
不同的处理器体系结构支持不同的寻址方式。
以下是一些常见的寻址方式:立即寻址(Immediate Addressing):操作数直接包含在指令中。
例如:MOV AX, 5 ; 将寄存器AX 设置为立即数5寄存器寻址(Register Addressing):操作数位于寄存器中。
例如:MOV AX, BX ; 将寄存器BX 的值移动到寄存器AX直接寻址(Direct Addressing):操作数的地址直接指定在指令中。
例如:MOV AX, [1234] ; 将内存地址1234 处的数据移动到寄存器AX寄存器间接寻址(Register Indirect Addressing):指令中包含一个寄存器,该寄存器包含操作数的地址。
例如:MOV AX, [BX] ; 将寄存器BX 中存储的地址处的数据移动到寄存器AX基址寻址(Base Addressing):使用基址寄存器加上一个偏移量来计算内存地址。
例如:MOV AX, [BX + 10] ; 将寄存器BX 加上偏移量10 后的地址处的数据移动到寄存器AX相对寻址(Relative Addressing):操作数的地址是相对于当前指令位置的偏移量。
例如:JMP label_name ; 无条件跳转到标签label_name 处变址寻址(Indexed Addressing):使用一个寄存器的值作为基址,另一个寄存器的值作为偏移量。
例如:MOV AX, [SI + DI] ; 将寄存器SI 和DI 中的值相加,然后将结果作为地址处的数据移动到寄存器AX相对基址寻址(Relative Base Addressing):使用基址寄存器和相对偏移量的组合。
例如:MOV AX, [BX + 10] ; 将寄存器BX 加上偏移量10 后的地址处的数据移动到寄存器AX这只是一些基本的寻址方式,具体的汇编语言和处理器架构可能会有其他特定的寻址方式。
汇编语言重点知识总结汇编语言是一种低级程序设计语言,它直接操作计算机硬件资源,具有较高的执行效率和灵活性。
本文将重点总结汇编语言的相关知识,涵盖指令集、寻址模式、数据传送和运算、控制流等方面。
一、指令集1. 数据传送指令:包括MOV、LEA等指令,用于在寄存器和内存之间传输数据。
2. 算术运算指令:包括ADD、SUB、MUL、DIV等指令,用于进行加减乘除等数值运算。
3. 逻辑运算指令:包括AND、OR、NOT等指令,用于进行逻辑与、逻辑或、逻辑非等操作。
4. 跳转指令:包括JMP、JZ、JE等指令,用于实现程序的跳转和条件判断。
5. 栈操作指令:包括PUSH、POP等指令,用于实现数据的入栈和出栈操作。
6. 串操作指令:包括MOVSB、CMPSB等指令,用于字符串的复制、比较等操作。
二、寻址模式1. 直接寻址:使用给定的地址访问内存中的数据,如MOV AX, [1234H]。
2. 寄存器间接寻址:使用寄存器中存储的地址访问内存中的数据,如MOV BX, [SI]。
3. 寄存器相对寻址:使用寄存器和偏移量的组合访问内存中的数据,如MOV CX, [BX+DI]。
4. 基址变址寻址:使用基址寄存器和变址寄存器的组合访问内存中的数据,如MOV AX, [BX+SI+10H]。
5. 相对基址变址寻址:使用基址寄存器、变址寄存器和偏移量的组合访问内存中的数据,如MOV AX, [BX+SI+10H+DI]。
三、数据传送和运算1. 数据传送:使用MOV指令将数据从一个位置传送到另一个位置,如MOV AX, BX。
2. 位操作:使用AND、OR、XOR等指令进行位与、位或、位异或等操作。
3. 算术运算:使用ADD、SUB、MUL、DIV等指令进行加减乘除等运算。
4. 位移操作:使用SHL、SHR、ROL、ROR等指令进行位左移、位右移、循环左移、循环右移等操作。
四、控制流1. 无条件跳转:使用JMP指令无条件跳转到指定的地址。
一汇编入门精髓(转)寄存器和寻址方式2010-03-20 13:01寄存器和寻址方式寄存器,在8086/8088里,有三组共13个16位寄存器.寄存器,从名字上看,可以知道,它就象书店的行包寄存处,寄存器的名字就象寄存处发给用户取回自已物件的标志牌子,表示物件的存放地址.寄存器的内部给构都相同,只不过是一个二字节或一字节的存储空间,别看他们小,作用可大了,所有电脑的运算,都要从他们过关,因为他们的处理速度快嘛.为了区分和准确运用,就要给他们进行科学的分组和起名.第一组,数据寄存器,AX,BX,CX,DX.其中,X表示一个未知数,那么这些寄存器都可以用来存放数据,ABCD,虽说都可以理解为一个顺序号,但是,A还是加法ADD的简称,所以AX叫累加器,B是基地址的简称,所以BX可以叫基地址寄存器,C是计数器的简称,所以CX可以叫做计数器.D是数据DATA的简称,所以DX可以叫数据寄存器.这四个寄存都可以按高八位和低八位分成两个寄存器:AH,AL,BH,BL,CH,CL,DH,DL.第二组,地址指示和变址寄存器,SI,DI,BP,SP.它们用来表示一个地址偏移,或用来表示一个地址的变化状况.SI,DI都可以表示变址,在串操作中,SI和DI表示源和目的操作数的指示器,快速记忆方法:SI联想饮水思源的思(谐音SI),DI联想目的(谐音DI).BP,SP的P表示堆栈专用,BP表示基地址专用,SP则是堆栈顶指示器.其中,BP,SI,DI还可以兼作数据寄存器.SP则只能和堆栈绑定.第三组,段寄存器,CS,SS,DS,ES.它们用来存放CPU可以直接访问的四个当前段的段首地址.CS代码段,SS堆栈段,DS数据段,ES附加段.其中,在表示地址时,CS和指令指示器IP绑定使用,SS 和BP绑定.DS为SI,DI,BX共用.第四组,指令指示器,IP,这是CPU自动引用的,表示下一次要从主存取出的指令的偏移.寻址方式寻址方式分为六种,(这是教材里讲的).1,立即寻址, 数据的本身在代码段.用于赋初值.2,直接寻址, 数据的偏移在代码段,用于变量名.3,寄存器寻址, 数据的本身在寄存器.用寄存器名表示.4,寄存器相对寻址, 数据的偏移在寄存器.注意:BP和SS绑定.DS为SI,DI,BX 共用.5,变址寻址, 数据的偏移在一个寄存器里,并要加上一个偏移量.注意:BP和SS绑定.DS为SI,DI,BX共用.6,基址加变址寻址, 数据的偏移放在两个寄存器中,并要加上一个偏移量.注意:BP和SS绑定.DS为SI,DI,BX共用.BX为DS段的基址专用.寻址方式是汇编语言的重点和难点。
x86汇编指令整理1,寻址⽅式1,⽴即数寻址MOV AX, 0102H ;AX←0102H2、寄存器寻址⽅式指令中指明某个寄存器其内容即为操作数,寄存器在CPU内,不⽤总线周期,执⾏速度快。
8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4个段寄存器seg:CS、DS、SS、ESMOV AX, BX ;AX←BX3,直接寻址⽅式指令中直接给出操作数所在内存单元的有效地址(EA即偏移地址)默认的段地址在DS段寄存器,若在其它段可使⽤段超越前缀改变。
⽤⽅括号包含有效地址,表达存储单元的内容直接地址也可⽤标号代表,⽅括号可省略。
MOV AX, [2000H] ;AX←DS:[2000H]MOV AX, ES: [2000H] ;AX←ES:[2000H]4、寄存器间接寻址⽅式指令中给出的寄存器的内容包含操作数的有效地址。
间接寻址中使⽤的寄存器名要⽤⽅括号括起来1、基址寻址⽤BX或BP作间接寻址寄存器如:MOV AX,[BX] ;隐含在DS段MOV AX,[BP] ;隐含在SS段2、变址寻址⽤SI或DI作间接寻址寄存器如:MOV CL, [SI]MOV AX, [DI]单独使⽤SI或DI时,隐含在DS段中在串操作时,SI隐含在DS段中,DI隐含在ES段中。
3、相对基址寻址指令中给出基址寄存器及位移量,⼆者之和为操作数的有效地址。
位移量可以是8位或16位。
有效地址=BX/BP+8/16位位移量4、相对变址寻址指令中给出变址寄存器及位移量,⼆者之和为操作数的有效地址。
有效地址=SI/DI+8/16位位移量段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可⽤段超越前缀改变MOV AX, [SI+06H] ;AX←DS:[SI+06H]MOV AX, 06H[SI] ;AX←DS:[SI+06H]5、基址变址寻址⽅式有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:有效地址=BX/BP+SI/DI段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可⽤段超越前缀改变 MOV AX, [BX+SI] ;AX←DS:[BX+SI]MOV AX, [BX][SI] ;AX←DS:[BX+SI]6、相对基址变址寻址⽅式有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与⼀个8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可⽤段超越前缀改变 MOV AX, [BX+DI+6] ;AX←DS:[BX+DI+6]MOV AX, 6[BX+DI] MOV AX, 6[BX][DI]各种寻址⽅式综合举例设BX=1200H DI=10A0H 位移量=2BC0HDS=2400H 求各种寻址⽅式下的有效地址和物理地址。
汇编语⾔-寻址⽅式-地址和数据相关的寻址⽅式数据相关的寻址⽅式1 ⽴即寻址⽅式直接使⽤⽴即数来处理mov al,5mov ax,3064H2 寄存器寻址⽅式操作数在寄存器中,直接使⽤寄存器赋值来读取内部的操作数。
另外的⽅式的简介:在8086中把操作数的偏移地址称为有效地址,以下的操作都是取得有效地址(EA)的不同途径。
有效地址可以由以下四种成分:位移量(displacement):存放的是⼀个地址。
基址(base):基址部分,通常⽤来指数据段中数据或字符串的⾸地址变址(index):存放在变址寄存器中的内容。
通常⽤来访问数组中的某个元素或字符串的某个字符。
⽐例因⼦(scale factor):是386新增加的寻址⽅式的术语,值可为1,2,4,8在寻址中,可⽤变址寄存器内容乘以⽐例因⼦来取得变址值。
有效地址的计算公式可⽤由以下来处理:EA = 基址 + (变址 X ⽐例因⼦) + 位移量除了⽐例因⼦固定,其它三个都可以有正负。
四种成分16位寻址32位寻址位移量0,8,16位0,8,32位基址寄存器BX,BP任何32位通⽤寄存器变址寄存器SI,DI除ESP外的32位通⽤寄存器⽐例因⼦⽆1,2,4,8表格⼀默认段选择规则访存类型所⽤段及段寄存器却省选择规则指令代码段 CS寄存器⽤于取指堆栈堆栈段 SS寄存器所有的堆栈的进栈和出栈,任何⽤ESP或EBP作为基址寄存器的访问局部数据数据段 DS寄存器除相对于堆栈以及串处理指令的⽬的以外的所有数据访问⽬的串附加数据段 ES寄存器串处理指令的⽬的串表格⼆3 直接寻址⽅式操作数的有效地址只包含位移量这⼀种成分。
值就在代码段中指令的操作码之后。
也就是位移量就是操作数的有效地址。
;假设(ds) = 3050Hmov ax,[0000] ;就是把内存在3050:0000内存的数据传送到ax中也可以⽤符号地址代替数值地址⽐如mov ax,[VALUE];就是把value的3050:value将value替换为数据跟上⼀样也可以⽤指定段寄存器来作为段地址也是可以的。
汇编的8种寻址⽅式,以及2个默认段寄存器16位CPU所含有的寄存器有(见图2.1中16位寄存器部分):4个数据寄存器(AX、BX、CX和DX)2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) ,32位CPU增加2个16位的段寄存器:FS和GS。
4个段寄存器(ES、CS、SS和DS)1个指令指针寄存器(IP) 1个标志寄存器(Flags)⼀共14个寄存器,或者16个16位CPU内部有20根地址线,其编码区间为:0000H~FFFFFH,所以,它可直接访问的物理空间为1M(220)字节。
如果⽤16位寄存器来访问内存的话,则只能访问内存的最低端的64K,其它的内存将⽆法访问。
为了能⽤16位寄存器来有效地访问1M的存储空间,16位CPU采⽤了内存分段的管理模式,并引⽤段寄存器的概念。
个⼈猜测:堆栈有1M的限制,是不是因为这个历史原因?物理地址PA=段地址×16 + 偏移量(Offset)有效地址EA=Effective Address(段内偏移)CS:IP段寄存器CS指向存放程序的内存段,IP是⽤来存放下条待执⾏的指令在该段的偏移量,把它们合在⼀起可在该内存段内取到下次要执⾏的指令。
SS:SP段寄存器SS指向⽤于堆栈的内存段,SP是⽤来指向该堆栈的栈顶,把它们合在⼀起可访问栈顶单元。
另外,当偏移量⽤到了指针寄存器BP,则其缺省的段寄存器也是SS,并且⽤BP可访问整个堆栈,不仅仅是只访问栈顶。
DS:ALL段寄存器DS指向数据段,ES指向附加段,在存取操作数时,⼆者之⼀和⼀个偏移量合并就可得到存储单元的物理地址。
该偏移量可以是具体数值、符号地址和指针寄存器的值等之⼀,具体情况将由指令的寻址⽅式来决定。
ES:DI在进⾏串操作时,其⽬的地址的段寄存器规定为ES总结:程序频繁访问的数据段⽤DS来指向,不太经常访问的数据段可⽤ES、FS和GS等来指向。
1.⽴即寻址⽅式 MOV AH, 80H(直接给寄存器赋值)2. 寄存器寻址⽅式(源或者⽬的有⼀个是寄存器)2.1) 源操作数是寄存器寻址⽅式如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。