汇编cltq指令
第17章汇编语言伪指令参考资料

因为TABLEA定义为DW,故TYPE返回0002, LENGTH根据DUP的定义返回Hex 0014(20),而SIZE返 回TYPE与LENGTH的乘积,即Hex 28(40)。
第17章 汇编语言伪指令参考资料
17.2 汇编语言伪指令
1. ASSUME伪指令 ASSUME的功能是使汇编程序能将内存段与CS、 DS、ES、SS等段寄存器联系起来。其一般格式为: ASSUME 段寄存器名 :name[, ...]
…
SEG2 ENDS
第17章 汇编语言伪指令参考资料
4. INCLUDE伪指令 你可能会在不同的程序中用到一些内容相同的一 组指令即宏指令。它们可以文件的形式保存,使任何 程序都能使用它。假设有一个将ASCII数转换为二进制 的程序存于C盘,名称是CONVERT.LIB。要获得此文 件,可在源程序中加入INCLUDE句。例如: INCLUDE C :CONVERT.LIB
第17章 汇编语言伪指令参考资料
放置在原来应该编写这段ASCII数转换程序处。汇 编程序会从磁盘找到此文件,并把它的指令语句载入 (展开)使用者的程序。若汇编程序找不到此文件,会发 出错误信息而不进行INCLUDE操作。
汇编程序会在LST文本,把载入的指令语句每一行 的第30个字,印上一个1(第33个字开始是源程序)。
TABLEA DW 10 DUP(?) ...
MOV DX, LENGTH TABLEA
第17章 汇编语言伪指令参考资料
若操作数中不含DUP项,则运算符返回值01。 LENGTH的其他用法,另参考本节中的SIZE及TYPE。
2. OFFSET 运算符 OFFSET运算符返回变量或标号的偏移地址(亦即 数据段或指令段内的偏移地址)。其一般格式为: OFFSET 变量名(标号名)
汇编指令速查

汇编指令速查汇编指令速查GAS中每个操作都是有⼀个字符的后缀,表明操作数的⼤⼩。
C声明GAS后缀⼤⼩(字节)char b1short w2(unsigned) int / long / char*l4float s4double l8long double t10/12注意:GAL使⽤后缀“l”同时表⽰4字节整数和8字节双精度浮点数,这不会产⽣歧义因为浮点数使⽤的是完全不同的指令和寄存器。
操作数格式:格式操作数值名称样例(GAS = C语⾔)$Imm Imm⽴即数寻址$1 = 1Ea R[Ea]寄存器寻址%eax = eaxImm M[Imm]绝对寻址0x104 = *0x104(Ea)M[R[Ea]]间接寻址(%eax)= *eaxImm(Ea)M[Imm+R[Ea]](基址+偏移量)寻址4(%eax) = *(4+eax)(Ea,Eb)M[R[Ea]+R[Eb]]变址(%eax,%ebx) = *(eax+ebx)Imm(Ea,Eb)M[Imm+R[Ea]+R[Eb]]寻址9(%eax,%ebx)= *(9+eax+ebx)(,Ea,s)M[R[Ea]*s]伸缩化变址寻址(,%eax,4)= *(eax*4)Imm(,Ea,s)M[Imm+R[Ea]*s]伸缩化变址寻址0xfc(,%eax,4)= *(0xfc+eax*4)(Ea,Eb,s)M(R[Ea]+R[Eb]*s)伸缩化变址寻址(%eax,%ebx,4) = *(eax+ebx*4)Imm(Ea,Eb,s)M(Imm+R[Ea]+R[Eb]*s)伸缩化变址寻址8(%eax,%ebx,4) = *(8+eax+ebx*4)注:M[xx]表⽰在存储器中xx地址的值,R[xx]表⽰寄存器xx的值,这种表⽰⽅法将寄存器、内存都看出⼀个⼤数组的形式。
数据传送指令:指令效果描述movl S,D D <-- S传双字movw S,D D <-- S传字movb S,D D <-- S传字节movsbl S,D D <-- 符号扩展S符号位填充(字节->双字)movzbl S,D D <-- 零扩展S零填充(字节->双字)pushl S R[%esp] <-- R[%esp] – 4;压栈M[R[%esp]] <-- Spopl D D <-- M[R[%esp]];出栈R[%esp] <-- R[%esp] + 4;注:均假设栈往低地址扩展。
常用的汇编指令都有哪些?

常用的汇编指令都有哪些?常用的汇编指令都有哪些?时间: 2012-11-06 23:26:04.0分类:嵌入开发/ 嵌入开发(WinCE)/ 面试题库MOV(MOVe)传送指令PUSH 入栈指令POP 出栈指令XCHG(eXCHanG)交换指令XLAT(TRANSLATE)换码指令LEA (Load Effective Address)有效地址送寄存器指令LDS(Load DS with pointer)指针送寄存器和DS指令LES(Load ES with pointer)指针送寄存器和ES指令LAHF(Load AH with Flags)标志位送AH指令SAHF(Store AH into Flgs) AH送标志寄存器指令PUSHF(PUSH the Flags)标志进栈指令POPF(POP the Flags)标志出栈指令ADD 加法指令ADC 带进位加法指令INC 加1指令SUB(SUBtract)不带借位的减法指令SBB(SuVtrach with borrow)带借位的减法指令DEC(DECrement)减1指领NEG(NEGate)求补指令CMP(CoMPare)比较指令MUL(unsinged MULtiple)无符号数乘法指令IMUL(sIgned MUL tiple)有符号数乘法指令DIV(unsigned DIVide)无符号数除法指令IDIV(sIgned DIVide)有符号数除法指令CBW(Count Byte to Word)字节转换为字指令CWD(Count Word to Doble word)字转换为双字指令DAA 压缩的BCD码加法十进制调整指令DAS 压缩的BCD码减法十进制调整指令AAA 非压缩的BCD码加法十进制调整指令AAS 非压缩的BCD码加法十进制调整指令AND 逻辑与指令OR 逻辑或指令XOR 逻辑异或指令NOT 逻辑非指令TEST 测试指令SHL(SHift logical Letf)逻辑左移指令SHR(SHift logical Right)逻辑右移指令ROL(Rotate Left )循环左移指令P58ROR(Rotate Right)循环右移指令P58RCL(Rotate Left through Carry)带进位循环左移RCR(Rotate Right through Carry)带进位循环左移MOVS(MOVe String)串传送指令STOS(STOre into String)存入串指令LODS(LOad from string)从串取指令REP(REPeat)重复操作前CLD(CLear Direction flag)清除方向标志指令STD(SeT Direction flag)设置方向标志指令CMPS(CoMPare String)串比较指令SCAS(SCAn String)串扫描指令REPE/REPZ(REPeat while Equal/Zero)相等/为零时重复操作前缀REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不为零进重复前缀IN(INput)输入指令OUT(OUTput)输出指令JMP(JuMP)无条件转移指令JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ 条件转移指令LOOP 循环指令P70LOOPZ/LOOPE 为零/相等时循环指令LOOPNZ/LOOPNE 不为零/不相等时循环指令CALL 子程序调用指令RET(RETun)子程序返回指令CLC(CLear Carry)进位位置0指令CMC(CoMplement Carry)进位位求反指令SRC(SeT Carry)进位位置1指令NOP(No OPeretion)无操作指令HLT(HaLT)停机指令OFFSET 返回偏移地址SEG 返回段地址EQU(=) 等值语句PURGE 解除语句DUP 操作数字段用复制操作符SEGMENT,ENDS 段定义指令ASSUME 段地址分配指令ORG 起始偏移地址设置指令$ 地址计数器的当前值PROC,ENDP 过程定义语句NAME,TITLE,END 程序开始结束语句MACRO,ENDM 宏定义指令JZ OPR //结果为零转移JNZ OPR //结果不为零转移JS OPR //结果为负转移JNS OPR //结果为正转移JO OPR //溢出转移JNO OPR //不溢出转移JP OPR //结果为偶转移JNP OPR //结果为奇转移JC OPR //有进位转移JNC OPR //无进位转移汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)============================x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:1. 通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)这些32位可以被用作多种用途,但每一个都有”专长”. EAX 是”累加器”(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是”基地址”(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX 是…(忘了..哈哈)但它总是被用来放整数除法产生的余数. 这4个寄存器的低16位可以被单独访问,分别用AX,BX,CX和DX. AX又可以单独访问低8位(AL)和高8位(AH), BX,CX,DX也类似. 函数的返回值经常被放在EAX中.ESI/EDI分别叫做”源/目标索引寄存器”(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.EBP是”基址指针”(BASE POINTER), 它最经常被用作高级语言函数调用的”框架指针”(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:push ebp ;保存当前ebpmov ebp,esp ;EBP设为当前堆栈指针sub esp, xxx ;预留xxx字节给函数临时变量.…这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作mov esp,ebp/pop ebp/ret 即可.ESP 专门用作堆栈指针.2. 段寄存器:CS(Code Segment,代码段) 指定当前执行的代码段. EIP (Instruction pointer, 指令指针)则指向该段中一个具体的指令. CS:EIP 指向哪个指令, CPU 就执行它. 一般只能用jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值.DS(DATA SEGMENT, 数据段) 指定一个数据段. 注意:在当前的计算机系统中, 代码和数据没有本质差别, 都是一串二进制数, 区别只在于你如何用它. 例如, CS 制定的段总是被用作代码, 一般不能通过CS指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段描述符”别名”而通过DS来访问/修改. 自修改代码的程序常如此做.ES,FS,GS 是辅助的段寄存器, 指定附加的数据段.SS(STACK SEGMENT)指定当前堆栈段. ESP 则指出该段中当前的堆栈顶. 所有push/pop 系列指令都只对SS:ESP指出的地址进行操作.3. 标志寄存器(EFLAGS):该寄存器有32位,组合了各个系统标志. EFLAGS一般不作为整体访问, 而只对单一的标志位感兴趣. 常用的标志有:进位标志C(CARRY), 在加法产生进位或减法有借位时置1, 否则为0.零标志Z(ZERO), 若运算结果为0则置1, 否则为0符号位S(SIGN), 若运算结果的最高位置1, 则该位也置1.溢出标志O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置1.JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多JXX 指令是等价的, 对应相同的机器码. 例如, JE 和JZ 是一样的,都是当Z=1是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作. JXX 后面的”XX” 有如下字母:无符号操作: 带符号操作:A = “ABOVE”, 表示”高于” G = “GREATER”, 表示”大于”B = “BELOW”, 表示”低于” L = “LESS”, 表示”小于”C = “CARRY”, 表示”进位”或”借位” O = “OVERFLOW”, 表示”溢出”S = “SIGN”, 表示”负”通用符号:E = “EQUAL”表示”等于”, 等价于Z (ZERO)N = “NOT” 表示”非”, 即标志没有置位. 如JNZ “如果Z没有置位则跳转”Z = “ZERO”, 与E同.如果仔细想一想,就会发现 JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, ….4. 端口端口是直接和外部设备通讯的地方。
CPU常用操作指令

CPU常用操作指令汇编语言是一种低级别的计算机程序语言,用于直接控制和操作计算机的中央处理器(CPU)。
在编写汇编语言程序时,需要使用一系列的操作指令来完成各种任务。
下面是一些常用的CPU操作指令及其功能的汇编语言示例。
1.MOV:将数据从一个位置传输到另一个位置。
示例:MOVAX,BX;将BX寄存器的内容传送到AX寄存器2.ADD/SUB:进行加法或减法操作。
示例:ADDAX,BX;将BX寄存器的内容加到AX寄存器SUBAX,BX;从AX寄存器中减去BX寄存器的内容3.INC/DEC:将操作数的值增加或减少1示例:INCAX;将AX寄存器的值增加1DECBX;将BX寄存器的值减少14.CMP:比较两个操作数的值,设置标志寄存器的状态以供条件跳转指令使用。
示例:CMPAX,BX;比较AX和BX寄存器的值5.JMP:无条件跳转到指定地址。
6.JE/JNE:根据标志寄存器的状态,执行条件跳转。
7.AND/OR/XOR:进行逻辑与、逻辑或或逻辑异或操作。
示例:ANDAX,BX;将AX和BX寄存器的值进行逻辑与操作ORAX,BX;将AX和BX寄存器的值进行逻辑或操作XORAX,BX;将AX和BX寄存器的值进行逻辑异或操作8.PUSH/POP:将数据压入栈或从栈中弹出数据。
示例:PUSHAX;将AX寄存器的值压入栈中POPBX;从栈中弹出数据,并将其存入BX寄存器9.CALL/RET:调用子程序或从子程序返回。
示例:CALL subroutine ; 调用名为"subroutine"的子程序RET;从子程序返回到调用位置10.INT:触发中断。
示例:INTn;触发编号为n的中断这些是一些常用的CPU操作指令的示例,每个指令都有具体的功能和用法。
在汇编语言编程中,根据具体的需求选择合适的指令来完成要求的任务。
因为汇编语言直接与硬件进行交互,所以熟悉这些操作指令对于理解和优化程序性能非常重要。
汇编指令1

汇编语言指令集一、数据传输指令1. 通用数据传送指令.MOV(MOVe) 传送字或字节.MOVS(MOVe String) 串传送指令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 (eXCHanG)交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD先交换再累加.( 结果在第一个操作数里)XLAT(TRANSLATE) 字节查表转换.── 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 (Load Effective Address)装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS (Load DS with pointer)传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES (Load ES with pointer)传送目标指针,把指针内容装入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 (Load AH with Flags)标志寄存器传送,把标志装入AH.SAHF (Store AH into Flgs)标志寄存器传送,把AH内容装入标志寄存器.PUSHF (PUSH the Flags)标志入栈.POPF (POP the Flags)标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.非压缩的BCD码加法十进制调整指令DAA 加法的十进制调整.压缩的BCD码加法十进制调整指令SUB (SUBtract)减法.SBB (SuVtrach with borrow)带借位减法.DEC (DECrement)减1.NEC (NEGate)求反(以0 减之).CMP (CoMPare)比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.非压缩的BCD码加法十进制调整指令DAS 减法的十进制调整.压缩的BCD码减法十进制调整指令MUL (unsinged MULtiple)无符号乘法.IMUL (sIgned MUL tiple)整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV (unsigned DIVide)无符号除法.IDIV (sIgned DIVide)整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW (Count Byte to Word)字节转换为字. (把AL中字节的符号扩展到AH中去)CWD (Count Word to Doble word)字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.or 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL (SHift logical Letf)逻辑左移.SAL 算术左移.(=SHL)SHR (SHift logical Right)逻辑右移.SAR 算术右移.(=SHR)ROL (Rotate Left )循环左移.ROR (Rotate Right)循环右移.RCL (Rotate Left through Carry)通过进位的循环左移.RCR (Rotate Right through Carry)通过进位的循环右移.以上八种移位指令,其移位次数可达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 (CoMPare String)串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS (SCAn String)串扫描指令.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS (STOre into String)保存串.是LODS的逆过程.REP (REPeat)当CX/ECX<>0时重复.REPE/REPZ (REPeat while Equal/Zero)当ZF=1或比较结果相等,且CX/ECX<>0时重复. REPNE/REPNZ (REPeat while Not Equal/Zero)当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 (SeT Direction flag)置方向标志位.CLD (CLear Direction flag)清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令───────────────────────────────────────DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.8088 汇编跳转cmp a,b 比较a与bmov a,b 把b的值送给aret 返回主程序nop 无作用,英文“no operation”的简写,意思是“do nothing” call 调用子程序je 或jz 若相等则跳jne或jnz 若不相等则跳jmp 无条件跳jb 若小于则跳ja 若大于则跳jg 若大于则跳jge 若大于等于则跳jl 若小于则跳jle 若小于等于则跳pop 出栈push 压栈MOV功能: 把源操作数送给目的操作数语法: MOV 目的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,dataXCHG功能: 交换两个操作数的数据语法: XCHG格式: XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPALEA,LDS,LES功能: 取地址至寄存器语法: LEA r,m LDS r,m LES r,mXLAT(XLATB)功能: 查表指令语法: XLAT XLAT m算数运算指令ADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,Z,S,OSUB,SBB功能:减法指令语法: SUB OP1,OP2 SBB OP1,OP2格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data影响标志: C,P,A,Z,S,OINC,DEC功能: 把OP的值加一或减一语法: INC OP DEC OP格式: INC r/m DEC r/m影响标志: P,A,Z,S,ONEG功能: 将OP的符号反相(取二进制补码)语法: NEG OP格式: NEG r/m影响标志: C,P,A,Z,S,OMUL,IMUL功能: 乘法指令语法: MUL OP IMUL OP格式: MUL r/m IMUL r/m影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)DIV,IDIV功能:除法指令语法: DIV OP IDIV OP格式: DIV r/m IDIV r/mCBW,CWD功能: 有符号数扩展指令语法: CBW CWDAAA,AAS,AAM,AAD功能: 非压BCD码运算调整指令语法: AAA AAS AAM AAD影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)DAA,DAS功能: 压缩BCD码调整指令语法: DAA DAS影响标志: C,P,A,Z,S位运算指令集AND,OR,XOR,NOT,TEST功能: 执行BIT与BIT之间的逻辑运算语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL功能: 移位指令语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL 影响标志: C,P,Z,S,OROR,ROL,RCR,RCL功能: 循环移位指令语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL 影响标志: C,P,Z,S,O程序流程控制指令集CLC,STC,CMC功能: 设定进位标志语法: CLC STC CMC标志位: CCLD,STD功能: 设定方向标志语法: CLD STD标志位: DCLI,STI功能: 设定中断标志语法: CLI STI标志位: ICMP功能: 比较OP1与OP2的值语法: CMP r/m,r/m/data标志位: C,P,A,Z,OJMP功能: 跳往指定地址执行语法: JMP 地址JXX功能: 当特定条件成立则跳往指定地址执行语法: JXX 地址注:A: ABOVE,当C=0,Z=0时成立B: BELOW,当C=1时成立C: CARRY,当弁时成立CXZ: CX寄存器的值为0(ZERO)时成立E: EQUAL,当Z=1时成立G: GREATER(大于),当Z=0且S=0时成立L: LESS(小于),当S不为零时成立N: NOT(相反条件),需和其它符号配合使用O: OVERFLOW,O=1时成立P: PARITY,P=1时成立PE: PARITY EVEN,P=1时成立PO: PARITY ODD,P=0时成立S: SIGN,S=1时成立Z: ZERO,Z=1时成立LOOP功能: 循环指令集语法: LOOP 地址LOOPE(Z)地址LOOPNE(Z) 地址标志位: 无CALL,RET功能: 子程序调用,返回指令语法: CALL 地址RET RET n标志位: 无INT,IRET功能: 中断调用及返回指令语法: INT n IRET标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器字符串操作指令集MOVSB,MOVSW,MOVSD功能: 字符串传送指令语法: MOVSB MOVSW MOVSD标志位: 无CMPSB,CMPSW,CMPSD功能: 字符串比较指令语法: CMPSB CMPSW CMPSD标志位: C,P,Z,S,OSCASB,SCASW功能: 字符串搜索指令语法: SCASB SCASW标志位: C,P,Z,S,OLODSB,LODSW,STOSB,STOSW功能: 字符串载入或存贮指令语法: LODSB LODSW STOSB STOSW标志位: 无REP,REPE,REPNE功能: 重复前缀指令集语法: REP 指令S REPE 指令S REPNE 指令S标志位: 依指令S而定。
总汇编语言指令速查表

实用文档文案大全附录附录A 常用80x86指令速查表指令按助记符字母顺序排列,缩写、符号约定如下:(1) 指令中,dst, src表示目的操作数和源操作数。
仅一个操作数时,个别处也表示为opr。
(2) imm表示立即数,8/16/32位立即数记作:imm8/imm16/imm32。
(3)reg表示通用寄存器,8/16/32位通用寄存器记作:reg8/reg16/reg32。
(4)mem表示内存操作数,8/16/32等内存操作数记作:mem8/mem16/mem32等。
(5)seg表示段寄存器,CS, DS, SS, ES, FS, GS。
(6)acc表示累加器,8/16/32累加器对应AL/AX/EAX。
(7)OF, SF, ZF, AF, PF, CF分别表示为O, S, Z, A, P, C,相应位置为:字母,根据结果状态设置;?,状态不确定;-,状态不变;1,置1;0,清0;例如:0 S Z ? P -表示:OF清0,AF不确定,CF不变,其它根据结果设置。
若该栏空白,则表示无关。
(8)寄存器符号诸如(E)CX, (E)SI, (E)DI, (E)SP, (E)BP和(E)IP等,表示在16地址模式下使用16位寄存器(如CX),或在32地址模式下使用32位寄存器(如ECX)。
(9)周期数表示指令执行所需的CPU时钟周期个数,即执行时间为:周期数/主频(秒)。
(10)诸如(386+)是表示该指令只能用于80386及以后微处理器上。
·252·附录·253··254·附录·255··256·附录·257··258·附录·259··260··261··262··263··264··265··266·附录B 编程练习环境说明1. 编程练习软件包附带软件包x86ASM是在Microsoft的MASM 6.15软件包的基础上,加入CodeView、Win32的开发工具及Turbo C 2.0等,进行简单整理而成的,以便初学者编程练习使用。
rcrq 汇编指令 -回复

rcrq 汇编指令-回复汇编指令是计算机科学领域中的一种指令集体系,它用于在计算机中控制和执行各种操作。
在本文中,我们将以中括号内的内容作为主题,来详细探讨汇编指令及其在计算机系统中的应用。
[汇编指令]是一种低级语言,它直接操作计算机的硬件。
与高级语言相比,汇编指令更加底层、直接,能够更好地控制计算机的执行过程。
在计算机系统中,每个处理器都有自己的汇编指令集,其中包含一些常用的操作。
首先,让我们了解一下汇编指令的基本结构。
汇编指令由两部分组成,即操作码和操作数。
操作码表示要执行的操作类型,而操作数则指定了这些操作的具体操作数。
操作数可以是寄存器、内存地址或立即数。
汇编指令的操作码包括一些基本操作,比如加法、减法、乘法和除法等。
此外,它还支持一些条件操作,如条件跳转和条件判断。
这些条件操作通常与比较指令一起使用,以根据某些条件来执行不同的操作。
下面,我们将详细介绍一些常用的汇编指令及其在计算机系统中的应用。
1. MOV指令:MOV指令用于将数据从一个位置移动到另一个位置。
它的基本语法为:MOV 目标,源。
其中,目标可以是寄存器或内存地址,源可以是寄存器、内存地址或立即数。
MOV指令在编程中广泛应用于数据传输和变量赋值等。
2. ADD和SUB指令:ADD指令用于将操作数相加,而SUB指令用于将操作数相减。
这两个指令在计算过程中非常重要,可以进行基本的算术运算。
它们的基本语法为:ADD 目标,源和SUB 目标,源。
3. JMP和JNZ指令:JMP指令用于无条件跳转到一个指定的内存地址,而JNZ指令用于在指定条件下进行跳转。
JNZ指令通常与CMP指令一起使用,用于比较两个操作数。
如果比较结果不为零,则执行跳转操作。
这些指令在循环和条件语句的控制中经常使用。
4. PUSH和POP指令:PUSH指令用于将数据推入堆栈,而POP指令用于从堆栈中弹出数据。
堆栈是一种后进先出(LIFO)的数据结构,它在函数调用和中断处理等情况下非常有用。
反汇编语言常用指令

内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
.4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编指令 - cltq
简介
在汇编语言中,cltq指令是一种用于符号扩展的指令。
它的作用是将紧跟在EAX
寄存器中的32位有符号整数值的符号位拓展到EDX寄存器中,实现从32位有符号整数扩展为64位有符号整数的转换。
在本文中,我们将深入探讨cltq指令的使用方法、特性和示例,帮助读者更好地
理解和应用这个汇编指令。
指令格式
cltq指令没有任何操作数,只需在代码中写入cltq即可。
以下是指令的汇编语法
格式:
cltq
指令操作
cltq指令的操作是将EAX寄存器中的32位有符号整数值扩展为64位有符号整数,并保存在EDX:EAX寄存器对中。
•如果EAX寄存器的最高位(符号位)为0,则在EDX寄存器中填充32个0。
•如果EAX寄存器的最高位(符号位)为1,则在EDX寄存器中填充32个1。
使用示例
让我们看一些使用cltq指令的示例。
假设我们有以下的汇编代码:
mov eax, 0x000000FF ; 将0x000000FF(十进制255)加载到EAX寄存器
cltq ; 执行cltq指令
在这个例子中,我们将EAX寄存器加载了一个32位的无符号整数值0x000000FF。
接下来,我们执行了cltq指令,将其扩展为64位有符号整数。
根据cltq的操作,因为EAX寄存器的最高位为0,EDX寄存器将被填充32个0。
所以,将会得到以下结果:
•EAX寄存器的值不变,为0x000000FF(十进制255)。
•EDX寄存器的值被扩展为0x00000000(十进制0)。
在这个示例中,我们将32位无符号整数转换为64位有符号整数,并通过EDX和EAX寄存器对来表示结果。
注意事项
以下是一些使用cltq指令时需要注意的事项:
1.cltq指令只能用于32位有符号整数到64位有符号整数的扩展,不能用于
其他类型的数据转换。
2.cltq指令会修改EDX寄存器的值,但不会修改EAX寄存器的值。
3.在执行cltq指令之前,确保EAX寄存器中的值是正确的32位有符号整数。
如果在执行cltq之前没有任何赋值操作,EAX寄存器的默认值是不确定的。
4.当使用cltq时,要记得EDX寄存器的值是由EAX寄存器的符号位决定的。
如果不确定EAX寄存器的符号位,结果可能是不正确的。
总结
在本文中,我们详细介绍了汇编语言中的cltq指令。
我们了解到cltq指令可用于将32位有符号整数值扩展为64位有符号整数值的转换。
我们了解了指令的格式、作用和操作结果,并通过示例展示了其使用方法。
使用cltq指令时,需要注意数据类型的匹配、寄存器的值以及指令执行的先后顺序。
在理解和应用cltq指令时,这些注意事项将有助于我们编写正确而高效的汇
编代码。
希望本文对您理解和学习cltq指令有所帮助!。