数据传送指令
- 格式:docx
- 大小:202.32 KB
- 文档页数:5
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所指示的位置,高字节在较高地址单元,低字节在较低地址单元中(真正的栈顶单元)。
汇编语言程序设计基本命令汇编语言是一种底层的编程语言,直接操作计算机硬件,其指令由一系列的机器码组成。
在汇编语言程序设计中,我们需要了解一些基本的命令,包括数据传送指令、算术运算指令、控制转移指令等,下面就对这些命令做一详细的介绍。
1.数据传送指令在汇编语言中,数据传送指令用来将数据从一个位置复制到另一个位置,常用的数据传送指令有MOV、LEA和XCHG。
-MOV指令:将源操作数的值复制给目标操作数,格式为MOV目标操作数,源操作数。
-LEA指令:用来将有效地址(即内存中的地址)传送给寄存器,格式为LEA目标操作数,源操作数。
-XCHG指令:交换两个操作数的值,格式为XCHG目标操作数,源操作数。
2.算术运算指令在汇编语言中,我们可以使用一系列算术运算指令来对数据进行运算和处理,常见的算术运算指令有ADD、SUB、MUL和DIV等。
-ADD指令:用于进行加法运算,格式为ADD目标操作数,源操作数。
-SUB指令:用于进行减法运算,格式为SUB目标操作数,源操作数。
-MUL指令:用于进行乘法运算,格式为MUL目标操作数,源操作数。
-DIV指令:用于进行除法运算,格式为DIV目标操作数,源操作数。
控制转移指令用于改变程序的执行流程,常见的控制转移指令有JMP、JZ、JE、JNE等。
-JMP指令:用于无条件地跳转到目标地址继续执行,格式为JMP目标地址。
-JZ指令:用于当结果为零时跳转到目标地址继续执行,格式为JZ目标地址。
-JE指令:用于当结果相等时跳转到目标地址继续执行,格式为JE目标地址。
-JNE指令:用于当结果不相等时跳转到目标地址继续执行,格式为JNE目标地址。
4.逻辑运算指令逻辑运算指令用于对数据进行逻辑运算,常见的逻辑运算指令有AND、OR、XOR和NOT等。
-AND指令:对两个操作数的对应位进行与运算,格式为AND目标操作数,源操作数。
-OR指令:对两个操作数的对应位进行或运算,格式为OR目标操作数,源操作数。
一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。
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(封锁)。
汇编常用指令1. 前言汇编语言是一种低级别的计算机语言,它是由一些指令组成的。
指令是一条计算机执行的命令,从基本上讲,这些指令代表着标准的操作,例如加、减、乘、除、移位和比较等。
汇编语言可以通过编写程序来控制一个计算机的行为,这些程序通常被称为汇编程序。
本文将介绍汇编语言中一些常用的指令。
2. 数据传送指令数据传送指令是汇编语言中最基本的指令之一,它主要用来将数据从一个位置传送到另一个位置。
在汇编语言中,数据传送指令通常使用MOV语句来实现。
下面是一些常用的数据传送指令:- MOV AX, BX:将BX中存储的数据传送到AX中。
- MOV AX, [BX]:将BX中存储的地址所指向的数据传送到AX中。
- MOV [BX], AX:将AX中存储的数据传送到BX所指向的地址中。
3. 算术运算指令算术运算指令主要用来执行各种数学运算,例如加法、减法、乘法和除法等操作。
下面是一些常用的算术运算指令:- ADD AX, BX:将BX中存储的数据与AX中存储的数据相加,并将结果存储在AX中。
- SUB AX, BX:将BX中存储的数据从AX中存储的数据中减去,并将结果存储在AX中。
- MUL BX:将AX中存储的数据与BX中存储的数据相乘,并将结果存储在AX中。
- DIV BX:将AX中存储的数据除以BX中存储的数据,并将结果存储在AX和DX中。
4. 位运算指令位运算是一种在二进制数字级别上的运算,它可以执行各种位操作,例如AND、OR、XOR和NOT等操作。
下面是一些常用的位运算指令:- AND AX, BX:将BX中存储的数据与AX中存储的数据按位进行AND运算,并将结果存储在AX中。
- OR AX, BX:将BX中存储的数据与AX中存储的数据按位进行OR 运算,并将结果存储在AX中。
- XOR AX, BX:将BX中存储的数据与AX中存储的数据按位进行XOR运算,并将结果存储在AX中。
- NOT AX:将AX中存储的数据按位进行取反操作。
汇编语言的基本语法在计算机科学领域中,汇编语言是一种低级语言,用于编写计算机程序。
它直接操作计算机硬件,比高级语言更接近计算机底层。
汇编语言的使用需要对其基本语法有一定的了解。
本文将介绍汇编语言的基本语法,以帮助读者更好地理解和使用这种语言。
一、数据传送指令在汇编语言中,数据传送是最基本的操作之一。
它用于将一个数据从一个位置传送到另一个位置。
数据传送指令由源操作数和目的操作数组成,示例如下:MOV 目的操作数,源操作数其中,目的操作数是要传送数据的目标位置,源操作数是数据的来源位置。
例如,将一个常量值传送给寄存器AX的指令可以写成:MOV AX,1000H这条指令将十六进制常量1000H传送给寄存器AX。
二、算术指令在汇编语言中,算术指令用于对数据进行算术运算。
常见的算术运算包括加法、减法、乘法和除法。
以下是一些常用的算术指令示例:ADD 目的操作数,源操作数 ; 相加SUB 目的操作数,源操作数 ; 相减MUL 目的操作数,源操作数 ; 乘法DIV 目的操作数,源操作数 ; 除法其中,目的操作数是要进行运算的操作数存储位置,源操作数是用于运算的数据来源。
三、跳转指令在程序执行过程中,跳转指令用于改变程序的执行顺序。
它根据条件选择不同的路径执行,或者直接跳转到指定的地址。
常见的跳转指令有以下几种形式:JMP 目标地址 ; 无条件跳转JE 目标地址 ; 相等时跳转JNE 目标地址 ; 不相等时跳转JG 目标地址 ; 大于时跳转JGE 目标地址 ; 大于等于时跳转JL 目标地址 ; 小于时跳转JLE 目标地址 ; 小于等于时跳转这些指令根据前面的条件判断进行跳转。
四、循环指令在汇编语言中,循环指令用于重复执行一段程序。
常见的循环指令有以下两种形式:LOOP 目标地址 ; 循环指令,计数器减1并跳转JCXZ 目标地址 ; 循环指令,计数器为0时跳转这些指令根据指定的条件进行重复执行,直到条件不满足为止。
传送及比较指令总结传送指令是计算机系统中常用的一类指令,用于将数据从一个位置移动到另一个位置。
这些指令通常用于数据的复制、转移和重排等任务。
在本文中,我将总结一些常见的传送指令,并比较它们的异同。
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 指令常用于实现数据交换、排序和互斥访问等场景。
微机原理指令大全微机原理是计算机科学中的重要基础知识,而指令则是微机原理中的核心内容之一。
指令是计算机中的基本操作命令,它直接影响着计算机的运行和执行效率。
本文将为大家详细介绍微机原理中常见的指令,并提供一份完整的指令大全,希望能够帮助大家更好地理解和掌握微机原理中的指令知识。
一、数据传送指令。
数据传送指令是微机原理中最基本的指令之一,它用于将数据从一个地方传送到另一个地方。
常见的数据传送指令包括MOV、LDM、STM等。
这些指令可以实现寄存器之间、寄存器和内存之间、内存和输入输出设备之间的数据传送操作,是计算机程序中不可或缺的一部分。
二、算术运算指令。
算术运算指令用于进行各种数值计算操作,包括加法、减法、乘法、除法等。
常见的算术运算指令有ADD、SUB、MUL、DIV等。
这些指令可以对寄存器和内存中的数据进行各种算术运算,是计算机程序中常用的指令之一。
三、逻辑运算指令。
逻辑运算指令用于进行各种逻辑操作,包括与、或、非、异或等。
常见的逻辑运算指令有AND、OR、NOT、XOR等。
这些指令可以对寄存器和内存中的数据进行逻辑运算,是计算机程序中实现逻辑判断和控制流程的重要指令之一。
四、转移指令。
转移指令用于改变程序的执行顺序,包括无条件转移和条件转移两种。
常见的转移指令有JMP、JZ、JNZ、JC、JNC等。
这些指令可以实现程序的跳转和循环控制,是计算机程序中实现各种复杂逻辑的重要指令之一。
五、比较指令。
比较指令用于比较两个数据的大小关系,常见的比较指令有CMP、TEST等。
这些指令可以对寄存器和内存中的数据进行比较操作,并根据比较结果设置标志位,是实现条件转移和逻辑判断的重要指令之一。
六、输入输出指令。
输入输出指令用于实现计算机与外部设备的数据交换,包括输入数据和输出数据两种操作。
常见的输入输出指令有IN、OUT等。
这些指令可以实现计算机与外部设备之间的数据传输,是计算机程序中实现输入输出功能的重要指令之一。
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。
数据传送指令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保存栈顶元素的地址。
单片机常用指令单片机是一种集成在一个芯片上的微型计算机,广泛应用于各种电子设备中。
要让单片机按照我们的意愿工作,就需要给它下达各种指令。
下面就来介绍一些单片机常用的指令。
一、数据传送指令这一类指令用于在单片机内部的寄存器、存储器之间进行数据的传输。
比如“MOV”指令,它可以将一个数据从源操作数传送到目的操作数。
例如“MOV A, 50H”,就是把十六进制数 50H 传送到累加器 A 中。
“MOVX”指令则用于在单片机与外部数据存储器之间进行数据传送。
比如“MOVX A, @DPTR”,可以从外部数据存储器中读取数据到累加器 A 。
二、算术运算指令用于执行加、减、乘、除等算术运算。
“ADD”指令用于加法运算,“SUBB”指令用于带借位的减法运算。
例如“ADD A, R0”,将累加器 A 的值和寄存器 R0 的值相加,结果存放在累加器 A 中。
“MUL”指令用于乘法运算,它将累加器 A 和寄存器 B 中的两个 8 位无符号数相乘,结果的低 8 位存放在累加器 A 中,高 8 位存放在寄存器 B 中。
三、逻辑运算指令进行与、或、异或等逻辑操作。
“ANL”指令执行逻辑与操作,“ORL”指令执行逻辑或操作,“XRL”指令执行逻辑异或操作。
例如“ANL A, 0FH”,将累加器 A 的值和十六进制数 0FH 进行逻辑与运算,结果存放在累加器 A 中。
四、控制转移指令这类指令用于改变程序的执行流程。
“JMP”指令用于无条件跳转,直接跳转到指定的地址去执行程序。
例如“JMP 1000H”,程序将跳转到地址为 1000H 的地方继续执行。
“CJNE”指令用于比较两个操作数,如果不相等则跳转。
比如“CJNE A, 50H, LOOP”,如果累加器 A 的值不等于 50H ,就跳转到标号 LOOP 处执行。
“LCALL”和“ACALL”指令用于调用子程序。
“LCALL”可以调用64KB 范围内的子程序,而“ACALL”只能调用 2KB 范围内的子程序。
数据传送指令******************************************************************************* 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。
5.5数据传送指令
数据传送指令用于各个存储单元之间进行一个或多个数据传送。
根据指令一次传送数据的个数可分为:单个数据传送指令和块传送指令。
单个数据传送指令每次传送一个数据,传送数据的类型可以是字节(B)、字(W)、双字(DW)和实数(R)。
块传送指令可用来一次传送多个数据,最多可将255个数据组成一个数据块,数据块的类型可以是字节块(BMB)、字块(BMW)和双字块(BMD)。
表5- 数据传送指令
字
字
字
字
传
双
实
5.5.1梯形图格式
传送指令由传送符MOV、数据类型(B/W/D/R)、数据输入端EN、源操作数IN、目标操作数OUT和数据输出端ENO构成。
5.5.2工作原理
启动号信EN=1时,执行传送功能。
其功能是把原
操作数IN传送到目标操作数OUT中。
5.5.3数据传送指令使用要点
1.应用传送指令应该注意输入数据类型和输出数据类型相一致。
字节用符号B,字用符号W,双字用符号D,实数用符号R表示。
2.传送指令可自保持,不用每个周期都传送。
3.传送指令常用于初始化程序中。
【例5-】传送指令基本用法
【例5-】传送指令注意事项。
1.8086指令系统操作数符号表示
DST->目的操作数
SRC->源操作数
TARGET->循环、转移和调用指令操作数
reg->寄存器操作数,字节或字
reg8->寄存器操作数,字节
reg16->寄存器操作数,字
mem->存储器操作数,字节或字
mem8->字节型存储器操作数
mem16->字型存储器操作数
mem32->双字型存储器操作数
acc->累加器AL或AX
seg->段寄存器
imm->立即操作数,字节或字
imm8->8位立即操作数
imm16->16位立即操作数
short_label->短标号(8位偏移量)
near_label->近标号(16位地址或偏移)
far_label->远标号(32位地址)
指令的功能——该指令能够实现何种操作。
通常指令助记符就是指令功能的英文单词或其缩写形式
指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式
指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响
其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等
一、数据传送类指令
1.Mov(mov目的操作数,源操作数)
目的操作数:reg、seg、mem
源操作数:reg、seg、mem、imm
注意事项:
1、立即数不能直接送入段寄存器内
2、存储器之间不能互相送数
3、段寄存器之间不能相互送数
4、目的操作数不允许用段寄存器CS
5、送数的时候需要明确是字操作还是字节操作,即源操作数和目的操作数的位数
要统一,除非目的操作数的位数大于源操作数。
(寄存器有明确的字节或字类型,
有寄存器参与的指令其操作数类型就是寄存器的类型;对于存储器单元与立即
数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr
指示字类型)
如何判断
✧两个操作数都明确了,两者必须一致
✧两个操作数有一个明确,另一个就以明确的为依据
✧两个操作数都不明确,就会出错
2.XCHG(把两个地方的数据进行互换;XCHG 目的操作数,源操作数)
目的操作数:寄存器、存储器
源操作数:寄存器、存储器
注意:
1.存储器之间不能相互传数据
2.一般目的操作数与与操作数可以互换
3.XLAT(用于查表转换;XLAT)
目的操作数和源操作数隐含
源操作数:位于地址为DS:[BX+AL]中的一个字节的数据,即(DS:[BX+AL])
目的操作数:寄存器AL
注意:
1.执行该指令前,需要先执行两条指令
Mov bx,表格的首地址偏移量
Moval,被转换码
2.换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码;表格
首地址存放于BX,AL存放相对表格首地址的位移量
换码指令执行后:将AL寄存器的内容转换为目标代码
4.堆栈操作指令
SS段寄存器记录其段地址,堆栈只有一个出口,即当前栈顶;用堆
栈指针寄存器SP指定
✧进栈指令:Push目的操作数;
进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈
顶部
✧POP目的操作数;
出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指
针SP加2
注意:
1.目的操作数为mem16;reg16;seg
2.堆栈是向下生长的(即栈顶地址逐渐减小)
3.这个存储区最大地址的字单元为堆栈底部,称为栈底(bottom)
4.任何时刻存放最后一个字的存储单元地址称为栈顶(top)(SP的值)
5.栈底是不变的,栈顶是变化的
6.字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字。
7.堆栈操作遵循先进后出原则,但可用BP寻址方式随机存取堆栈中的数据。
8.POP指令的目的操作数不能为CS!!!!
应用:
保护现场:(注意进出栈的顺序)
fun:
PUSH DS
PUSH ES
PUSH AX
PUSH BX ;处理部分
POP BX
POP AX
POP ES
POP DS
RET
用堆栈交换数据(注意进出栈顺序)PUSH AX
PUSH BX
POP AX
POP BX
♌堆栈的建立和操作(代码及示意图)
5.标志寄存器传送指令(用来传送标志寄存器FLAGS的内容,方便进行对各个标志位
的直接操作)
有2对4条指令
✧低8位传送:LAHF和SAHF
✧16位传送:PUSHF和POPF
LAHF;AH←FLAGS的低字节
LAHF指令将标志寄存器的低字节送寄存器AH
SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意
SAHF;FLAGS的低字节←AH
SAHF将AH寄存器内容送FLAGS的低字节
用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志
PUSHF;(SP←SP-2;SS:[SP]←FLAGS)
栈顶指针SP先减2,PUSHF指令将标志寄存器的内容压入堆栈
POPF;(FLAGS←SS:[SP];SP←SP+2)
POPF指令将栈顶字单元内容送标志寄存器,然后栈顶指针SP加2
注意:
源操作数和目的操作数都隐含。
♌对标志位进行修改:
pushf ;保存全部标志到堆栈
pop ax ;从堆栈中取出全部标志
or ax,0100h ;设置D8=TF=1,ax其他位不变
push ax ;将ax压入堆栈
popf ;FLAGS←AX;将堆栈内容取到标志寄存器
6.地址传送指令(地址传送指令将存储器单元的逻辑地址送至指定的寄存器)
✧有效地址(偏移地址)传送指令LEA(load EA;LEA r16,mem)
将存储器操作数的有效地址传送至指定的16位寄存器中
✧指针传送指令(这两条指令主要用在串操作,mem指定主存的连续4个字节
作为逻辑地址(32位的地址指针),送入DS:[r16]或ES:[r16]) LDS r16,mem(r16←mem;DS←mem+2)
LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器
LES r16,mem(r16←mem;ES←mem+2)
LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器
♌课本P46示例
7.输入输出指令(与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地
址)
目的操作数:AX/AL
源操作数:imm8(00H-0FFH)/DX(ALL)
格式:
输入指令:
IN AL,i8;字节输入:AL←I/O端口(i8直接寻址)
IN AL,DX;字节输入:AL←I/O端口(DX间接寻址)
IN AX,i8;字输入:AX←I/O端口(i8直接寻址)
IN AX,DX;字输入:AX←I/O端口(DX间接寻址)
输出指令:
OUT i8,AL;字节输出:I/O端口←AL(i8直接寻址)
OUT DX,AL;字节输出:I/O端口←AL(DX间接寻址)
OUT i8,AX;字输出:I/O端口←AX(i8直接寻址)
OUT DX,AX;字输出:I/O端口←AX(DX间接寻址)
注意:
1.寻址外设端口的地址线为16条,端口最多为216=65536(64K)个,端口号为
0000H~FFFFH,因此,无需分段。
2.每个端口用于传送一个字节的外设数据
3.两种寻址方式:
直接寻址:只用于寻址00H~FFH前256个端口,操作数imm8表示端口号
间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号
对大于FFH的端口只能采用间接寻址方式
3.此处的立即数是地址,不是需要传输的数据!!!
4.字传送时,送低字节地址。
示例:;直接寻址,字节量输入
in al,21h
mov ah,al
in al,20h
;直接寻址,字量输入
in ax,20h
;间接寻址,字量输入
mov dx,20h
in ax,dx
三段程序完成相同的功能。