汇编经典教程第2节常用汇编指令
- 格式:ppt
- 大小:105.50 KB
- 文档页数:10
16位与32位汇编语言常用指令总结在计算机编程领域,汇编语言被广泛应用于底层程序设计,直接操作计算机硬件。
其中,16位和32位汇编语言是常见的两种类型。
本文将总结这两种汇编语言中常用的指令,帮助读者更好地理解和应用它们。
一、16位汇编语言常用指令1. 数据传送指令- MOV:将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。
- XCHG:交换两个寄存器或内存位置的数据。
2. 算术运算指令- ADD/SUB:实现加法和减法运算。
- MUL/IMUL:实现无符号与有符号乘法运算。
- DIV/IDIV:实现无符号与有符号除法运算。
3. 逻辑运算指令- AND/OR/XOR:实现与、或、异或逻辑运算。
- NOT:对操作数进行按位取反操作。
4. 条件转移指令- JMP:无条件跳转到指定地址。
- JZ/JNZ:根据零标志位(ZF)的值进行跳转。
- JC/JNC:根据进位标志位(CF)的值进行跳转。
5. 循环指令- LOOP:根据计数器的值进行循环。
- JCXZ/JECXZ:根据CX/ECX寄存器的值进行循环。
二、32位汇编语言常用指令1. 数据传送指令- MOV:同16位汇编语言中的指令,用于数据传送。
- PUSH/POP:将数据推入栈或从栈中弹出。
2. 算术运算指令- ADD/SUB:同16位汇编语言中的指令,用于加法和减法运算。
- MUL/IMUL:同16位汇编语言中的指令,用于乘法运算。
- DIV/IDIV:同16位汇编语言中的指令,用于除法运算。
3. 逻辑运算指令- AND/OR/XOR:同16位汇编语言中的指令,用于逻辑运算。
- NOT:同16位汇编语言中的指令,用于按位取反。
4. 条件转移指令- JMP:同16位汇编语言中的指令,用于无条件跳转。
- JZ/JNZ:同16位汇编语言中的指令,根据零标志位(ZF)进行跳转。
- JB/JNB:根据低位借位标志位(CF)进行跳转。
5. 循环指令- LOOP:同16位汇编语言中的指令,用于循环操作。
常见汇编代码汇编语言是一种低级语言,主要用于编写计算机的指令集。
在程序开发和系统调试中,掌握常见的汇编代码是非常重要的。
本文将介绍一些常见的汇编代码及其用途。
一、数据传输指令1. MOV:将数据从一个位置复制到另一个位置。
例如,MOV AX, BX将BX寄存器中的数据复制到AX寄存器中。
2. XCHG:交换两个位置的数据。
例如,XCHG AX, BX将AX寄存器和BX寄存器中的数据进行交换。
3. PUSH:将数据推入栈中。
例如,PUSH AX将AX寄存器的数据推入栈中。
4. POP:将数据从栈中弹出。
例如,POP AX将从栈中弹出的数据存储到AX寄存器中。
二、算术指令1. ADD:将两个数相加并将结果存储在目标位置。
例如,ADD AX, BX将AX寄存器和BX寄存器中的数据相加,并将结果存储到AX寄存器中。
2. SUB:将两个数相减并将结果存储在目标位置。
例如,SUB AX, BX将AX寄存器中的数据减去BX寄存器中的数据,并将结果存储到AX寄存器中。
3. MUL:将两个数相乘并将结果存储在目标位置。
例如,MUL AX, BX将AX寄存器和BX寄存器中的数据相乘,并将结果存储到AX寄存器中。
4. DIV:将两个数相除并将结果存储在目标位置。
例如,DIV AX, BX将AX寄存器中的数据除以BX寄存器中的数据,并将商存储到AX寄存器中。
三、逻辑指令1. AND:对两个数进行逻辑与操作,并将结果存储在目标位置。
例如,AND AX, BX将AX寄存器和BX寄存器中的数据进行逻辑与操作,并将结果存储到AX寄存器中。
2. OR:对两个数进行逻辑或操作,并将结果存储在目标位置。
例如,OR AX, BX将AX寄存器和BX寄存器中的数据进行逻辑或操作,并将结果存储到AX寄存器中。
3. XOR:对两个数进行逻辑异或操作,并将结果存储在目标位置。
例如,XOR AX, BX将AX寄存器和BX寄存器中的数据进行逻辑异或操作,并将结果存储到AX寄存器中。
汇编语言指令功能总结汇编语言是一种低级语言,主要用于编写机器码指令的程序。
在计算机科学领域中,汇编语言是非常重要的,因为它可以直接操作计算机的硬件资源。
本文将对汇编语言中常用的指令功能进行总结。
1. 数据传输指令数据传输指令用于将数据从一个位置传送到另一个位置。
常用的数据传输指令包括MOV(将数据从一个位置复制到另一个位置)、XCHG(交换两个位置的数据)、PUSH(将数据压入堆栈)、POP (将数据从堆栈中弹出)等。
2. 算术运算指令算术运算指令用于执行各种算术运算,例如加法、减法、乘法和除法。
常用的算术运算指令包括ADD(将两个数相加)、SUB(将一个数减去另一个数)、MUL(将两个数相乘)、DIV(将一个数除以另一个数)等。
3. 逻辑运算指令逻辑运算指令用于执行各种逻辑运算,例如与、或、非和异或。
常用的逻辑运算指令包括AND(对两个数执行与运算)、OR(对两个数执行或运算)、NOT(对一个数执行非运算)、XOR(对两个数执行异或运算)等。
4. 控制转移指令控制转移指令用于实现程序的跳转和循环执行。
常用的控制转移指令包括JMP(无条件跳转到指定的地址)、JZ(如果前一个运算结果为零则跳转)、JC(如果前一个运算结果进位则跳转)等。
5. 位操作指令位操作指令用于对数据的位进行操作。
常用的位操作指令包括AND(将两个数的对应位执行与运算)、OR(将两个数的对应位执行或运算)、NOT(取反操作)等。
6. 字符串操作指令字符串操作指令用于对字符串进行操作。
常用的字符串操作指令包括MOVSB(将一个字节从源地址复制到目的地址)、LODSB(将一个字节从源地址加载到AL寄存器)、STOSB(将AL寄存器中的值存储到目的地址)等。
7. 输入输出指令输入输出指令用于与计算机的输入输出设备进行交互。
常用的输入输出指令包括IN(从指定的端口读取数据)、OUT(将数据发送到指定的端口)等。
总结:汇编语言中的指令功能丰富多样,可以实现各种复杂的操作。
leave汇编指令汇编语言是一种低级机器语言的抽象表示,用于编写底层的系统软件和驱动程序。
在编程中,我们需要了解一些常见的汇编指令,以便能够对计算机进行底层的控制和操作。
下面是一些常见的汇编指令及其相关参考内容,供您参考。
1. MOV (Move):将数据从一个位置复制到另一个位置。
参考内容:- 操作数:寄存器、内存地址或立即数。
- 语法格式:MOV destination, source- 示例:MOV AX, BX (将BX的值复制到AX)- 参考资料:《x86汇编语言:从实模式到保护模式》2. ADD (Addition):将两个操作数的值相加,并将结果存储在目的操作数中。
参考内容:- 操作数:寄存器、内存地址或立即数。
- 语法格式:ADD destination, source- 示例:ADD AX, BX (将AX和BX的值相加,并将结果存储在AX)- 参考资料:《汇编语言程序设计》3. SUB (Subtraction):从目的操作数减去源操作数,并将结果存储在目的操作数中。
参考内容:- 操作数:寄存器、内存地址或立即数。
- 语法格式:SUB destination, source- 示例:SUB AX, BX (将AX减去BX的值,并将结果存储在AX)- 参考资料:《汇编语言程序设计:基于x86处理器》4. JMP (Jump):用于无条件跳转到程序的其他部分。
参考内容:- 操作数:跳转目标地址。
- 语法格式:JMP destination- 示例:JMP label (跳转到指定的标签位置)- 参考资料:《汇编语言程序设计》5. CMP (Compare):比较两个操作数的值,并根据比较结果设置状态寄存器中的标志位。
参考内容:- 操作数:寄存器、内存地址或立即数。
- 语法格式:CMP operand1, operand2- 示例:CMP AX, BX (比较AX和BX的值)- 参考资料:《x86 Assembly Language Programming with Ubuntu》6. JE (Jump if Equal):如果比较的结果为相等,则跳转到指定的标签位置。
一、数据传送指令(七种助记符)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 字节数据项表:奖项表中的字节数据存放到从标号开始的连续字节单元中。
汇编语⾔指令⼤全X86和X87汇编指令⼤全(带注释)⽬录⼀、数据传输指令1. 通⽤数据传送指令.2. 输⼊输出端⼝传送指令.3. ⽬的地址传送指令.4. 标志传送指令.⼆、算术运算指令三、逻辑运算指令四、串指令五、程序转移指令六、伪指令七、处理机控制指令:标志处理指令浮点运算指令集1、控制指令2、数据传送指令3、⽐较指令4、运算指令其它1.机械码,⼜称机器码.2.需要熟练掌握的全部汇编知识(只有这么多)3.常见修改(机器码)4.两种不同情况的不同修改⽅法⼀、数据传输指令它们在存贮器和寄存器、寄存器和输⼊输出端⼝之间传送数据.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.NEG 求反(以 0 减之).CMP ⽐较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的⼗进制调整.MUL ⽆符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),IMUL 整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV ⽆符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).IDIV 整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上⼋种移位指令,其移位次数可达255次.移位⼀次时, 可直接⽤操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04 SHL 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 程序结束.七、处理机控制指令:标志处理指令CMC 进位位求反指令STC 进位位置为1指令CLD ⽅向标志置1指令STD ⽅向标志位置1指令CLI 中断标志置0指令STI 中断标志置1指令NOP ⽆操作HLT 停机WAIT 等待ESC 换码LOCK 封锁浮点运算指令集1、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)FINIT 初始化浮点部件机器码 9B DB E3FCLEX 清除异常机器码 9B DB E2FDISI 浮点检查禁⽌中断机器码 9B DB E1FENI 浮点检查禁⽌中断⼆机器码 9B DB E0WAIT 同步CPU和FPU 机器码 9BFWAIT 同步CPU和FPU 机器码 D9 D0FNOP ⽆操作机器码 DA E9FXCH 交换ST(0)和ST(1) 机器码 D9 C9FXCH ST(i) 交换ST(0)和ST(i) 机器码 D9 C1iiiFSTSW ax 状态字到ax 机器码 9B DF E0FSTSW word ptr mem 状态字到mem 机器码 9B DD mm111mmmFLDCW word ptr mem mem到状态字机器码 D9 mm101mmmFSTCW word ptr mem 控制字到mem 机器码 9B D9 mm111mmmFLDENV word ptr mem mem到全环境机器码 D9 mm100mmmFSTENV word ptr mem 全环境到mem 机器码 9B D9 mm110mmmFRSTOR word ptr mem mem到FPU状态机器码 DD mm100mmmFSAVE word ptr mem FPU状态到mem 机器码 9B DD mm110mmmFFREE ST(i) 标志ST(i)未使⽤机器码 DD C0iiiFDECSTP 减少栈指针1->0 2->1 机器码 D9 F6FINCSTP 增加栈指针0->1 1->2 机器码 D9 F7FSETPM 浮点设置保护机器码 DB E42、数据传送指令FLDZ 将0.0装⼊ST(0) 机器码 D9 EEFLD1 将1.0装⼊ST(0) 机器码 D9 E8FLDPI 将π装⼊ST(0) 机器码 D9 EBFLDL2T 将ln10/ln2装⼊ST(0) 机器码 D9 E9FLDL2E 将1/ln2装⼊ST(0) 机器码 D9 EAFLDLG2 将ln2/ln10装⼊ST(0) 机器码 D9 ECFLDLN2 将ln2装⼊ST(0) 机器码 D9 EDFLD real4 ptr mem 装⼊mem的单精度浮点数机器码 D9 mm000mmmFLD real8 ptr mem 装⼊mem的双精度浮点数机器码 DD mm000mmmFLD real10 ptr mem 装⼊mem的⼗字节浮点数机器码 DB mm101mmmFILD word ptr mem 装⼊mem的⼆字节整数机器码 DF mm000mmmFILD dword ptr mem 装⼊mem的四字节整数机器码 DB mm000mmmFILD qword ptr mem 装⼊mem的⼋字节整数机器码 DF mm101mmmFBLD tbyte ptr mem 装⼊mem的⼗字节BCD数机器码 DF mm100mmmFST real4 ptr mem 保存单精度浮点数到mem 机器码 D9 mm010mmmFST real8 ptr mem 保存双精度浮点数到mem 机器码 DD mm010mmmFIST word ptr mem 保存⼆字节整数到mem 机器码 DF mm010mmmFIST dword ptr mem 保存四字节整数到mem 机器码 DB mm010mmmFSTP real4 ptr mem 保存单精度浮点数到mem并出栈机器码 D9 mm011mmmFSTP real8 ptr mem 保存双精度浮点数到mem并出栈机器码 DD mm011mmmFSTP real10 ptr mem 保存⼗字节浮点数到mem并出栈机器码 DB mm111mmmFISTP word ptr mem 保存⼆字节整数到mem并出栈机器码 DF mm011mmmFISTP dword ptr mem 保存四字节整数到mem并出栈机器码 DB mm011mmmFISTP qword ptr mem 保存⼋字节整数到mem并出栈机器码 DF mm111mmmFBSTP tbyte ptr mem 保存⼗字节BCD数到mem并出栈机器码 DF mm110mmmFCMOVB ST(0),ST(i) <时传送机器码 DA C0iiiFCMOVBE ST(0),ST(i) <=时传送机器码 DA D0iiiFCMOVE ST(0),ST(i) =时传送机器码 DA C1iiiFCMOVNB ST(0),ST(i) >=时传送机器码 DB C0iiiFCMOVNBE ST(0),ST(i) >时传送机器码 DB D0iiiFCMOVNE ST(0),ST(i) !=时传送机器码 DB C1iiiFCMOVNU ST(0),ST(i) 有序时传送机器码 DB D1iiiFCMOVU ST(0),ST(i) ⽆序时传送机器码 DA D1iii3、⽐较指令FCOM ST(0)-ST(1) 机器码 D8 D1FCOMI ST(0),ST(i) ST(0)-ST(1) 机器码 DB F0iiiFCOMIP ST(0),ST(i) ST(0)-ST(1)并出栈机器码 DF F0iiiFCOM real4 ptr mem ST(0)-实数mem 机器码 D8 mm010mmmFCOM real8 ptr mem ST(0)-实数mem 机器码 DC mm010mmmFICOM word ptr mem ST(0)-整数mem 机器码 DE mm010mmmFICOM dword ptr mem ST(0)-整数mem 机器码 DA mm010mmmFICOMP word ptr mem ST(0)-整数mem并出栈机器码 DE mm011mmmFICOMP dword ptr mem ST(0)-整数mem并出栈机器码 DA mm011mmmFTST ST(0)-0 机器码 D9 E4FUCOM ST(i) ST(0)-ST(i) 机器码 DD E0iiiFUCOMP ST(i) ST(0)-ST(i)并出栈机器码 DD E1iiiFUCOMPP ST(0)-ST(1)并⼆次出栈机器码 DA E9FXAM ST(0)规格类型机器码 D9 E54、运算指令FADD 把⽬的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在⽬的操作数后的变量或堆栈缓存器) 相加,并将结果存⼊⽬的操作数FADDP ST(i),ST 这个指令是使⽬的操作数加上 ST 缓存器,并弹出 ST 缓存器,⽽⽬的操作数必须是堆栈缓存器的其中之⼀,最后不管⽬的操作数为何,经弹出⼀次后,⽬的操作数会变成上⼀个堆栈缓存器了FIADD FIADD 是把 ST 加上来源操作数,然后再存⼊ ST 缓存器,来源操作数必须是字组整数或短整数形态的变数FSUB 减FSUBPFSUBR 减数与被减数互换FSUBRPFISUBFISUBRFMUL 乘FMULPFIMULFDIV 除FDIVPFDIVRFDIVRPFIDIVFIDIVRFCHS 改变 ST 的正负值FABS 把 ST 之值取出,取其绝对值后再存回去。
常⽤的汇编指令与技巧(收藏)1.数据传送指令:movmove r1,r2 /*r1=r2*/move r1,#4096 /*r1=4096*/2.⼤范围的地址读取指令:ldrldr r1,=0x123456789 /*r1=0x123456789*/ldr r1,=label /*获取绝对地址,即label的地址*/label: ……3.内存访问指令(当ldr后⾯没有=号时为内存读取指令)读取指令:ldrldr r1 ,[r2,#4] /*将内存地址为r2+4的数据读取到r1中,相当于C语⾔中的*操作*/ldr r1,[r2],#4 /*将内存地址为r2的数据读取到r1中,再将地址加4,r2=r2+4*/ldr pc,_irq /*pc=*(_irq)将标号中的内容放⼊pc中_irq: .word do_swi存储指令:strstr r1 ,[r2,#4] /*将r1的值存⼊地址为r2+4的内存中*/str r1,[r2],#4 /*将r1的值存⼊地址为r2的内存中,再将地址加4,r2=r2+4*/4.批量内存访问指令ldm,stm格式:ldm {cond} <addresing_mode> <rn> {!} <register list> {^} stm{cond} <addresing_mode> <rn> {!} <register list> {^}格式说明:1){cond}:表⽰指令的执⾏条件,根据cpsr寄存器中的条件标志位决定是否执⾏该条指令,每条ARM指令包含4bit的条件码域,可以定义16个执⾏条件,具体如下表:2)<addresing_mode>表⽰地址变化模式,具体如下:3)<rn> 中保存内存的地址,如果后⾯加上!,指令执⾏完成后,rn的值会更新,等于下⼀个内存的地址,否则保持初始值。
1.数据操作MOV AX,BX 数据传送指令,将BX的值移送给AX中.MOVSX AX,BL 符号填充命令,将BL的值移送给AX中,同时用BL的符号位填充AX 的高位数据为符号位MOVZX AX,BL 零填充指令,将BL的值移送给AX中,同时用0填充AX的高位数据位.XCHG AX,BX 将AX与BX的值互换.2.算术运算ADD AX,BX 加法运算AX=AX+BXSUB AX,BX 减法运算AX=AX-BXINC AX 寄存器加 AX=AX+1DEC AX 寄存器减AX=AX-1MUL 乘法运算DIV 除法运算3.比较语句CMP AX,BX AX寄存器减去BX寄存器的内容AND AX,BX AX与BX做"与运算"OR AX,BX AX与BX做"或运算"TEST AX,BX 与AND AX,BX命令相同的效果XOR AX,AX 使AX的内容清零,每个寄存器与自己做异或运算,等于清零动作.1,根据条件标志位的状态判断的转移指令JZ/JE 结果为零/相等则转移。
JNZ/JNE 结果不为零/不相等则转移。
//============================================================== JS 结果为负则转移。
JNS 结果为正则转移。
//============================================================== JO 溢出则转移。
JNO 不溢出则转移。
//============================================================== JP/JPE 奇偶位为1则转移。
JNP/JPO 奇偶位为0则转移。
//============================================================== JC 进位为1则转移。
伪指令•1、定位伪指令ORG m•2、定义字节伪指令DB X1,X2,X3, (X)•3、字定义伪指令DW Y1,Y2,Y3,…,Yn4、汇编结束伪指令END寻址方式MCS-51单片机有五种寻址方式:1、寄存器寻址2、寄存器间接寻址3、直接寻址4、立即数寻址5、基寄存器加变址寄存器间接寻址6、相对寻址7、位寻址数据传送指令一、以累加器A为目的操作数的指令(4条)•MOV A,Rn ;(Rn)→A n=0~7•MOV A,direct ;(direct )→A•MOV A,@Ri ;((Ri))→A i=0~1•MOV A,#data ;data →A二、以Rn为目的操作数的指令(3条)MOV Rn ,A;(A)→ RnMOV Rn ,direct;(direct )→ RnMOV Rn ,#data;data → Rn•三、以直接寻址的单元为目的操作数的指令(5条)MOV direct,A;(A)→directMOV direct,Rn;(Rn)→directMOV direct,direct ;(源direct)→目的directMOV direct,@Ri;((Ri))→directMOV direct,#data;data→direct四、以寄存器间接寻址的单元为目的操作数的指令(3条)MOV @Ri,A;(A)→(Ri)MOV @Ri,direct;(direct)→(Ri)MOV @Ri,#data;data→(Ri)五、十六位数据传送指令(1条)MOV DPTR,#data16;dataH→DPH,dataL →DPL六、堆栈操作指令进栈指令PUSH direct ;(SP)+1 →SP ,(direct)→ SP 退栈指令POP direct七、字节交换指令(5条)•XCH A,Rn ;(A)→ß(Rn)•XCH A,direct ;(A)→ß(direct)•XCH A,@Ri ;(A)→ß((Ri))•八、半字节交换指令•XCHD A,@Ri ;(A)0~3→ß((Ri))0~3九、加器A与外部数据存贮器传送指令(4条)•MOVX A,@DPTR ;((DPTR))→A•MOVX A,@ Ri ;((Ri))→A i=0,1•MOVX @ DPTR ,A ;(A)→(DPTR)•MOVX @ Ri , A ;(A)→(Ri)i=0,1 十、查表指令(i)MOVC A ,@ A+PC ;((A)+(PC))→A•(ii)MOVC A ,@A+ DPTR ;((A)+(DPTR))算术运算指令一、不带进位的加法指令(4条)ADD A,Rn ;(A)+(Rn)→AADD A,direct ;(A)+(direct)→AADD A,@Ri ;(A)+((Ri))→AADD A,#data ;(A)+#data→A二、带进位加法指令(4条)ADDC A,Rn ;(A)+(Rn)+CY→AADDC A,direct ;(A)+(direct)+CY →AADDC A,@Ri ;(A)+((Ri))+CY →AADDC A,#data ;(A)+ #data +CY →A三、增量指令(5条)INC A ;(A)+1 →A•INC Rn ;(Rn)+1 → Rn•INC direct ;(direct)+1 → direct•INC @Ri ;((Ri))+1 →(Ri)•INC DPTR ;(DPTR)+1 →DPTR四、十进制调整指令(1条)DA A减法指令一、带进位减法指令SUBB A,RnSUBB A,directSUBB A,@RiSUBB A,#data二、减1指令(4条)DEC ADEC RnDEC directDEC @Ri乘法指令MUL AB除法指令DIV AB逻辑运算指令累加器A的逻辑操作指令一、累加器A清0CLR A二、累加器A取反CPL A三、左环移指令RL A四、带进位左环移指令RLC A五、右环移指令RR A六、带进位右环移指令RRC A七、累加器ACC半字节交换指令SWAP A两个操作数的逻辑操作指令逻辑与指令ANL A,RnANL A,direct ANL A,@Ri ANL A,#data ANL direct ,A ANL direct,#data逻辑或指令ORL A,RnORL A,directORL A,@RiORL A,#dataORL direct,AORL direct,#data逻辑异或指令XRL A,RnXRL A,directXRL A,@RiXRL A,#dataXRL direct,AXRL direct,#data 位操作指令位变量传送指令MOV C,bitMOV bit,C 位变量修改指令CLR CCLR bitCPL CCPL bitSETB CSETB bit位变量逻辑与指令ANL C,bitANL C,/bit位变量逻辑或指令ORL C,bitORL C,/bit控制转移指令无条件转移指令(4条)1、短跳转指令AJMP addr11 ;先(PC)+2→PC ;addr11→PC10~0 ,(PC15~11)2、跳转指令LJMP addr16 ;Addr16→PC3、转移指令4、SJMP rel ;先(PC)+2→PC;后(PC)+rel→PC4、寄存器加变址存器间接转移指令(散转指令)JMP @A+DPTR ;(A)+(DPTR)→PC条件转移指令(8条)一、测试条件符合转移指令JZ rel ;当A=0 时,(PC)+rel→(PC)转移;当A≠0时,顺序执行。
汇编语言CMP指令CMP指令是汇编语言中常用的一种指令,用于比较两个操作数的大小。
该指令将两个操作数进行减法运算,并根据运算结果设置标志位,以供程序进行后续操作。
本文将对CMP指令的使用方法和注意事项进行详细介绍。
一、CMP指令的语法和功能在汇编语言中,CMP指令用于比较两个操作数的大小。
其常用的语法格式如下:CMP 源操作数,目的操作数其中,源操作数可以是寄存器、内存单元或立即数,而目的操作数通常为寄存器。
CMP指令的功能是将源操作数减去目的操作数,并根据减法运算的结果设置标志位。
具体来说,如果源操作数减去目的操作数等于零,则设置零标志位;如果源操作数小于目的操作数,则设置负标志位;如果源操作数大于目的操作数,则设置进位标志位。
二、CMP指令的使用方法1. 比较两个寄存器的内容CMP指令常用于比较两个寄存器的内容。
例如,下面的代码用于比较寄存器AX和寄存器BX的值:```MOV AX, 10h ; 将AX寄存器设置为10HMOV BX, 20h ; 将BX寄存器设置为20HCMP AX, BX ; 比较AX和BX的值```2. 比较寄存器和内存单元的内容除了比较寄存器之间的值,CMP指令还可以比较寄存器和内存单元的内容。
例如,下面的代码用于比较寄存器AX的值和内存单元[0100H]的值:```MOV AX, 10h ; 将AX寄存器设置为10HMOV CX, [0100H] ; 将CX寄存器设置为内存单元[0100H]的值CMP AX, CX ; 比较AX和CX的值```3. 比较寄存器和立即数此外,CMP指令还可以比较寄存器和立即数。
例如,下面的代码用于比较寄存器AX的值和立即数10H:```MOV AX, 10h ; 将AX寄存器设置为10HCMP AX, 10h ; 比较AX和立即数10H```三、CMP指令的注意事项在使用CMP指令时,需要注意以下几点:1. CMP指令仅影响标志位,不会影响操作数的值。
‚PTR‛操作符:强制类型转换MOV BYTE PTR [BX], 20H;1B立即数20H送DS:[BX]MOV WORD PTR [BX], 20H;立即数20H送DS:[BX],;00H送DS:[BX+1]2.LEA(Load Effective Address)设:变量X的偏移地址为1020H , (BP)=0020H执行指令后:LEA DX, XLEA BX, [BP]; 执行后, (DX) = 1020H; 执行后, (BX) = 0020H3.地址传送指令LDS,LESLDS REG16, MEM ; 从存储器取出4B,送入REG16和DS LES REG16, MEM ; 从存储器取出4B,送入REG16和ES 4.符号扩展指令CBW,CWDCBW ;将AL寄存器内容符号位扩展到AHCWD ;将AX寄存器内容符号位扩展到DX设:(AX)= 8060H,(DX)=1234H执行下列指令后CBW;(AX)= 0060H设:(AX)= 8060H,(DX)=1234H执行下列指令后CWD;(DX)= 0FFFFH,(AX)= 8060H5.交换指令XCHG例如,(AX)= 5678H执行下面指令后XCHG AH, AL;(AX)= 7856H6.换码指令XLATXLAT ;AL←DS: [BX+AL]表格的首地址事先存放在内存逻辑地址DS: BX中,AL的内容是相对于表格的位移量,把对应内存的内容取出放在AL寄存器。
7.逻辑运算符SHR(右移)SHL(左移)AND(与)OR(或)XOR(异或)NOT(取反8.关系运算符关系运算符用于两个数的比较,结果为‚真(-1)‛或‚假(0)‛GT(>)GE(>=)LT(<)LE(<=)EQ(=)NE(≠)9.地址运算符SEG 名称取地址表达式所在段的段基址OFFSET 名称取地址表达式的偏移地址10.类型操作符TYPE:取每个变量的字节数LENGTH:取变量定义了多少个SIZE:取变量占用的字节总数11.加法指令(1)ADD(Addition):加法指令格式:ADD dest,src功能:dest ←dest + srcdest(目的操作数):8/16位的寄存器/存储器操作数src(源操作数):与目的操作数同类型的寄存器/存储器/立即数例:ADD AX, SI ; AX←(AX)+(SI),16位运算ADD X, 3 ; X←(X)+3, 运算位数由X的类型确定ADD [BX], DX ; DS:[BX]←DS:[BX]+DX, 16位运算说明:•状态标志CF, OF, ZF, SF, PF, AF按照运算结果被刷新;(2)ADC(Addition with Carry):带进位的加法指令格式:ADC dest,src功能:dest←dest+src+CFdest(目的操作数):8/16位的寄存器/存储器src(源操作数):与目的操作数同类型的寄存器/存储器/立即数说明:•状态标志CF, OF, ZF, SF, PF, AF按照运算结果被刷新;•主要用于对数据分段相加时高位的加法运算。
汇编语言常用语句一览在学习和使用汇编语言时,熟悉常用的语句和指令是非常重要的。
本文将列举出一些汇编语言中常用的语句,以供参考和学习。
1. 数据传输指令MOV:将源数据移动到目标操作数中PUSH:将数据压入栈中POP:将栈顶元素弹出2. 算术运算指令ADD:将源数据与目标操作数相加SUB:将源数据与目标操作数相减INC:目标操作数自增1DEC:目标操作数自减1MUL:将源数据与目标操作数相乘DIV:将源数据与目标操作数相除3. 条件跳转指令JMP:无条件跳转到指定地址JZ/JNZ:根据零标志位是否为零跳转JE/JNE:根据相等标志位是否为真跳转JL/JLE:根据小于/小于等于标志位是否为真跳转JG/JGE:根据大于/大于等于标志位是否为真跳转4. 循环指令LOOP:循环指令,根据计数寄存器的值判断是否继续循环 INC/DEC + CMP + JNZ:结合使用,实现循环功能5. 标志位设置指令CMP:比较操作数,设置相应标志位TEST:与目标操作数进行按位与操作,设置相应标志位6. 子程序调用指令CALL:调用子程序RET:子程序返回指令7. 输入输出指令IN:从设备或端口读取数据OUT:向设备或端口输出数据8. 定义数据段指令DB:定义字节数据DW:定义字数据DD:定义双字数据9. 定义代码段指令SECTION:定义代码段10. 定义变量和常量指令DW:定义字变量或常量DD:定义双字变量或常量11. 定义字符串指令DB "Hello, World!",0:定义以0结尾的字符串12. 定义宏指令MACRO:定义宏ENDM:结束宏定义13. 定义过程指令PROC:定义过程ENDP:结束过程定义14. 调试指令INT 3:设置断点NOP:空操作以上是汇编语言中常用的语句一览。
通过熟悉和掌握这些语句,可以更好地编写汇编语言程序,并实现所需的功能。
希望本文对你的学习和使用汇编语言有所帮助。
second汇编指令用法标题:深入理解与应用第二汇编指令一、引言汇编语言,作为低级编程语言的一种,直接对应于计算机的机器语言,是程序员与计算机硬件进行直接交互的重要工具。
其中,第二汇编指令在程序设计中占据了重要地位。
本文将详细解析第二汇编指令的用法,帮助读者逐步理解和掌握这一关键技能。
二、第二汇编指令基础第二汇编指令,通常指的是在汇编语言中用于数据处理和程序控制的一系列指令。
这些指令可以直接操作计算机的硬件资源,如寄存器、内存和IO 设备等。
1. 指令格式第二汇编指令通常由操作码(Opcode)和操作数(Operand)两部分组成。
操作码表示要执行的操作,如加法、减法、移位等;操作数则是操作的对象,可以是寄存器、内存地址或立即数。
例如,以下是一个简单的加法指令:ADD AX, BX在这个例子中,“ADD”是操作码,表示执行加法操作;“AX”和“BX”是操作数,分别代表两个参与加法的寄存器。
2. 寄存器在第二汇编指令中,寄存器是一个重要的概念。
寄存器是CPU内部的临时存储空间,用于快速存储和访问数据。
常见的寄存器包括AX、BX、CX、DX、SI、DI、BP和SP等。
3. 内存操作第二汇编指令也可以直接操作内存。
内存地址通常以段地址:偏移地址的形式表示。
例如:MOV [BX], AX这个指令将AX寄存器的内容复制到BX寄存器所指向的内存地址中。
三、第二汇编指令详解以下是一些常用的第二汇编指令及其用法:1. 数据传送指令数据传送指令用于在寄存器之间、寄存器和内存之间或者内存的不同位置之间传送数据。
- MOV:用于将源操作数的内容复制到目标操作数。
例:`MOV AX, BX` 将BX寄存器的内容复制到AX寄存器。
- PUSH:将指定的源操作数压入堆栈。
例:`PUSH AX` 将AX寄存器的内容压入堆栈。
- POP:从堆栈中弹出数据并放入目标操作数。
例:`POP BX` 从堆栈中弹出数据并放入BX寄存器。
51单片机汇编语言指令教程汇集1.MOV指令:MOV指令用于将一个值从一个寄存器或内存位置复制到另一个寄存器或内存位置。
例如,MOVA,将常数10复制到累加器A中。
2.ADD指令:ADD指令用于将两个操作数相加,并将结果保存在目标操作数中。
例如,ADDA,B将寄存器B的值与累加器A的值相加,并将结果保存在累加器A中。
3.SUB指令:SUB指令用于将源操作数减去目标操作数,并将结果保存在目标操作数中。
例如,SUBA,B将寄存器B的值减去累加器A的值,并将结果保存在累加器A中。
4.INC指令:INC指令用于将指定的操作数加1、例如,INCA将累加器A的值加15.DEC指令:DEC指令用于将指定的操作数减1、例如,DECA将累加器A的值减16.JMP指令:JMP指令用于无条件地跳转到指定的地址。
例如,JMP1000h将跳转到地址1000h处执行指令。
9. ACALL指令:ACALL指令用于调用一个子程序,其地址由指令给出,子程序结束后返回到调用指令的下一条指令。
例如,ACALL Subroutine将调用一个名为Subroutine的子程序。
10.RET指令:RET指令用于从子程序返回到调用指令的下一条指令。
例如,RET将从子程序返回。
11.NOP指令:NOP指令用于空操作,即不执行任何操作。
它通常用于延时或填充空白。
以上是一些常用的51单片机汇编语言指令,这些指令可以用于控制I/O口、进行算术运算、执行跳转和调用子程序等。
学习并熟练掌握这些指令,对于编写高效的51单片机汇编程序非常重要。
希望本文提供的51单片机汇编语言指令教程能够帮助你入门和掌握51单片机汇编语言的基本知识。
如果你想深入学习51单片机汇编语言,建议参考相关的教材或在线资源,进行更加系统和全面的学习。