寄存器与7种寻址方式
- 格式:wps
- 大小:43.50 KB
- 文档页数:7
单片机寻址方式单片机(Microcontroller Unit,简称MCU)是一种在一个芯片上集成了微处理器核心、存储器(ROM、RAM)、I/O端口和定时器等功能部件的嵌入式系统。
单片机广泛应用于各个领域,如电子产品、通信设备、汽车电子等。
而在单片机的设计和开发过程中,了解单片机的寻址方式是非常重要的。
一、直接寻址方式直接寻址方式是单片机最常用的寻址方式之一。
在直接寻址方式中,程序直接通过指令操作数给出操作的地址。
例如,下面是一个示例代码:MOV A, 0AH这条指令将0AH这个值存入寄存器A中。
在这里,0AH是操作数,它直接给出了要操作的地址。
这种寻址方式简单明了,适合对于特定地址的直接操作。
二、寄存器间接寻址方式寄存器间接寻址方式是通过一个寄存器给出操作数的地址。
在单片机中,常用的寄存器间接寻址方式有两个:累加器间接寻址和数据指针间接寻址。
1. 累加器间接寻址方式累加器间接寻址方式是将累加器中的内容作为操作数的地址。
例如,下面是一个示例代码:MOV A, R0这条指令将R0寄存器中的值存入寄存器A中。
在这里,R0是累加器,它给出了要操作的地址。
这种寻址方式可以灵活运用,适合于累加器与其他寄存器之间的数据传输。
2. 数据指针间接寻址方式数据指针间接寻址方式是通过数据指针来给出操作数的地址。
单片机中有两个数据指针,分别是DPTR(数据指针寄存器)和R1R0(寄存器对)。
三、立即寻址方式立即寻址方式是将操作数直接嵌入到指令中。
在单片机中,立即寻址方式一般适用于操作数的值较小且在指令中可以直接表示的情况。
例如,下面是一个示例代码:MOV A, #05H这条指令将值05H存入寄存器A中。
在这里,#05H表示操作数的立即数值。
这种寻址方式简洁高效,适合于常量或者临时数据的操作。
四、间接寻址方式间接寻址方式是通过一个指向操作数的地址的指针来实现的。
在单片机中,常用的间接寻址方式有两个:直接间接寻址和寄存器间接寻址。
8051单片机寻址方式8051单片机共有7种寻址方式。
寻址方式是指令中确定操作数的形式,用来确定操作数所处的存储空间。
1.立即寻址:在指令中直接给出操作数MOV A, #80H 8位操作数MOV A, #2000H 16位操作数2.直接寻址:指令中直接给出操作数地址(1)SFR,这一存储空间只能使用直接寻址MOV PSW, #50H(2)内部数据RAM,这一存储空间可以使用直接寻址和寄存器间接寻址MOV A, 30H3.寄存器寻址:以通用寄存器的内容作为操作数(通用寄存器包括A, B, DPTR, R0~R7)INC DPTR注意:A、B既是通用寄存器,也是SFR(直接寻址)4.寄存器间接寻址:以寄存器中的内容作为操作数的地址能够用于寄存器间接寻址的寄存器有:R0,R1,DPTR,SP区分内部数据RAM寻址和外部数据RAM寻址:外部数据RAM寻址指令上采用MOVX 对内部数据RAM寻址:使用8位的R0或者R1即可MOV @R0, A对外部数据RAM寻址:使用P2端口提供高8位地址,使用R0或者R1提供低8位地址;或者使用16位的DPTR提供地址MOVX A, @R1MOVX @DPTR, A5.变址寻址:以基址寄存器PC或者DPTR与变址寄存器A中的内容之和作为操作数的地址变址寻址只能对程序存储器中的数据进行寻址,由于程序存储器是只读的,因此变址寻址只有读操作,指令上采用MOVCMOVC A, @A+DPTRMOVC A, @A+PC6.相对寻址:用于修改PC的值,使得PC加上指令中给出的一字节的偏移量由于转移指令有两字节和三字节这两种形式,因此偏移量的范围分别为-126~+129和-125~+130SJMP 80H7.位寻址:以位地址中的内容为操作数SETB 20HMOV 32H, C总结一下各种寻址方式的使用场合:立即寻址:常数直接寻址:SFR和内部数据RAM寄存器寻址:寄存器区寄存器间接寻址:内部数据RAM和外部数据RAM变址寻址:程序存储器相对寻址:PC位寻址:位地址区。
单片机的几种寻址方式
寻址就是寻找指令中操作数或操作数所在的地址。
所谓寻址方式,就是如何找到存放操作数的地址,把操作数提取出来的方法。
通常指源操作数的寻址方式。
MCS-51 系列单片机寻址方式共有七种:寄存器寻址、直接寻址、立即数寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。
1、寄存器寻址
寄存器寻址是指操作数存放在某一寄存器中,指令中给出寄存器名,就能得到操作数。
寄存器可以使用寄存器组R0~R7 中某一个或其它寄存器(A,B,DPTR 等)。
例如:
MOV A,R0 ;(R0 )→A
MOV P1,A ;(A)→P1
ADD A, R0 ;(A)+(R0) →A。
七种寻址方式一、立即寻址方式操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
立即数可以是8位、16位或32位,该数值紧跟在操作码之后。
如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。
例如:MOV AH,80H ADD AX,1234H MOV ECX,123456HMOV B1,12H MOV W1,3456H ADD D1,32123456H其中:B1、W1和D1分别是字节、字和双字单元。
以上指令中的第二操作数都是立即数,立即数寻址方式通常用于对通用寄存器或内存单元赋初值。
二、寄存器寻址方式指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。
把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式如:ADD VARD,EAX ADD VARW,AX MOV VARB,BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。
在第4章将会学到如何定义它们。
2、目的操作数是寄存器寻址方式如:ADD BH,78h ADD AX,1234h MOV EBX,12345678H等。
3、源和目的操作数都是寄存器寻址方式如:MOV EAX,EBX MOV AX,BX MOV DH,BL等。
三、直接寻址方式指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
8051单片机指令系统的7种寻址方式解析寻址方式:寻址就是寻找操作数的地址。
绝大多数指令执行时都需要操作数,因此就存在如何确定操作数地址的问题。
所谓寻址方式就是通过什么途径获取操作数的方式。
根据指令操作的需要,计算机总是提供多种寻址方式。
一般来说,寻址方式越多计算机的寻址能力就越强,但指令系统也就越复杂。
8051指令系统有7种寻址方式:寄存器寻址,直接寻址,寄存器间接寻址,立即寻址,基址寄存器加变址寄存器间接寻址,相对寻址,位寻址,下面分别介绍。
寄存器寻址寄存器寻址:寄存器寻址就是操作数在寄存器中,因此指定了寄存器就得到了操作数。
采用寄存器寻址方式的指令都是一字节的指令,指令中以符号名称来表示寄存器。
例如:MOV A R1 这条指令的功能是把工作寄存器R1的内容传送到累加器A中,由于操作数在R1中,因此指令中指定了R1,也就得到了操作数。
寄存器寻址方式的寻址范围包括:工作寄存器组R0~R7,部分特殊寄存器ACC,B,DPTR 等。
直接寻址直接寻址:直接寻址就是在指令中直接给出操作数所在单元的真实地址。
这里给出的操作数直接地址为8位二进制地址。
程序中一般用十六进制数表示。
例如:指令MOV A,30H 把内部RAM单元30H中的数据传送给累加器A,指令中30H就是操作数的直接地址。
直接寻址方式的寻址范围包括:内部数据存储器低128单元,特殊功能寄存器。
特殊功能寄存器在指令的表示中除了可以以直接地址形式给出外,还可以以寄存器符号形式给出,如对累加器A,在指令中可使用其直接地址OEOH,也可使用其符号形式ACC。
立即寻址立即寻址:立即寻址方式就是实际操作数作为指令的一部分,在指令中直接给出,取指令时,可在程序存储器中直接取得操作数。
通常把出现在指令中的操作数称为立即数。
采用立即寻址方式的指令,在立即数前面加上。
第3章数据的7种寻址方式,包括指令的格式,功能,指令的正误判断。
20位物理地址的生成:将段地址添上一个0(十六进制),再加上偏移地址。
数据传送指令:MOV PUSH,POP,XCHG,LEA,IN,OUT1、MOV ,注意指令的正误判断,可从3点入手。
(1)指令格式(2)数据大小是否超出范围(3)类型是否匹配。
通常,不能在两个内存单元间直接传送,段寄存器间不能直接传送,立即数不能直接传送到段寄存器,不能用CS作目的操作数。
2、PUSH 入栈指令,先减后压。
不能对字节进行压栈操作。
3、POP 出栈指令,先弹后加,将栈顶的一个字弹出到目的操作数。
4、EXCHG 交换指令。
不能在两个内存单元间直接交换。
5、LEA 取有效地址指令。
6、IN 输入指令,当端口大于255时,要用DX来表示端口号。
7、OUT 输出指令,当端口大于255时,要用DX来表示端口号算术运算等指令1、ADD AL,[1000H]例:AL=85H,BL=79H,执行指令ADD AL,BLAL= 0FEH ,CF= 0 ,OF= 02、SUB AL,BL3、INC [1000H] ERRORINC BYTE PTR [1000H]INC WORD PTR [1000H]该指令不影响CF标志4、DEC [1000H] ERRORDEC BX5、NEG AL 求相反数例:Y=X,X>=0; Y=|X|,X<0,编写程序段实现该功能MOV AL,XCMP AL,0JGE Y1NEG ALY1:MOV Y,ALHLT编程序的思路:取数据,在CPU里做运算,存数据;如果数据较多,通常要设指针,再取数据,取完数据后,修改地址指针,又取下一个数据,循环下去。
6、CMP AL,BL无符号数,A表示大,B表示小,E表示相等。
有符号数,G表示大,L表示小,E表示相等。
例:CMP AX,BXJGE NEXTXCHG AX,BXNEXT: CMP AX,CXJGE DONEXCHG AX,CXDONE:该程序段的功能是找AX,BX,CX中最大的数,并把最大的数放在AX中。
51单片机的寻址方式寻址方式:指定操作数所在单元的方法。
在我们学习的8051单片机中,有7种寻址方法,下面我们将逐一进行分析。
一、立即寻址用“#”作前缀MOV A,#20H在这种寻址方式中,指令多是双字节的。
立即数就是存放在程序存储器中的常数,换句话说就是操作数(立即数)是包含在指令字节中的。
例如:MOV A,#3AH这条指令的指令代码为74H、3AH,是双字节指令,这条指令的功能是把立即数3AH送入累加器A中。
MOV DPTR,#8200H在前面学单片机的专用寄存器时,我们已学过,DPTR是一个16位的寄存器,它由DPH及DPL两个8位的寄存器组成。
这条指令的意思就是把立即数的高8位(即82H)送入DPH寄存器,把立即数的低8位(即00H)送入DPL寄存器。
二、直接寻址指令中直接给出操作数的地址。
MOV A,30H;这条指令中操作数就在30H单元中,也就是30H是操作数的地址,并非操作数。
MOV 30H,DPH在80C51单片机中,直接地址只能用来表示内部数据存储器、位地址空间以及特殊功能寄存器,具体的说就是:1、内部数据存储器RAM低128单元。
在指令中是以直接单元地址形式给出。
我们知道低128单元的地址是00H-7FH。
在指令中直接以单元地址形式给出这句话的意思就是这0-127共1 28位的任何一位,例如0位是以00H这个单元地址形式给出、1位就是以01H单元地址给出、127位就是以7FH形式给出。
2、位寻址区。
20H-2FH地址单元。
3、特殊功能寄存器。
专用寄存器除以单元地址形式给出外,还可以以寄存器符号形式给出。
例如下面我们分析的一条指令 MOV IE,#85H 前面的学习我们已知道,中断允许寄存器IE的地址是80H,那么也就是此指令也可以以 MOV 80H,#85H的形式表述。
直接寻址是唯一能访问特殊功能寄存器的寻址方式!大家来分析下面几条指令:MOV 65H,A ;将A的内容送入内部RAM的65H单元地址中MOV A,direct ;将直接地址单元的内容送入A中MOV direct,direct;将直接地址单元的内容送直接地址单元MOV IE,#85H ;将立即数85H送入中断允许寄存器IE前面我们已学过,数据前面加了“#”的,表示后面的数是立即数(如#85H,就表示85H就是一个立即数),数据前面没有加“#”号的,就表示后面的是一个地址地址(如,MOV 65H,A这条指令的65H就是一个单元地址)。
七种寻址方式的寻址范围
寻址方式是指计算机的指令寻址方式,常见的有以下七种寻址方式:
1. 直接寻址:寻址范围是CPU的寻址范围,通常为2的n次方个单元,例如32位CPU的寻址范围为0~2^32-1。
2. 寄存器寻址:寻址范围是CPU的寄存器,通常寄存器的个数有限,例如32位CPU通常有16个通用寄存器,寻址范围为0~15。
3. 立即寻址:寻址范围是一个常数或者立即数,通常是一个字节或者一个字的大小,例如0~255。
4. 间接寻址:寻址范围是由另一个寄存器或内存单元中存储的地址指定的,通常是一个字节或一个字的大小。
5. 寄存器间接寻址:寻址范围是由两个寄存器的内容组成的地址。
6. 基址寻址:寻址范围是由一个基址寄存器和一个偏移量组成的地址,通常用于访问数组或者数据块等结构。
7. 相对寻址:寻址范围是相对于当前指令地址的一个偏移量,通常用于实现跳转或者分支等指令。
寄存器与七种寻址⽅式⼀、寄存器总共同拥有14个16位寄存器,8个8位寄存器通⽤寄存器:数据寄存器:AH(8位) AL(8位) AX(16位) (AX和AL⼜称累加器)BH(8位) BL(8位) BX(16位) (BX⼜称基址寄存器,唯⼀作为存储器指针使⽤寄存器)CH(8位) CL(8位) CX(16位) (CX⽤于字符串操作,控制循环的次数,CL⽤于移位)DH(8位) DL(8位) DX(16位) (DX⼀般⽤来做32位的乘除法时存放被除数或者保留余数)指针寄存器:SP 堆栈指针 (存放栈顶地址)BP 基址指针 (存放堆栈基址偏移)变址寄存器:主要⽤于存放某个存储单元地址的偏移,或某组存储单元開始地址的偏移,即作为存储器(短)指针使⽤。
作为通⽤寄存器,它们能够保存16位算术逻辑运算中的操作数和运算结果,有时运算结果就是须要的存储单元地址的偏移.SI 源地址 (源变址寄存器)DI ⽬的地址 (⽬的变址寄存器)控制寄存器:IP 指令指针FLAG 标志寄存器 ①进位标志 CF,记录运算时最⾼有效位产⽣的进位值。
②符号标志 SF,记录运算结果的符号。
结果为负时置1,否则置0。
③零标志 ZF,运算结果为0时ZF位置1,否则置0。
④溢出标志 OF,在运算过程中,如操作数超出了机器可表⽰数的范围称为溢出。
溢出时OF位置1,否则置0。
⑤辅助进位标志 AF,记录运算时第3位(半个字节)产⽣的进位值。
⑥奇偶标志 PF,⽤来为机器中传送信息时可能产⽣的代码出错情况提供检验条件。
当结果操作数中1的个数为偶数时置1,否则置0。
段寄存器CS 代码段 IPDS 数据段SS 堆栈段 SP BPES 附加段⼆、七种寻址⽅式:1、马上寻址⽅式:操作数就包括在指令中。
作为指令的⼀部分,跟在操作码后存放在代码段。
这样的操作数成为马上数。
马上数能够是8位的,也能够是16位的。
⽐如:指令: MOV AX,1234H则: AX = 1234H2、寄存器寻址⽅式:操作数在CPU内部的寄存器中,指令指定寄存器号。
单片机指令的寻址方式及其应用在单片机程序设计中,寻址方式是指用于访问或者定位内存中数据或指令的方法。
单片机指令的寻址方式有多种,包括直接寻址、间接寻址、寄存器寻址、立即寻址等。
不同的寻址方式适用于不同的情况和需求,在实际应用中起到重要的作用。
一、直接寻址直接寻址是最简单和最常见的寻址方式之一。
在直接寻址中,指令中包含的是操作数的直接地址。
当单片机执行该指令时,直接从内存中取出该地址对应的数据或指令进行操作或执行。
直接寻址适用于需要直接操作内存数据的场景,通过指定地址可以直接读取或写入数据。
例如,假设有一条指令LOAD A, 0x10,表示将内存地址为0x10的数据加载到寄存器A中。
单片机在执行该指令时,会直接从内存的0x10地址中读取数据并将其存入寄存器A中。
直接寻址的优点是操作简单、直观,缺点是地址空间有限,不能处理较大范围的数据。
二、间接寻址间接寻址是通过指令中给出的地址,再根据该地址所指向的存储单元获取数据或指令。
间接寻址适用于需要通过指针或者索引来访问数据的场景。
例如,假设有一条指令LOAD A, [0x10],表示将从内存地址0x10所指向的地址中读取数据,并将其存入寄存器A中。
在执行该指令时,单片机会首先读取0x10地址中存储的数据,得到实际的数据地址,然后再根据该地址从内存中读取数据。
间接寻址的优点是灵活性高,可以通过间接地址来访问复杂的数据结构,但是需要多次访存,运行效率较低。
三、寄存器寻址寄存器寻址是指指令中直接使用寄存器作为操作数的寻址方式。
在寄存器寻址中,指令中给出的操作数就是寄存器中的值,可以直接对其进行操作。
例如,有一条指令ADD A, B,表示将寄存器A中的值与寄存器B中的值相加,并将结果存入寄存器A中。
寄存器寻址的优点是非常快速,因为数据直接存储在寄存器中,不需要额外的访存操作。
但是由于寄存器数量有限,只适用于数据量较小的情况。
四、立即寻址立即寻址是指指令中直接给出操作数的值的寻址方式。
七种寻址方式标签:it一、立即寻址方式操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
立即数可以是8位、16位或32位,该数值紧跟在操作码之后。
如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。
例如:MOV AH, 80H ADD AX, 1234H MOV ECX, 123456HMOV B1, 12H MOV W1, 3456H ADD D1, 32123456H其中:B1、W1和D1分别是字节、字和双字单元。
以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二操作数。
该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。
立即数寻址方式通常用于对通用寄存器或内存单元赋初值。
图是指令“MOV AX, 4576H”存储形式和执行示意图。
二、寄存器寻址方式指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。
把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。
在第4章将会学到如何定义它们。
2、目的操作数是寄存器寻址方式如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
3、源和目的操作数都是寄存器寻址方式如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。
8086寄存器和7种寻址⽅式1. 8086处理器有以下寄存器:类别位数名称通⽤16AX, BX, CX, DX8AH,AL,BH,BL,CH,CL,DH,DL指针16SP(stack pointer,堆栈指针),BP(base pointer,基址指针)索引(变址)16SI(source index,源索引),DI(destination,⽬的索引)段16CS(code segment,代码段),DS(data segment,数据段),SS(stack segment,堆栈段),ES(extra segment,附加段)指令16IP(instruction pointer,指令指针/指令计数器)标志16FR(flag register,标志寄存器)其中:1). 段寄存器CS,DS,SS,ES分别保存端代码段,数据段,堆栈段,辅助数据段的起始地址,段寄存器只能由其他寄存器载⼊值,不能由主存直接载⼊.2). 基址寄存器BX,SP,BP⽤于保存相对段⾸地址的偏移地址,其中BX的默认段寄存器是DS,⽽SP,BP的默认段寄存器是SS.3). 索引寄存器(⼜叫变址寄存器)SI,DI,既可⽤于存放存储单元在段内的偏移量,⼜可⽤于存放在相对于段内偏移量的偏移量(详见下⽂寻址⽅式).4). 操作数相对于段⾸的偏移地址⼜称有效地址.(参考⾃《x86 PC 汇编语⾔,设计和接⼝》)1). ⽴即数寻址⽅式操作数作为指令的⼀部分,紧跟在操作码之后,该寻址⽅式执⾏得很快.将信息装载到除了段寄存器和标志寄存器以外的寄存器:MOV AX,2550H ;将2550H装⼊AXMOV CX,625;将⼗进制数625装⼊CXMOV BL,40H ;将40H装⼊BLView Code要将信息移到段寄存器,必须现将数据装载到通⽤寄存器,再移到段寄存器:MOV AX,2550HMOV DS,AX ;正确MOV DS,2550H ;错误View Code2). 寄存器寻址⽅式操作数在寄存器中,指令指定寄存器号.16位操作数的寄存器可以是 AX,BX,CX,DX,SI,DI,SP,BP等;8位操作数的寄存器可以是AL,AH,BL,BH,CL,CH,DL,DH等.寄存器寻址⽅式和⽴即数寻址⽅式不涉及内存访问,因⽽可以取得较⾼的运算速度.如:MOV BX,DX ;将DX的内容复制到BXMOV ES,AX ;将AX中的内容复制到ESADD AL,BH ;将BH中的内容加到ALView Code3). 直接寻址⽅式操作数在内存,但操作数的有效地址作为指令的⼀部分,紧跟在操作码之后.默认段寄存器为DS().如:MOV DL,[2400] ;将DS:2400H的内容移到DLMOV [3518],AL ;将AL的内容移到DS:3518HView Code4). 寄存器间接寻址⽅式操作数在内存,但操作数的有效地址由SI,DI,BX,BP指定,其中SI,DI,BX默认的段寄存器是DS,BP默认的段是SS.如:MOV CL,[SI] ;将DS:SI中的内容移到CLMOV [DI],AH ;将AH的内容移到DS:DIView Code5).寄存器相对寻址⽅式操作数的有效地址是⼀个基址或变址寄存器的内容和指令中指定的8位或16位位移量(displacement)之和.如:MOV CX,[BX]+10;[BX]+10也可以写作[BX+10]或10[BX]MOV AL,[BP]+5MOV DX.[SI]+5View Code6). 基址变址寻址⽅式操作数的有效地址是⼀个基址寄存器和⼀个变址寄存器的内容之和,默认段寄存器为基址寄存器的默认段寄存器.如:MOV CL,[BX][DI] ;将DS:BX+DI的内容移到CL7). 相对基址变址寻址⽅式(Relative based indexed addressing)操作数的有效地址是⼀个基址寄存器和⼀个变址寄存器的内容和8位或16位位移量之和,这种寻址⽅式为像数组元素遍历等堆栈处理提供了⽅便.如:MOV CL,[BX][DI]+8;将DS:BX+DI+8的内容移到CL,[BX][DI]+8也可以写作[BX+DI+8]MOV CH,[BX][SI]+20View Code。
一、寄存器
总共有14个16位寄存器,8个8位寄存器
通用寄存器:
数据寄存器:
AH(8位) AL(8位) AX(16位) (AX和AL又称累加器)
BH(8位) BL(8位) BX(16位) (BX又称基址寄存器,唯一作为存储器指针使用寄存器)
CH(8位) CL(8位) CX(16位) (CX用于字符串操作,控制循环的次数,CL 用于移位)
DH(8位) DL(8位) DX(16位) (DX一般用来做32位的乘除法时存放被除数或者保留余数)
指针寄存器:
SP 堆栈指针(存放栈顶地址)
BP 基址指针(存放堆栈基址偏移)
变址寄存器:主要用于存放某个存储单元地址的偏移,或某组存储单元开始地址的偏移,
即作为存储器(短)指针使用。
作为通用寄存器,它们可以保存16位算术逻辑运算中的操
作数和运算结果,有时运算结果就是需要的存储单元地址的偏移.
SI 源地址(源变址寄存器)
DI 目的地址(目的变址寄存器)
控制寄存器:
IP 指令指针
FLAG 标志寄存器
①进位标志CF,记录运算时最高有效位产生的进位值。
②符号标志SF,记录运算结果的符号。
结果为负时置1,否则置0。
③零标志ZF,运算结果为0时ZF位置1,否则置0。
④溢出标志OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。
溢出时OF位置1,否则置0。
⑤辅助进位标志AF,记录运算时第3位(半个字节)产生的进位值。
⑥奇偶标志PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。
当结果操作数中1的个数为偶数时置1,否则置0。
段寄存器
CS 代码段IP
DS 数据段
SS 堆栈段SP BP
ES 附加段
二、七种寻址方式:
1、立即寻址方式:
操作数就包含在指令中。
作为指令的一部分,跟在操作码后存放在代码段。
这种操作数成为立即数。
立即数可以是8位的,也可以是16位的。
例如:
指令: MOV AX,1234H
则: AX = 1234H
2、寄存器寻址方式:
操作数在CPU内部的寄存器中,指令指定寄存器号。
对于16位操作数,寄存器可以是:AX、BX、CX、DX、SI、DI、SP和BP等。
对于8位操作数,寄存器可以是AL 、AH、BL、BH、CL、CH、DL、DH。
这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数
因而可以取得较高的运算数度。
3、直接寻址方式:
操作数在寄存器中,指令直接包含有操作数的有效地址(偏移地址)
注:操作数一般存放在数据段
所以操作数的地址由DS加上指令中直接给出的16位偏移得到。
如果采用段超越前缀,则操作数也可含在数据段外的其他段中。
例如:
MOV AX,[8054]
如(DS) = 2000H,
则执行结果为(AX) = 3050H
(物理地址=20000+8054=28054H)
28054H里的内容为3050H
在汇编语言指令中,可以用符号地址代替数值地址
如:MOV AX,VALUE
此时VALUE为存放操作数单元的符号地址。
如写成:MOV AX,[VALUE]也是可以的,两者是等效的。
如VALUE在附加段中,则应指定段超越前缀如下:
MOV AX,ES:VALUE 或MOV AX,ES:[VALUE]
4、寄存器间接寻址方式:
操作数在寄存器中,操作数有效地址在SI、DI、BX、BP
这四个寄存器之一中。
在一般情况下,如果有效地址在
SI、DI和BX中,则以DS段寄存器中的内容为段值。
如果
有效地址在BP中,则以SS段寄存器中的内容为段值
例如:
MOV AX,[SI]
如果(DS) = 5000H (SI) = 1234H
则物理地址= 50000 + 1234 = 51234H
51234H地址中的内容为:6789H
执行该指令后,(AX) = 6789H
5、寄存器相对寻址方式:
操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)
或变址寄存器(SI、DI)的内容加上指令中给定的8位或16位位移量之和
BX 8位位移量
EA(有效地址) = BP +
SI 16位位移量
DI
在一般情况下,如果SI、DI、或BX中的内容作为有效地址的一部分,那么引用的段寄存器是DS;如果BP中的内容作为有效地址的一部分,那么引用的段寄存器是SS。
物理地址= 16d × (DS) + (BX) + 8
或(SI)或16位位移量
或(DI)
物理地址= 16d × (SS) + (BP) + 8位位移量
或16位位移量
在指令中给定的8位或16位位移量采用补码形式表示。
在计算有效地址时,如位移量是8位,则被带符号扩展成16位。
例如:
MOV AX,[DI+1223H]
假设,(DS) = 5000H,(DI) = 3678H
则物理地址= 50000 + 3678 + 1233 = 5489BH
5489BH地址中的内容:55AAH
执行该指令后AX = 55AAH
下面指令中,源操作数采用寄存器相对寻址,引用的段寄存器是SS: MOV BX,[BP-4]
下面指令中,目的操作数采用寄存器相对寻址,引用的段寄存器是ES: MOV ES:[BX+5],AL
指令:MOV AX,[SI+3]与MOV AX,3[SI]是等价的
6、基址加变址寻址方式:
操作数在寄存器中,操作数的有效地址由:
基址寄存器之一的内容与变址寄存器之一的内容相加
BX SI
即: EA = +
BP DI
在一般情况下,如果BP之内容作为有效地址的一部分,则以SS之内容为段值,否则已DS
为段值。
例如:
MOV AX,[BX][DI]
如:(DS)=2100H,
(BX)=0158H,
(DI)=10A5H
则EA=0158 + 10A5 = 11FD
物理地址=21000 + 11FD = 221FDH
221FDH地址中的内容:1234H
执行该指令后AX = 1234H
下面指令中,目的操作数采用基址加变址寻址,
引用的段寄存器是DS: MOV DS:[BP+SI],AL
下面指令中,源操作数采用基址加变址寻址,
引用的段寄存器ES: MOV AX,ES:[BX+SI]
这种寻址方式使用与数组或表格处理。
用基址寄存器存放数组首地址,而用变地寄存器
来定位数组中的各元素,或反之。
由于两个寄存器都可改变,所以能更加灵活地访问数
组或表格中的元素。
下面的两种表示方法是等价的:
MOV AX,[BX+DI]
MOV AX,[DI][BX]
7、相对基址加变址寻址方式:
操作数在存储器中,操作数的有效地址由于基址寄存器之一的内容与变址寄存器之一的
内容及指令中给定的8位或16位位移量相加得到。
BX SI 8位
即: EA = + + 位移量
BP DI 16位
在一般情况下,如果BP中的内容作为有效地址的一部分,则以SS段寄存器中的内容为段
值,否则以DS段寄存器中的内容为段值。
在指令中给定的8位或16位位移量采用补码形式表示。
在计算有效地址时,如果位移量是8位,那么被带符号扩展成16位。
当所得的有效地址操作FFFFH时,就取其64K的模
例如:
MOV AX,[BX+DI-2]
假设,(DS) = 5000H, (BX) = 1223H, DI = 54H, (51275) = 54H, (51276) = 76H 物理地址= 50000 + 1223 + 0054 + FFFE(-2 各位取反末位加一) = 51275H
执行该指令后(AX) = 7654H
相对基址加变址这种寻址方式的表示方法多种多样,以下四种方法均是等价的:MOV AX,[BX+DI+1234H], MOV AX,1234H[BX][DI]
MOV AX 1234H[BX+DI], MOV AX,1234H[DI][BX]。