数据传送指令

合集下载

数据传送类指令

数据传送类指令

3.2.1 数据传送类指令数据传送指令用于实现寄存器与存储器之间、寄存器之间、累加器AL/AX与I/O端口之间、立即数到寄存器或存储器之间的字节或字的传送。

这类指令的共同特点是不影响标志寄存器的内容(SAHF,POPF除外)。

堆栈操作指令、标志位传送指令和地址传送指令也归入这一类中,共14条指令,又可分为4组,如表3.4所示。

1.通用数据传送指令通用数据传送指令包括传送指令MOV、堆栈操作指令PUSH、POP、输入/输出指令(累加器传送指令)、数据交换指令XCHG和查表转换指令XLAT。

这类指令是唯一允许以段寄存器作为操作数的指令(XCHG除外)。

表3.4 数据传送类指令指令类型指令书写格式指令功能通用数据传送指令MOV 目标,源PUSH 源POP 目标XCHG 目标,源XLAT 字节或字传送字压入堆栈字弹出堆栈字节或字交换字节翻译目标地址传送指令LEA 目标,源LDS 目标,源LES 目标,源装入有效地址装入DS寄存器装入ES寄存器标志位传送指令LAHFSAHFPUSHFPOPF 将FR低字节装入AH寄存器将AH内容装入FR低字节将FR内容压入堆域从堆栈弹出FR内容I/O数据传送指令IN 累加器,端口OUT 端口,累加器从端口输入字节或字将字节或字输出到端口(1)MOV 传送指令指令格式:MOV OPD,OPS指令功能:将源操作数OPS传送到目的操作数OPD,即(OPD)→(OPS)。

源操作数OPS可以是8/16位的通用寄存器、段寄存器、存储器中某单元或8/16位的立即数。

(2)PUSH进栈(压入)指令指令格式:PUSH OPS指令功能:将源操作数OPS压入堆栈,即SP–2 → SP,OPS → (SPH,SP)。

源操作数0PS可以是16位通用寄存器、段寄存器或存储器中的数据字,以保证堆栈按“字”操作。

源操作数OPS不能是立即数。

由于堆栈是按“后进先出”方式工作,所以每次执行PUSH指令时,总是首先修改栈指针(S P)–2 → SP (即SP先减2),使之指向新栈顶,然后把源操作数压入堆栈中SP所指示的位置,高字节在较高地址单元,低字节在较低地址单元中(真正的栈顶单元)。

数据传送类指令

数据传送类指令

05
06
不允许直接向段寄存器传送立即数。
该指令不影响标志位。
06
数据传送类指令
例3-12
指出下列指令中的错误 (1)MOV [DI], [SI] (2)MOV DS, 1000H (3)MOV 2000H, AX
(1)两个操作数不能同时为存 储器操作数。
(2)不能直接向段寄存器传送 立即数,正确的指令应为:
(1)在CPU内部寄存器之间 进行数据传送。
例如,MOV BL, AL MOV BX, AX MOV DS, AX
(2)在CPU内部寄存器与存 储器之间进行数据传送。
例如,MOV AX, [1000H] MOV BX, [SI][BX] MOV DATA[BP], ES
(3)将立即数传送给寄存器。 例如,MOV AX, 1234H MOV SI, 1000H
例3-14
数据传送类指令
已知:(BX)=1122H,(DS)=3000H,(31000H)=1234H。执行指令: XCHG BX, [1000H] 源操作数的物理地址为:(DS)×16+1000H=31000H。 指令执行的结果为:(BX)=1234H,(31000H)=1122H。
要实现两个存储单元X与Y之间的数据交换, 可以执行如下指令:
数据传送类指令
例3-15 已知:(DS)=3000H,(32000H)=12H,(32001H)
=34H,(32002H)=56H,(32003H)=78H。执行指令: LDS SI, [2000H]
地址传送指令
1.5 输入输出指令
数据传送类指令
输入输出指令用于在I/O端口与CPU之间传送数据。
MOV AX, 1000H MOV DS, AX (3)立即数不能作为目的操 作数。

数据传送指令

数据传送指令
PUSH DS PUSH AX PUSH MARK[SI]
3.2.1数据传送指令
(4) 格式:POP DST 操作:(DST)←((SP+1),(SP)),(SP)←(SP)+2 先出栈,后指针加2,按字取出。目标操作数DST的寻址方式为 立即寻址方式之外的所有存储器操作数寻址方式和寄存器寻址
POP AX POP [BX+SI]
3.2.1数据传送指令
(5) 该指令把存储器操作数的有效地址送到指定的寄存器中。 格式: LEA REG,SRC 操作:(REG)←SRC,即把源操作数(SRC应是存储器操 作数)的有效地址送到指定的寄存器中(REG LEA DX,[BX+SI+0B62H] 执行前:(BX)=3000H,(SI)=00C3H 执行后:(DX)=3000H+00C3H+0B62H=3C25H(有效地址
操作:(AL)←[(DX)](字节);(AX)←[(DX)+1,(DX)](字)
3.2.1数据传送指令
(2)
格式Ⅰ:OUT PORT ,AL OUT PORT ,AX ;字输出
操作:(PORT) ←AL(字节);(PORT+1,PORT)←AX
格式Ⅱ:OUT AL, DX OUT AX, DX
操作:[(DX)] ←(AL)(字节),[(DX)+1,(DX)] ←(AX)(字)IN/OUT 指令有两种格式,选择哪一种,取决于 外部设备端口地址的宽度。格式Ⅰ指令有两个字节,称长格式, 格式II指令只有一个字节,称短格式。
3.2.1数据传送指令
3. (1) LAHF
格式: LAHF 操作:(AH)←(PSW的低字节),即标志寄存器 (PSW)的低字节传送到AH (2) SAHF 格式:SAHF 操作:(PSW的低字节)←(AH),即将AH 寄存器的内

微机原理常用命令

微机原理常用命令

一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。

1. 通用数据传送指令MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里)XLAT 字节查表转换.── BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) 三、逻辑运算指令AND 与运算.or 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为"0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.七、处理机控制指令:标志处理指令CLC(进位位置0指令)CMC(进位位求反指令)STC(进位位置为1指令)CLD(方向标志置1指令)STD(方向标志位置1指令)CLI(中断标志置0指令)STI(中断标志置1指令)NOP(无操作)HLT(停机)WAIT(等待)ESC(换码)LOCK(封锁)。

汇编指令

汇编指令

一、数据传送指令(七种助记符)MOV (Move)对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送MOVX (Move External RAM)对外部存储器的数据传送XCH (Exchange)字节交换XCHD (Exchange Low-order Digit)低半字节交换PUSH (Push onto Stack)入栈POP (Pop from Stack)出栈二、算术运算指令(8种助记符)ADD (Addition)加法ADDC (Add with Carry)带进位加法SUBB (Subtract withBorrow)带借位减法DA (Decimal Adjust)十进制调整INC (Increment)加1DEC (Decrement)减1MUL (Multiplication Multiply)乘法DIV (Division Divide)除法三、逻辑运算类指令(10种助记符)ANL (AND Logic)逻辑与ORL (OR Logic)逻辑或XRL (Exclusive-OR Logic)逻辑异或CLR (Clear)清零CPL (Complement)取反RL (Rotate left)循环左移RLC (RL throught the carry flag)带进位循环左移SWAP (Swap)低4位与高4位交换四、控制转移类指令(17种助记符)ACCALL (Absolute subroutine Call)子程序绝对调用LCALL (Long subrout Call)子程序常调用RET (Return from Interruption)子程序返回RET1 (Return from Interruption)中断返回SJMP (Short jump)短转移AJMP (Absolute jump)绝对转移LJMP (Long Jump)长转移CJNE (Compare Jump if Not Equal)比较不等则转DJNZ (Decrement Jump if Not Zero)减1不为0则转JZ (Jump if zero)结果为0则跳转JNZ (Jump if Not Zero)结果不为0则跳转JC (Jump if Not carry flag is set)有进位则转移JB (Jump if the Bit is set)位为1则转移JNB (Jump if the Bit is Not set)位为0则转移JBC (JB and Clear the bit)位为1则转并清除该位NOP (No Operation)空操作五位操作指令(1种助记符)CLR 位清零SETB (Set Bit)位置1八种常用伪指令 16位地址此指令用在原程序或数据块的开始,指明此语句后面目标程序或数据块存放的起始地址2.【标号】DB 字节数据项表:奖项表中的字节数据存放到从标号开始的连续字节单元中。

汇编语言的基本语法

汇编语言的基本语法

汇编语言的基本语法在计算机科学领域中,汇编语言是一种低级语言,用于编写计算机程序。

它直接操作计算机硬件,比高级语言更接近计算机底层。

汇编语言的使用需要对其基本语法有一定的了解。

本文将介绍汇编语言的基本语法,以帮助读者更好地理解和使用这种语言。

一、数据传送指令在汇编语言中,数据传送是最基本的操作之一。

它用于将一个数据从一个位置传送到另一个位置。

数据传送指令由源操作数和目的操作数组成,示例如下:MOV 目的操作数,源操作数其中,目的操作数是要传送数据的目标位置,源操作数是数据的来源位置。

例如,将一个常量值传送给寄存器AX的指令可以写成:MOV AX,1000H这条指令将十六进制常量1000H传送给寄存器AX。

二、算术指令在汇编语言中,算术指令用于对数据进行算术运算。

常见的算术运算包括加法、减法、乘法和除法。

以下是一些常用的算术指令示例:ADD 目的操作数,源操作数 ; 相加SUB 目的操作数,源操作数 ; 相减MUL 目的操作数,源操作数 ; 乘法DIV 目的操作数,源操作数 ; 除法其中,目的操作数是要进行运算的操作数存储位置,源操作数是用于运算的数据来源。

三、跳转指令在程序执行过程中,跳转指令用于改变程序的执行顺序。

它根据条件选择不同的路径执行,或者直接跳转到指定的地址。

常见的跳转指令有以下几种形式:JMP 目标地址 ; 无条件跳转JE 目标地址 ; 相等时跳转JNE 目标地址 ; 不相等时跳转JG 目标地址 ; 大于时跳转JGE 目标地址 ; 大于等于时跳转JL 目标地址 ; 小于时跳转JLE 目标地址 ; 小于等于时跳转这些指令根据前面的条件判断进行跳转。

四、循环指令在汇编语言中,循环指令用于重复执行一段程序。

常见的循环指令有以下两种形式:LOOP 目标地址 ; 循环指令,计数器减1并跳转JCXZ 目标地址 ; 循环指令,计数器为0时跳转这些指令根据指定的条件进行重复执行,直到条件不满足为止。

数据传送指令

数据传送指令

3.访问外部RAM的指令
MOVX A, @Ri ;A←外部RAM(读) MOVX @Ri,A ; 外部RAM←A(写)
256个单元的范围,即:0000H—00FFH
MOVX A, @DPTR;A←外部RAM(读) MOVX @DPTR,A ; 外部RAM←A(写)
64KB范围,即:0000H—FFFFH 也作为外部扩展I/O口的操作!
XCH A,Rn
;A
XCH A,DIR ; A
XCH A,@Ri ; A
Rn (DIR) (Ri)
2.半字节交换指令 XCHD XCHD A,@Ri ;A0-3
(Ri)0-3
请看下一节:算术运算指令
4.3.3 堆栈操作指令
1. 进栈 PUSH PUSH DIR
如:PUSH ACC
; ①SP←SP+1 ; ②(SP)←(DIR) ;
2.出栈 POP
POP DIR
; ①(DIR)←(SP),
; ②SP←SP-1
如:POP ACC ;
主要用于保护现场(子程序中)
4.3.4 数据交换指令
1. 字节交换指令 XCH
2. 直接寻址:
MOV A , DIR
;A←(DIR)
MOV DIR, A
;(DIR)←A
MOV Rn, DIR
;Rn←(DIR)
MOV @Ri, DIR
;(Ri)←(DIR)
MOV dir2,DIR1 ;(dir2)←(DIR1)
n: 0,1,2,3,4,5,6,7
i: 0,1
Hale Waihona Puke 3. 间接寻址 MOV A , @Ri MOV @Ri, A MOV dir, @Ri

传送及比较指令总结

传送及比较指令总结

传送及比较指令总结传送指令是计算机系统中常用的一类指令,用于将数据从一个位置移动到另一个位置。

这些指令通常用于数据的复制、转移和重排等任务。

在本文中,我将总结一些常见的传送指令,并比较它们的异同。

1.MOV指令:MOV (Move) 指令用于将数据从一个位置复制到另一个位置。

它可以在寄存器之间、寄存器和内存之间、寄存器和端口之间进行数据的传送。

MOV 指令通常具有两个操作数,一个目标操作数和一个源操作数。

例如,`MOV AX, BX` 将寄存器 BX 中的值复制到寄存器 AX 中。

MOV 指令在大多数计算机体系结构中都是支持的,因为它是一种非常基本和常见的操作。

2.LDR和STR指令:LDR (Load) 和 STR (Store) 指令用于将数据从内存中加载到寄存器或将数据从寄存器存储到内存中。

这些指令主要在ARM架构中使用。

LDR指令将内存中的数据加载到寄存器中,例如,`LDR R0, [R1]` 将 R1 寄存器中的地址所对应的内存单元中的数据加载到 R0 寄存器中。

STR 指令则将寄存器中的数据存储到内存中,例如,`STR R0, [R1]` 将 R0 寄存器中的数据存储到 R1 寄存器中的地址所对应的内存单元中。

3.PUSH和POP指令:PUSH指令用于将数据压入栈中,而POP指令用于从栈中弹出数据。

这两个指令通常用于实现函数调用和中断处理等操作。

PUSH指令将数据放入栈顶,然后栈指针下移;而POP指令则将栈顶数据读取到寄存器中,并将栈指针上移。

例如,`PUSHAX`将AX寄存器中的数据压入栈中,`POPAX`将栈顶数据弹出到AX寄存器中。

4.XCHG指令:XCHG (Exchange) 指令用于交换两个操作数的值。

这个指令可以用于两个寄存器之间的值交换,或者寄存器和内存之间的交换。

例如,`XCHG AX, BX` 将寄存器 AX 和 BX 中的数据进行交换。

XCHG 指令常用于实现数据交换、排序和互斥访问等场景。

arm常用的数据传送指令

arm常用的数据传送指令

ARM指令集中的数据传送指令主要用于在寄存器和内存之间传输数据。

以下是一些常用的数据传送指令:
1. LDR - 加载寄存器指令。

用于从内存加载数据到寄存器。

2. STR - 存储寄存器指令。

用于将数据从寄存器存储到内存。

3. LDRB - 加载字节指令。

用于从内存加载一个字节的数据到寄存器。

4. STRB - 存储字节指令。

用于将一个字节的数据从寄存器存储到内存。

5. LDRH - 加载半字指令。

用于从内存加载一个半字的数据到寄存器。

6. STRH - 存储半字指令。

用于将一个半字的数据从寄存器存储到内存。

7. LDRD - 加载双字指令。

用于从内存加载一个双字的数据到寄存器。

8. STRD - 存储双字指令。

用于将一个双字的数据从寄存器存储到内存。

9. PUSH - 入栈指令。

用于将寄存器的值推送到堆栈中。

10. POP - 出栈指令。

用于从堆栈中弹出值并将其存储到寄存器中。

这些指令可以配合使用 ARM 的地址计算和跳转指令来完成更复杂的内存操作和数据处理任务。

请注意,具体支持的指令可能会因ARM 架构版本和处理器型号而有所不同。

数据传送指令

数据传送指令

数据传送指令数据传送指令包括数据的传送、交换、堆栈数据的压入与弹出,是最基本、使用率最高的一类指令。

助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP共八种。

1.MOV类指令及功能(16条)这类指令的功能是从源操作数到目的操作数的数据传送。

MOV A, Rn ;Rn→A,寄存器Rn的内容送到累加器AMOV A, direct ;(direct)→A,直接地址中的内容送AMOV A, @Ri ;(Ri)→A,Ri间址的内容送AMOV A, #data ;data→A,立即数送AMOV Rn,, A ;A→Rn,累加器A中的内容送寄存器RnMOV Rn, direct ;(direct)→Rn;直接地址中的内容送RnMOV Rn, #data ;data→Rn;立即数送RnMOV direct, A ;A→(direct),A中的内容送入直接地址中MOV direct, Rn ;Rn→(direct),寄存器内容送入直接地址中MOV direct, direct ;(direct) →(direct),源操作数直接地址的内容送入;目的操作数的直接地址中MOV direct, @Ri ;(Ri)→(direct),Ri间址内容送入直接地址中MOV direct, #data ;data→(direct),立即数送入直接地址中MOV @Ri, A ;A→(Ri),A中内容送到Ri间址单元中MOV @Ri, direct ;(direct)→(Ri),直接地址中内容送入Ri间址单元中MOV @Ri, #data ;data→(Ri),立即数送入Ri间址单元中MOV DPTR, #data16 ;data16→DPTR,16位常数送入数据指针DPTR中,高8 ;位送入DPH,低8位送入DPH,低8位送入DPL中从上述指令可以看出目的操作数有A累加器、Rn寄存器、直接地址direct及间接地址@Ri,源操作数除此之外还多一种立即数data。

微机原理常用命令

微机原理常用命令

一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。

1. 通用数据传送指令MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里)XLAT 字节查表转换.── BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) 三、逻辑运算指令AND 与运算.or 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为"0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.七、处理机控制指令:标志处理指令CLC(进位位置0指令)CMC(进位位求反指令)STC(进位位置为1指令)CLD(方向标志置1指令)STD(方向标志位置1指令)CLI(中断标志置0指令)STI(中断标志置1指令)NOP(无操作)HLT(停机)WAIT(等待)ESC(换码)LOCK(封锁)文案编辑词条B 添加义项?文案,原指放书的桌子,后来指在桌子上写字的人。

汇编语言指令大全

汇编语言指令大全

汇编语言指令大全前言汇编语言是一种底层的计算机语言,用于编写程序时直接操作硬件,并且能够直接控制计算机的指令执行。

在学习汇编语言时,掌握各种指令是非常重要的,本文将系统性地介绍汇编语言中常用的指令,以便读者更好地理解和使用汇编语言。

数据传送指令数据传送指令用于在寄存器、内存之间传送数据,常用的数据传送指令有MOV、XCHG等。

MOVMOV指令将数据从一个地方(来源)移动到另一个地方(目的地),语法如下:MOV 目的地, 来源例如:MOV AX, 5XCHGXCHG指令用于交换两个操作数的值,语法如下:XCHG 寄存器1, 寄存器2例如:XCHG AX, BX算术操作指令算术操作指令用于进行各种算术运算,如加法、减法、乘法、除法等,常用的算术操作指令有ADD、SUB、MUL、DIV等。

ADDADD指令用于两个操作数相加并将结果存储在目的地,语法如下:ADD 目的地, 源操作数例如:ADD AX, BXSUB指令用于从目的地减去源操作数的值,语法如下:SUB 目的地, 源操作数例如:SUB AX, 10MULMUL指令用于无符号乘法操作,将累加器AL与源操作数执行乘法,结果存储在累加器中,语法如下:MUL 源操作数例如:MUL BLDIVDIV指令用于无符号除法操作,将累加器AX中的双字数值除以源操作数,商存储在AX中,余数存储在DX中,语法如下:DIV 源操作数例如:DIV CX控制转移指令控制转移指令用于改变程序执行的顺序,如无条件跳转、条件跳转等,常用的控制转移指令有JMP、JZ、JC等。

JMPJMP指令用于无条件跳转到指定的地址执行,语法如下:JMP 目标地址例如:JMP STARTJZ指令表示“零标志”(Zero Flag),即在上一个运算结果为零时跳转到指定地址执行,语法如下:JZ 目标地址例如:JZ LOOPJCJC指令表示“进位标志”(Carry Flag),即在发生进位时跳转到指定地址执行,语法如下:JC 目标地址例如:JC ADD_OVERFLOW总结本文介绍了汇编语言中常用的数据传送指令、算术操作指令和控制转移指令,这些指令是汇编语言编程时必须掌握的基础知识。

数据传送指令

数据传送指令

数据传送指令******************************************************************************* 1、传送指令MOV(move)******************************************************************************* 传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。

指令的格式如下:MOV Reg/Mem, Reg/Mem/Imm其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。

******************************************************************************* 2、传送—填充指令******************************************************************************* 传送—填充指令是把位数短的源操作数传送给位数长的目的操作数。

指令格式如下:MOVSX/MOVZX Reg/Mem, Reg/Mem/Imm其中:80386+表示80386及其之后的CPU,其它类似符号含义类同,不再说明。

指令的主要功能和限制与MOV指令类似,不同之处是:在传送时,对目的操作数的高位进行填充。

根据其填充方式,又分为:符号填充和零填充。

符号填充指令MOVSXMOVSX的填充方式是:用源操作数的符号位来填充目的操作数的高位数据位零填充指令MOVZXMOVZX的填充方式是:恒用0来填充目的操作数的高位数据位例如,AL=87H,指令MOVSX CX, AL;MOVZX DX, AL执行后,问CX和DX的值是什么?根据传送-填充指令的填充方式可知:指令MOVSX CX, AL执行后,(CX)=0FF87H,指令MOVZX DX, AL执行后,(DX)=0087H。

第3节1数据传送指令

第3节1数据传送指令

长格式: OUT PORT, AL (字节)
OUT PORT, AX (字)
执行操作:( PORT ) (AL)
(字节)
( PORT+1, PORT ) (AX)(字)
短格式: OUT DX, AL (字节)
OUT DX, AX (字)
执行操作:( (DX) ) (AL)
(字节)
( (DX)+1, (DX) ) (AX)(字)
SRC是源操作数,可以是寄存器、存储单元或立即数。
(1)立即数传送给通用寄存器或存储单元 例如:MOV BL,44 MOV AX,3450H MOV WORD PTR [DI],2178H MOV BYTE PTR [DI],32H
ቤተ መጻሕፍቲ ባይዱ注意
不影响标志位。 立即数、CS和IP不能 做目的操作数
(2) 通用寄存器之间相互传送 MOV SI,DI MOV AL,BH
例: IN AX, 28H MOV DATA_WORD, AX
;IN BX,28H?
例: MOV DX, 3FCH IN AX, DX
例: OUT 5, AL;与MOV 5, AL比较
例:测试某状态寄存器(端口号27H)的第2位是否为1
IN
AL, 27H
TEST AL, 00000100B
JNZ ERROR
重点关注:
• 指令的汇编格式 • 指令的基本功能 • 指令支持的寻址方式 • 指令的执行对标志位的影响 • 指令的特殊要求
3.3 8086指令系统
3.3.1数据传送指令
数据传送指令的功能是将数据、地址或立即数传送到寄存器或存储单元中。
1.通用数据传送指令 格式: MOV DST ,SRC

2.5.1数据传送类

2.5.1数据传送类

指令书写格式 MOV 目标,源 PUSH 源 POP 目标 XCHG 目标,源 XLAT LEA 目标,源 LDS 目标,源 LES 目标,源 LAHF SAHF PUSHF POPF IN 累加器,端口 OUT 端口,累加器
1、通用数据传送指令 (1)MOV 传送指令 (2)堆栈操作指令(PUSH、POP) (3) 数据交换指令XCHG (4)换码指令XLAT
(1)取有效地址指令LEA (Load effective address) 格式:LEA 目标,源 功能:将源操作数的有效地址EA传送到目标操作数 源操作数:存储器寻址 目的操作数:16位通用寄存器 例如:LEA BX,TABLE
等效:MOV BX,OFFSET TABLE
(2) 指针送寄存器和DS指令——LDS
例如,MOV AL,1000H;指令有类型错误。
(3)除立即方式外,两个操作数不能同在存储器中。
例如,MOV [100],[200H];错误 MOV [100],3;正确
(4)不能改变CS的值。
例如,MOV CS,AX;是错误的
(5)段寄存器赋值不能用立即方式(必须使用通用寄存 器如AX中转 :立即数->AX->段寄存器),段寄存 器间的数据也不能直接传送。
SP
SP
BX 4X8XH 6XBHX
SP
6BH 48H
(3) 数据交换指令XCHG(1B或1W)
格式:XCHG 目标操作数,源操作数
源操作数:通用寄存器、存储单元
目标操作数:通用寄存器或存储单元
例如: XCHG AX,BX XCHG AX,[BX] XCHG AX,DAT2[BX][SI]
注:XCHG DATA1,AX 正确指令
(3)标志压栈指令——PUSHF(字)(Push the flags) 格式:PUSHF 功能:将16位标志寄存器FLAGS内容入栈保护

数据传送指令

数据传送指令

MOVX @Ri,A 7.堆栈操作类指令(2 条) 该类指令的功能是把直接寻址单元的内容传送到堆栈指针 SP 所指的单元 中,以及把 SP 所指单元的内容送到直接寻址单元中。 PUSH data POP data 前一条指令称为入栈操作指令,后一条指令称为出栈指令。由于开机复位 后,(SP)=07H,故一般需重新设置 SP 的初值。由于压入堆栈的第一个数 必须存放在 SP+1 所指存储单元,故实际的栈底为 SP+1 所指存储单元。 8.交换指令(4 条) 该类指令的功能是把累加器 A 中的内容与源操作数所指出的数据相互交 换。 有寄存器、直接和寄存器间接 3 种寻址方式。
XCH A,Rn XCH A,data XCH A,@Ri XCHD A,@Ri 9.16 位数据传送类指令(1 条) MOV DPTR,#data 该指令的功能是把 16 位常数送入数据指针寄存器,使用立即寻址方式。 译成机器码时,是高位字节在前,低位字节在后。
数据传送指令
传送指令是指令系统中最基本,使用最多的一类指令,主要用于数据的 传送、保存以及交换等场合。 1.以累加器 A 为目的操作数的指令(4 条) 这组指令的功能是把源操作数指定的内容送入累加器 A 中。 有寄存器、直接、寄存器间接和立即 4 种寻址方式。 MOV A, Rn MOV A, data MOV A,@Rn MOV A,#data 2.以寄存器 Rn 为目的的操作数的指令(3 条)
MOV data,A MOV data,Rn MOV data1,data2 MOV data,@Ri MOVdata,#data 4.以间接地址为目的操作数的指令(3 条) 这组指令的功能是把源操作数指定的内容送到以 Ri 中的内容为地址的片 内 RAM 中。 有寄存器、直接和立即 3 种寻址方式。 MOV @Ri,A MOV @Ri,data MOV @Ri,#data

数据传送指令

数据传送指令

数据传送指令1. 通⽤数据传送指令 MOV,PUSH,POP,XCHG,XLAT(1)MOV①MOV DS, 2000H ; //语法错误,不能⽤⽴即数给段寄存器赋值。

应该为:MOV AX, 2000MOV DS, AX② MOV WORD PTR[DI], 2000HPTR 是属性运算符,功能为修改操作数的类型。

WORD PTR 的作⽤是将操作数的类型设置为字类型。

③MOV [DI], 04AH ; //语法错误:源和⽬的操作数的类型都不确定,产⽣⼆异性。

因为[DI]代表的仅是⾸地址,不能确定它具体有多少个地址;⽽04AH也不能确定它前⾯有多少个0,占的字节数⾃然也不确定。

注意:① MOV 指令不影响标志寄存器的任何标志位②源和⽬的操作数必须等长,即同时为字节类型或字类型。

③不允许给 CS(代码段寄存器)赋值。

④ MOV 指令不能访问 IP 和 Flags(2)PUSH,POPPUSH 和 POP 是堆栈操作指令助记符。

堆栈是程序在内存中开辟的⼀个数据区,⽤以保存寄存器或存储器中暂时不⽤⽽⼜必须保存的数据。

程序中堆栈是⽤段定义语句在内存中定义的⼀个堆栈段,堆栈段的段基址存放在 SS 寄存器,段内偏移地址存放在 SP 寄存器中, SP 也常称为堆栈指针,它总是指向栈顶。

例如:设 SS=2000H,SP=102H,AX=623EH,执⾏下⾯指令后:PUSH AXAX 的数据 62H 存⼊ 20101H 单元,3EH 存⼊ 20100H 单元,SP=0100H注意:1. 堆栈指令的操作数必须是字类型,可以是 16 位的通⽤寄存器或段寄存器,也可以是两个连续的内存单元,可以采⽤任何寻址⽅式。

2. CS 不能作为出栈指令的操作数。

3. 堆栈指令不影响任何标志位。

2. 输⼊输出指令 IN,OUT8086CPU 对所有输⼊输出端⼝统⼀管理,提供了⼀个与内存储器地址空间分开的、完全独⽴的地址空间,I/O 端⼝的地址有 8 位和 16 位两种形式。

数据传送类指令

数据传送类指令

【例】: 设内部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=0CAH,分析以 下程序执行后,各单元、寄存器、P2口的内容。
MOV R0,#30H
;R0←30H
MOV A,@R0
;A←((R0))
MOV R1,A
;R1←(A)
MOV B,@R1
;B←((R1))
MOV @R1,P1
;A←00H
MOV @DPTR,A
;((DPTR))←(A)
程序段执行后,(DPTR)=2023H,(30H)=0FH,(A)=00H,(2023H)=00H,表示 把片外RAM 2023H单元的内容0FH送到内部RAM的30H单元,然后把外部RAM 2023H单元和累加器A清0。
若采用R0和R1间接寻址,必须把高8位地址先送到P2口,上述程序段将改为:
单片机原理与应用
助记符有:MOV,MOVX,MOVC,XCH,XCHD,PUSH,POP,SWAP。 格式:MOV [目的操作数],[源操作数] 功能:目的操作数← 源操作数中的数据 源操作数可以是:A、Rn、direct、@Ri、#data 目的操作数可以是:A、Rn、direct、@Ri
注意:一般不影响标志,只有一种堆栈操作可能直接修改程序状态字 PSW。另外,如果目的操作数为ACC,将会影响奇偶标志P。
MOV A,@Ri
A←((Ri)) √ × × × Ri内容指向的地址单元中的内容送到累加器A
【例】: 设外部RAM(2023H)=0FH,执行以下程序段:
MOV DPTR,#2023H ;DPTR←2023H
MOVX A,@DPTR
;A←((DPTR))
MOV 30H,A
;30H←(A)

数据传送指令

数据传送指令

数据传送指令3.数据传送指令将数据从⼀个位置复制到另⼀个位置的指令。

最简单形式的数据传送指令——MOV类指令。

指令格式指令功能效果movb S,D传送⼀个字节(8位)S->Dmovw S,D传送⼀个字(16位)S->Dmovl S,D传送双字(32位)S->Dmovq S,D传送四字(32位扩展为64位)S->Dmovabsq I,R传送绝对的四字(64位)I->R源操作数可以为以下类型⽴即数,例如$0x100寄存器,例如%bp存储器,例如(%rdi,%rcx)⽬的操作数可为寄存器或存储器。

x86-64限制:传送指令源操作数及⽬的操作数不能都指向内存位置。

movabsq能够以任何64位数(⽴即数、寄存器、存储器)作为源操作数,但只能以寄存器作为⽬的操作数。

MOVZ类指令MOVZ类指令将较⼩的源值复制到较⼤的⽬的中去,将⽬的中剩余字节填充为0零扩展,格式为movz#&(#为源操作数的⼤⼩,&为⽬的操作数的⼤⼩):movzbwmovzblmovzbqmovzwlmovzwq注:⽆movzlq指令,movzlq可利⽤以寄存器位⽬的的movl实现(因为movl会将寄存器⾼位四字节置零)MOVS类指令MOVS类指令将较⼩的源值复制到较⼤的⽬的中去,将源操作的最⾼为复制⽤于填充⽬的剩余字节,即传送符号扩展的字节符号扩展,格式为movs#&(#为源操作数的⼤⼩,&为⽬的操作数的⼤⼩):movsbwmovsblmovsbqmovswlmovswqmovslqcltq 把%eax符号扩展到%rax(eax为rax寄存器的低32位)类似于movslq %eax,%rax程序栈程序栈是⼀种数据结构,具有“后进先出(Last In First Out)”的特性。

在x86-64中,程序栈存放在内存中的某个区域,栈顶元素的地址是所有栈中元素地址最低的,栈指针%rsp保存栈顶元素的地址。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据传送指令
数据传送指令包括数据的传送、交换、堆栈数据的压入与弹出,是最基本、使用率最高的一类指令。

助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP共八种。

1.MOV类指令及功能(16条)
这类指令的功能是从源操作数到目的操作数的数据传送。

MOV A, Rn ;Rn→A,寄存器Rn的内容送到累加器A
MOV A, direct ;(direct)→A,直接地址中的内容送A
MOV A, @Ri ;(Ri)→A,Ri间址的内容送A
MOV A, #data ;data→A,立即数送A
MOV Rn,, A ;A→Rn,累加器A中的内容送寄存器Rn
MOV Rn, direct ;(direct)→Rn;直接地址中的内容送Rn
MOV Rn, #data ;data→Rn;立即数送Rn
MOV direct, A ;A→(direct),A中的内容送入直接地址中
MOV direct, Rn ;Rn→(direct),寄存器内容送入直接地址中
MOV direct, direct ;(direct) →(direct),源操作数直接地址的内容送

;目的操作数的直接地址中
MOV direct, @Ri ;(Ri)→(direct),Ri间址内容送入直接地址中
MOV direct, #data ;data→(direct),立即数送入直接地址中
MOV @Ri, A ;A→(Ri),A中内容送到Ri间址单元中
MOV @Ri, direct ;(direct)→(Ri),直接地址中内容送入Ri间址单元中
MOV @Ri, #data ;data→(Ri),立即数送入Ri间址单元中
MOV DPTR, #data16 ;data16→DPTR,16位常数送入数据指针DPTR中,高8
;位送入DPH,低8位送入DPH,低8位送入DPL中从上述指令可以看出目的操作数有A累加器、Rn寄存器、直接地址direct及间接地址@Ri,源操作数除此之外还多一种立即数data。

例1 R0中有常数30H,而30H地址中有常数50H
执行MOV A, R0后,A=30H,R0不变。

执行MOV A, @R0后A=50H,而不是30H,这条指令的功能是把R0中内容为地址的单元的书送入A,R0中是30H也就是把30H地址中内容50H送入A。

例2 若(40H)=20H,(50H)=30H
执行MOV 40H, 50H; (50H) →(40H)
结果:(40H)=30H,50H地址中内容仍为30H。

例3若A=40H,R0=30H,
执行MOV @R0, A ;A→(R0)
结果:(30H)=40H,A与R0皆不变,即A=40H,R0=30H。

该指令功能是把A中内容送入R0间址单元即R0中内容为地址的单元。

例4执行MOV DPTR, #2040H ;2040H→DPTR
结果:DPH=20H, DPL=40H
DPTR是片外RAM地址指针,只有这一条指令是传送16位数据。

2.MOVC类指令及功能(2条)
MOVC A, @A+PC ;PC+1→PC, (A+PC) →A
MOVC A, @A+DPTR ;(A+DPTR) →A
功能:该类属于查表指令,利用这两条指令很方便地查找放在程序存储器中数据表格的内容。

例1程序
1000H MOV A, #10H ;10H→A
1002H MOVC A, @A+PC ;PC+1→PC,PC=1003H,(A+PC)=(10H+1003H)→A
...
1010H 02H
1011H 04H
1012H 06H
1013H 08H
程序执行结果:A=08H
用MOVC A, @A+PC指令需注意两点:
1)指令中的PC是执行完本条指令后的PC值,即PC等于本条指令地址加1。

2)A是修正值,它等于查表指令和欲查数据相间隔字节数。

A的范围是0~255,一次该指令只能查找本指令后的256B范围内的表格,故称为近程查表。

例2 程序
1000H MOV A, #01H ;01H→A
1002H MOV DPTR, #6000H ;6000H→DPTR
1005H MOVC A,@A+DPTR ;(A+DPTR)=(01H+6000H)=(6001H) →A
...
6001H 0AH
6002H 0BH
6003H 0CH
6004H 0DH
程序执行结果:A=0AH,查到了地址为6001H单元中的数据。

用MOVC A, @A+DPTR指令查表特点:A, DPTR都可以改变,因此可在64KB范围内查表,故称为远程查表。

这条指令更方便。

3.MOVX类指令(4条)
MOVX A, @DPTR ;(DPTR) →A,DPTR间址单元内容送A
MOVX @DPTR, A ;A→(DPTR), A 中内容送入DPTR间址单元
MOVX A, @Ri ;(Ri) →A,Ri间址单元内容送A
MOVX @Ri, A ;A→(Ri), A中内容送Ri间址单元MOVX类指令功能:这四条指令专门用来与外部数据存储区传送数据。

CPU与外部RAM传送数据时只能用间接寻址方式。

例1把外部数据存储单元2000H中的数据送到4000H单元中,设2000H中有数据30H。

程序各条指令执行结果
MOV DPTR, #2000H ;2000H DPTR, DPTR=2000H
MOVX A, @DPTR ;(DPTR) A即(2000)A,A=30H
MOV DPTR, #4000H ;4000H→DPTR, DPTR=4000H
MOVX @DPTR, A ;A→(DPTR)即A→(4000H), (4000H)=30H 例2把内部RAM50H单元数据送到片外20H单元,设50H中单元存有数据10H。

程序各条指令执行结果
MOV A,50H ;(50H) 各条指令执行结果A, A=10H
MOV R0,#20H ;20H→R0, R0=20H
MOVX @R0, A ;A→(R0)即A→(20H)则20H=10H 注意:与外部RAM传送数据时,地址小于256B用Ri间址,大于256B时用DPTR间址。

4.交换指令
XCH A, Rn ;Rn A, Rn与A内容交换
XCH A,direct ;(direct) A, 直接地址内容与A内容交换
XCH A, @Ri ;(Ri) A,Ri间址内容与A内容交换
XCHD A, @Ri ;(Ri.3~Ri.0) A.3~A.0, Ri间址内容低4
位与A中低4 位内容交换 SWAP A ;A.3~A.0 A.7~A.4, A中高4位与低4位
交换
例若R0=30H, A=F0H, (30H)=46H
执行 XCH A, R0 ;结果:A=30H,R0=F0H, R0与A 内容交换
执行 XCH A, @R0 ;结果:A=46H, (30H)=F0H, R0中不变,
;实际上是(R0)
若执行XCHD A, @R0 ;结果:A=F6H,(30)H=40H
;A与(30H)中低4位交换,高4位不变执行SWAP A ;结果:A=0FH, 高低4位互换
5.堆栈操作指令(2条)
PUSH、POP属堆栈操作指令,其功能是把直接地址中的内容压入堆栈保存,或从堆栈中取出(弹出)数据到直接地址中。

PUSH direct ;SP+1→SP, (direct)→(SP)
;直接地址内容压入堆栈顶
POP direct ;(SP)→(direct), SP-1→SP
;堆栈栈顶内容弹出到直接地址
注意:堆栈是用户自己设定的内部RAM中的一块专用存储区,使用堆栈时一定先设堆栈指针。

堆栈遵循后进先出的原则安排数据。

压入数据时SP先加1,再压入;弹出时,先弹出数据,SP再减1。

例设堆栈指针为30H,为保护现场把A和B中的内容压入堆栈保护,然后根据需要再把两者弹出。

设A中为30H,B中为01H。

程序执行结果
MOV SP, #30H ;30H→SP, SP=30H设堆栈指针为30H
PUSH ACC ;SP+1→SP=31H, A→(SP)即A→(31H),(31H)=30H
PUSH B ;SP+1→SP=32H, B→(SP)即B→(32H),(32H)=01H
POP B ;SP→B即(32H)→B, B=01H, SP-1→SP=31H
POP ACC ;SP→A即(31H)→A, A=30H, SP-1→SP=30H 从此例可以看出压入、弹出过程SP的变化规律。

相关文档
最新文档