ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

史上最详细汇编指令总结精讲

2026/8/15 10:22:45 拓冰建站 浏览量
史上最详细汇编指令总结精讲 一. 汇编指令1.1 数据传输指令1.1.1mov指令**作用**把一个字或者一个字节的操作数从源地址传送到目标地址格式mov target, source注意事项target不能是CS代码段寄存器target和source不能同时为内存数、段寄存器CS\DS\ES\SS\FS\GS不能将立即数传送给段寄存器target和source必须类型匹配比如要么都是字节要么都是字或者都是双字等。由于立即数没有明确的类型所以将立即数传送到target时系统会自动将立即数零扩展到与target数的位数相同再进行传送。有时需要用BYTE PTR、WORD PTR明确指出立即数的位数1.1.2xchg指令**作用**把一个字或者一个字节的源操作数和目的操作数相交换格式xchg target, source注意事项不能同时都为内存操作任意一个寄存器都不能为段寄存器任意一个操作不能使用立即数两个操作数的长度必须相等1.1.3xlat换码指令**作用**将 bx 指定的缓冲区、AL 指定的位移处的一个字节数据取出赋值给 AL格式xlatXLAT 指令 功能 AL DS:[BX AL] 说明 - BX 指向一个字节表缓冲区的首地址 - AL 原来的值作为表内的偏移量 - 从 DS 段中 BXAL 地址处取出一个字节 - 将取出的数据重新存入 AL1.1.4push pop堆栈指令**作用**将 bx 指定的缓冲区、AL 指定的位移处的一个字节数据取出赋值给 AL格式PUSH ax ; 将ax寄存器中的数据压入到栈中 POP ax ; 将栈顶中的数据出栈到ax中注意事项当栈为空时能不进行出栈指令的操作数必须是16位即不能使用al这种8位寄存器1.1.5 地址传送指令lea lds les**作用**将对应的地址表示送入对应的寄存器中格式LEA reg, mem ; reg --- Register—寄存器 LDS reg, mem ; mem --- Memory—内存 LES reg, mem注意事项LDS将 mem 指定的字送入指定的寄存器中并且 DS mem2LES将 mem 指定的字送入指定的寄存器中并且 ES mem21.1.6 标志寄存器传送指令lahf sahf pushf popf**作用**标志寄存器传送指令用来传送标志寄存器 FLAGS 的内容方便对各个标志位的直接操作格式; 低8位传送 LAHF ; 将标志寄存器的低字节传送给寄存器AH ; SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位而AH的第5/3/1位任意 SAHF ; SAHF将AH寄存器内容送FLAGS的低字节 ; 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/PF/CF标志 ; 16位传送 PUSHF ; PUSHF指令将标志寄存器的内容压入堆栈同时栈顶指针SP减2 POPF ; POPF指令将栈顶单元内容送标志寄存器同时栈顶指针SP加2标志寄存器用来存储相关指令的某些执行结果用来为 CPU 执行相关指令提供依据并可以以此来控制 CPU 的相关行为。8086 中的标志寄存器为 PSW程序状态字。该寄存器并不是用来存放普通数据的而是按位起作用每一位都有专门的含义。位1514131211109876543210标志位----OFDFIFTFSFZF-AF-PF-CF标志位名称作用说明SF符号标志位如果执行结果为负数则SF1如果结果非负则SF0。ZF零标志位如果执行结果为0则ZF1否则ZF0。PF奇偶标志位如果执行结果中二进制位1 的个数为偶数则PF1否则PF0。CF进/借位标志位运算过程中最高位产生进位或借位则CF1否则CF0。常用于表示无符号数溢出。OF溢出标志位当运算结果超出机器所能表示的范围时产生溢出OF1。常用于表示有符号数溢出。DF方向标志位控制串处理指令中DI、SI的增减方向。DF0寄存器递增DF1寄存器递减。通过CLD指令清零通过STD指令置1。TF调试标志位当TF1时CPU进入单步执行模式每执行一条指令产生一次调试中断。IF中断允许标志位控制CPU是否响应外部中断请求。IF1允许外部中断IF0屏蔽外部中断。AF辅助进位标志位运算过程中观察低4位第三位向第四位进位。如果最后四位向前产生进位或借位则AF1否则AF0。标志位为1是为0否OFOVNVDFDNUPIFEIDISFNGPLZFZRNZAFACNAPFPE偶PO奇CFCYNC1.1.7 输入输出指令in outIN指令作用从外部设备端口读取数据到AL/AX。格式格式说明IN AL,PORT读取8位数据IN AX,PORT读取16位数据IN AL,DXDX保存端口号示例IN AL,60HOUT指令作用将AL/AX中的数据输出到外部设备。格式格式说明OUT PORT,AL输出8位数据OUT PORT,AX输出16位数据OUT DX,ALDX保存端口号示例MOV AL,20H OUT 80H,AL1.2 算数运算指令1.2.1 加法指令add adc incadd ax, bx ; ax bx adc ax, bx ; ax bx CF标志位 inc ax ; ax 1注意事项INC指令不影响进位CF标志位按定义设置其他状态位标志1.2.2 减法指令sub sbb decsub ax, bx ; ax - bx sbb ax, bx ; ax - bx - CF标志位 dec ax ; ax - 1注意事项DEC指令不影响位CF标志位按定义设置其他状态位标志1.2.3 比较指令cmpcmp ax, bx ; ax - bx注意事项CMP指令只做运算设置状态位标志不进行赋值1.2.4 乘法指令mul imulmul bl ; ax al × bl MUL无符号乘法字/字节 imul bx ; dx:ax ax × bx IMUL有符号乘法字/字节注意事项被乘数被隐藏在al/ax中结果溢出的数据被保存在ah/dx中不支持立即数如mul 5是错误的乘数必须是寄存器或内存单元。1.2.5 除法指令div idivdiv b1 ; al ax ÷ b1 ah放余数 DIV 无符号除法字/字节 idiv bx ; ax dx:ax ÷ bx dx放余数 IDIV 有符号除法字/字节注意事项被除数被隐藏在 AX / DX:AX 中8位除法被除数在AX中AL放商AH放余数16位除法被除数在DX:AX中AX放商DX放余数若使用16位除法必须提前将 DX 清零DIV或符号扩展IDIV除数放在 8/16 位 reg 或内存单元中不支持立即数如div 5是错误的除数为 0 或商溢出会触发CPU 除法溢出中断0号中断程序崩溃1.2.6 求反指令negneg ax ; ax 0 - ax1.2.7 符号扩展指令cbw cwd指令作用操作数CBW字节 → 字8位 → 16位隐含AL→AXCWD字 → 双字16位 → 32位隐含AX→DX:AX1.2.8 十进制调整指令指令作用操作数DAA加法后的压缩BCD码调整隐含ALDAS减法后的压缩BCD码调整隐含ALAAA加法后的非压缩BCD码调整隐含ALAAS减法后的非压缩BCD码调整隐含ALAAM乘法后的非压缩BCD码调整隐含AXAAD除法前的非压缩BCD码调整隐含AX压缩BCD码Packed BCD一个字节存两位十进制数例如0x12 12十进制有效范围00H ~ 99H非压缩BCD码Unpacked BCD一个字节存一位十进制数高4位为0例如0x02 20x09 9有效范围00H ~ 09H1.3 位运算指令1.3.1 逻辑运算指令指令格式功能说明特殊要求ANDAND target, source按位与1 1 1其余为0结果保存到target操作数要求同MOVOROR target, source按位或11 11XORXOR target, source按位异或相同为0不同为1结果保存到target同上NOTNOT target按位非1 → 00 → 1结果保存到target操作数不能是立即数TESTTEST target, source按位与操作只设置标志位不保存结果同上注意事项通常使用AND指令对指定位清0通常使用OR指令对指定位置1通常使用NOT指令将某个数据取反码再加1就得到补码通常使用XOR指令来取反某位通常使用TEST指令来测试指定位置是0还是1非运算对标志位不影响其余指令对标志均会产生影响1.3.2 移位运算非循环移位运算指令格式类型移动方向补位方式标志位影响SHL逻辑左移SHL reg/mem, 1/CL无符号数左移低位补0最高位移入 CF移位后若 CF ≠ 最高位则 OF1否则 OF0SAL算术左移SAL reg/mem, 1/CL有符号数左移低位补0最高位移入 CF与 SHL 相同操作完全相同SHR逻辑右移SHR reg/mem, 1/CL无符号数右移高位补0最低位移入 CF—SAR算术右移SAR reg/mem, 1/CL有符号数右移高位补符号位原最高位最低位移入 CF—循环移位指令格式名称功能说明ROLROL reg/mem, 1/CL循环左移不带进位最高位移入 CF同时循环移回最低位RORROR reg/mem, 1/CL循环右移不带进位最低位移入 CF同时循环移回最高位RCLRCL reg/mem, 1/CL带进位循环左移最高位移入 CFCF 原值移入最低位RCRRCR reg/mem, 1/CL带进位循环右移最低位移入 CFCF 原值移入最高位1.4 串操作指令串的概念串是连续存放在内存中的字节块或字块。每个串有一个起始地址和长度待操作的数据库称为源串目的地址称为目标串。串指令操作的特点源操作数用寄存器SI寻址默认在数据段DS中但允许段超越DS:[SI]目的操作数用寄存器DI寻址默认在附加段ES中不允许段超越ES:[DI]每执行一次串操作指令SI和DI将自动修改±1对于字节串或±2对于字串执行指令CLD指令后DF 0地址指针增1或2执行指令STD指令后DF 1地址指针减1或2数据块长度值由CX指定1.4.1 串传送指令movs作用把字节/字操作数从主存的源地址传送至目的地址使用格式指令包括 MOVSB、MOVSWMOVSB; 字节串传送ES:[DI] ← DS:[SI] ; DF0SI←SI1DI←DI1DF1则递减MOVSW; 字串传送ES:[DI] ← DS:[SI] ; DF0SI←SI2DI←DI2DF1则递减在使用串操作指令前需要提前将DS、ES、SI、DI、CX、DF设置好。1.4.2 串存储指令stos作用把AL或AX的数据传送至目的地址使用格式指令包括 STOSB、STOSWSTOSB; 字节串存储ES:[DI] ← AL ; DI ← DI ± 1STOSW; 字串存储ES:[DI] ← AX ; DI ← DI ± 21.4.3 串读取指令lods作用将字节/字从数据段中读取出来保存在AL或者AX中使用格式指令包括 LODSB、LODSWLODSB; 字节串读取AL ← DS:[SI] ; SI ← SI ± 1LODSW; 字串读取AX ← DS:[SI] ; SI ← SI ± 21.4.4 串比较指令cmps作用将主存中的源操作数减去目的操作数以便设置标志进而比较两操作数之间的关系使用格式指令包括 CMPSB、CMPSWCMPSB; 字节串比较DS:[SI] - ES:[DI] ; SI ← SI ± 1DI ← DI ± 1CMPSW; 字串比较DS:[SI] - ES:[DI ; SI ← SI ± 2DI ← DI ± 21.4.5 串扫描指令scas使用格式指令包括 SCASB、SCASWSCASB; 字节扫描AL - ES:[DI] ; DI ← DI ± 1SCASW; 字扫描AX - ES:[DI] ; DI ← DI ± 21.4.6 重复前缀指令rep重复前缀 REP 可以加到串传送操作指令时。REP 前缀是每次执行串指令后 CX-1。CX-1 后重复执行串指令直到 CX 值为 0 时指令才终止。使用示例REP、REPZ、REPNZ、REPE、REPNErep movsx; 无条件重复直到 CX 0repz cmpsx; 无条件重复直到 CX 0 或 ZF 0repnz cmpsx; 无条件重复直到 CX 0 或 ZF 1repe cmpsx; 不断比较直到 CX 0 或 ZF 0repne cmpsx; 不断比较直到 CX 0 或 ZF 11.5 控制转移指令1.5.1 无条件转移指令jmp作用跳转到对应的指令地址使用格式jmp label; IP ← IP 位移量jmp reg/mem; IP ← reg/memreg以及mem都需要是16位jmp far ptr label; CS label的段地址IP label的偏移地址jmp far ptr mem; CS [mem2]IP [mem]当指令只需要在当前代码段范围内转移时±32KB不需要更改CS地址只需要修改IP地址。实际编程时汇编程序会根据目标地址的距离自动处理成短转移/近转移/远转移。程序员可用操作符short/near ptr/far ptr强制指定。1.5.2 条件转移指令jcc作用根据运算结果跳转到对应的指令地址。CC 即指令条件码。JCC指令含义检查符号位典型C应用JZ / JE若为0则跳转若相等则跳转ZF1if (i j); if (i 0);JNZ / JNE若不为0则跳转若不相等则跳转ZF0if (i ! j); if (i ! 0);JS若为负则跳转SF1if (i 0);JNS若为正则跳转SF0if (i 0);JP / JPE若1出现次数为偶数则跳转PF1(null)JNP / JPO若1出现次数为奇数则跳转PF0(null)JO若溢出则跳转OF1(null)JNO若无溢出则跳转OF0(null)JC / JB / JNAE若进位则跳转若低于则跳转若不高于等于则跳转CF1if (i j);JNC / JNB / JAE若无进位则跳转若不低于则跳转若高于等于则跳转CF0if (i j);JBE / JNA若低于等于则跳转若不高于则跳转ZF1 或 CF1if (i j);JNBE / JA若不低于等于则跳转若高于则跳转ZF0 且 CF0if (i j);JL / JNGE若小于则跳转若不大于等于则跳转SF ! OFif (si sj);JNL / JGE若不小于则跳转若大于等于则跳转SF OFif (si sj);JLE / JNG若小于等于则跳转若不大于则跳转ZF ! OF 或 ZF1if (si sj);JNLE / JG若不小于等于则跳转若大于则跳转SF 0 且 ZF 0if (si sj);TablesAreZ/E相等N非S符号P奇偶O溢出C进位L小于有符号数G大于有符号数A高于无符号数B低于无符号数1.5.3 计数器CX为0跳转指令jcxzCX寄存器通常在程序中用作计数器JCXZ指令用来判断计数是否为0。使用格式jcxz label; 若 CX 0发生转移IP ← IP 8位位移量 ; 若 CX ≠ 0顺序执行1.5.4 循环指令loop、loopz、loopnz、loopneLOOP label; CX ← CX − 1若 CX ≠ 0则循环到标号 labelLOOPZ label; CX ← CX − 1若 CX ≠ 0 且 ZF 1则循环到标号 labelLOOPNZ label; CX ← CX − 1若 CX ≠ 0 且 ZF 0则循环到标号 label注LOOPNE为LOOPNZ的等效写法功能相同1.5.5 子程序跳转指令call子程序子程序是完成特定功能的一段程序当主程序调用程序需要执行这个功能时采用 CALL 调用指令转移到该子程序的起始处执行当运行完子程序功能后采用 RET 返回指令回到主程序继续执行。使用格式CALL labelCALL reg/mem; SP ← SP − 2SS:[SP] ← IP然后 jmp label/reg/memCALL far ptr labelCALL far ptr mem; SP ← SP − 2SS:[SP] ← IP ; SP ← SP − 2SS:[SP] ← CSCALL 指令其实是做了两件事执行到 CALL 时先将 CALL 指令的下一条指令的 IP 入栈再 JMP 到指定的函数地址处。1.5.6 子程序返回指令ret使用格式RET或RETN ; 无参数段内返回RET或RETN i16 ; 有参数段内返回RETF; 无参数段间返回RETFi16 ; 有参数段间返回段内返回时出栈IP ← SS:[SP]SP ← SP 2段间返回时出栈IP ← SS:[SP]SP ← SP 2CS ← SS:[SP]SP ← SP 2带参数时最后SP ← SP i16注意CALL FAR PTR需要与RETF配合使用。1.5.7 中断指令int作用改变程序的执行顺序使用格式INT i8; i8 为 8 位的中断向量编号8086 的中断8086 可以管理 256 个中断各种中断用一个向量编号来区别上述的 i8 即代表一个中断标号。常见中断类型除法错中断执行除法指令结果溢出产生的 0 号中断指令中断执行中断调用指令INT i8产生的 i8 号中断断点中断用于断点调试INT 3的 3 号中断溢出中断执行溢出中断指令OF1 产生的 4 号中断单步中断TF1 时在每条指令执行后产生的 1 号中断1.6 处理机控制指令指令包括标志处理指令CLC、STC、CMC、CLD、STD、CLI、STI处理机控制指令HLT、NOP、WAIT、ESC、LOCK重点掌握CLC、STC、CMC、CLD、STD、CLI、STI、NOP使用格式CLC; 复位进位标志位CF ← 0STC; 置位进位标志位CF ← 1CMC; 求反进位标志位CF ← ~CFCLD; 复位方向标志位DF ← 0串操作指令中使用STD; 置位方向标志位DF ← 1CLI; 复位中断标志位IF ← 0用于控制可屏蔽中断的允许和禁止STI; 置位中断标志位IF ← 1NOP; 空操作占用一个字节存储单元空耗一个指令执行周期HLT; 使CPU进入暂停状态这时CPU不执行任何操作。可用来在程序中等待中断一般不使用LOCK; 指令前缀可以放在任何指令前。在当前指令未执行完8086输出引脚被封锁其他控制器不能控制总线ESC; 六位立即数, reg/mem把浮点指令交给浮点处理器1.7 伪指令伪指令不同于汇编指令汇编指令有对应CPU能够识别的机器码而伪指令由编译器识别。ASSUME说明段所对应的段寄存器使用示例assume cs:codeseg段定义SEGMENT ... ENDS使用示例codeseg segment ... codeseg ends源程序结束END编译程序在编译时编译到END时会停止编译。变量定义DB、DW、DD使用示例data segment var dd 100001h ; 定义了一个双字var 为变量名代表了偏移地址 dw 100h ; 定义了字变量 db 0h ; 定义了字节变量 data ends stack segment dw 0,0,0,0,0,0,0,0 ; 每个 0 都占一个字空间 stack ends