news 2026/8/15 10:22:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
史上最详细汇编指令总结精讲

一. 汇编指令

1.1 数据传输指令

1.1.1mov指令

  • **作用:**把一个字或者一个字节的操作数从源地址传送到目标地址
  • 格式:mov target, source

注意事项:

  1. target不能是CS(代码段寄存器)

  2. target和source不能同时为内存数、段寄存器(CS\DS\ES\SS\FS\GS)

  3. 不能将立即数传送给段寄存器

  4. target和source必须类型匹配,比如,要么都是字节,要么都是字或者都是双字等。

  5. 由于立即数没有明确的类型,所以将立即数传送到target时,系统会自动将立即数零扩展到与target数的位数相同,再进行传送。有时,需要用BYTE PTR、WORD PTR明确指出立即数的位数

1.1.2xchg指令

  • **作用:**把一个字或者一个字节的源操作数和目的操作数相交换
  • 格式:xchg target, source

注意事项:

  1. 不能同时都为内存操作
  2. 任意一个寄存器都不能为段寄存器
  3. 任意一个操作不能使用立即数
  4. 两个操作数的长度必须相等

1.1.3xlat换码指令

  • **作用:**将 bx 指定的缓冲区、AL 指定的位移处的一个字节数据取出赋值给 AL
  • 格式:xlat
XLAT 指令: 功能: AL = DS:[BX + AL] 说明: - BX 指向一个字节表(缓冲区)的首地址 - AL 原来的值作为表内的偏移量 - 从 DS 段中 BX+AL 地址处取出一个字节 - 将取出的数据重新存入 AL

1.1.4push pop堆栈指令

  • **作用:**将 bx 指定的缓冲区、AL 指定的位移处的一个字节数据取出赋值给 AL
  • 格式:
PUSH ax ; 将ax寄存器中的数据压入到栈中 POP ax ; 将栈顶中的数据出栈到ax中

注意事项:

  1. 当栈为空时能不进行出栈
  2. 指令的操作数必须是16位,即不能使用al这种8位寄存器

1.1.5 地址传送指令lea lds les

  • **作用:**将对应的地址表示送入对应的寄存器中

  • 格式:

    LEA reg, mem ; reg ---> Register—寄存器 LDS reg, mem ; mem ---> Memory—内存 LES reg, mem

注意事项:

  1. LDS:将 mem 指定的字送入指定的寄存器中,并且 DS = mem+2
  2. LES:将 mem 指定的字送入指定的寄存器中,并且 ES = mem+2

1.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符号标志位如果执行结果为负数,则SF=1;如果结果非负,则SF=0
ZF零标志位如果执行结果为0,则ZF=1;否则ZF=0
PF奇偶标志位如果执行结果中二进制位1 的个数为偶数,则PF=1;否则PF=0
CF进/借位标志位运算过程中最高位产生进位或借位,则CF=1,否则CF=0。常用于表示无符号数溢出。
OF溢出标志位当运算结果超出机器所能表示的范围时,产生溢出,OF=1。常用于表示有符号数溢出。
DF方向标志位控制串处理指令中DI、SI的增减方向。
DF=0:寄存器递增;
DF=1:寄存器递减。
通过CLD指令清零,通过STD指令置1
TF调试标志位TF=1时,CPU进入单步执行模式,每执行一条指令产生一次调试中断。
IF中断允许标志位控制CPU是否响应外部中断请求。
IF=1:允许外部中断;
IF=0:屏蔽外部中断。
AF辅助进位标志位运算过程中观察低4位(第三位向第四位进位)。如果最后四位向前产生进位或借位,则AF=1,否则AF=0
标志位为1(是)为0(否)
OFOVNV
DFDNUP
IFEIDI
SFNGPL
ZFZRNZ
AFACNA
PFPE(偶)PO(奇)
CFCYNC

1.1.7 输入输出指令in out

IN指令

作用:

从外部设备端口读取数据到AL/AX。

格式:

格式说明
IN AL,PORT读取8位数据
IN AX,PORT读取16位数据
IN AL,DXDX保存端口号

示例:

IN AL,60H

OUT指令

作用:

将AL/AX中的数据输出到外部设备。

格式:

格式说明
OUT PORT,AL输出8位数据
OUT PORT,AX输出16位数据
OUT DX,ALDX保存端口号

示例:

MOV AL,20H OUT 80H,AL

1.2 算数运算指令

1.2.1 加法指令add adc inc

add ax, bx ; ax += bx adc ax, bx ; ax += bx + CF标志位 inc ax ; ax += 1

注意事项:

  1. INC指令不影响进位CF标志位,按定义设置其他状态位标志

1.2.2 减法指令sub sbb dec

sub ax, bx ; ax -= bx sbb ax, bx ; ax -= bx - CF标志位 dec ax ; ax -= 1

注意事项:

  1. DEC指令不影响位CF标志位,按定义设置其他状态位标志

1.2.3 比较指令cmp

cmp ax, bx ; ax - bx

注意事项:

  1. CMP指令只做运算设置状态位标志,不进行赋值

1.2.4 乘法指令mul imul

mul bl ; ax = al × bl MUL无符号乘法(字/字节) imul bx ; dx:ax = ax × bx IMUL有符号乘法(字/字节)

注意事项:

  1. 被乘数被隐藏在al/ax中,结果溢出的数据被保存在ah/dx中
  2. 不支持立即数(如mul 5错误的),乘数必须是寄存器或内存单元。

1.2.5 除法指令div idiv

div b1 ; al = ax ÷ b1, ah放余数 DIV 无符号除法(字/字节) idiv bx ; ax = dx:ax ÷ bx, dx放余数 IDIV 有符号除法(字/字节)

注意事项:

  1. 被除数被隐藏在 AX / DX:AX 中
    • 8位除法:被除数在AX中(AL放商,AH放余数)
    • 16位除法:被除数在DX:AX中(AX放商,DX放余数)
    • 若使用16位除法,必须提前将 DX 清零(DIV)或符号扩展(IDIV)
  2. 除数放在 8/16 位 reg 或内存单元中不支持立即数(如div 5是错误的)
  3. 除数为 0 或商溢出会触发CPU 除法溢出中断(0号中断),程序崩溃

1.2.6 求反指令neg

neg ax ; ax = 0 - ax

1.2.7 符号扩展指令cbw cwd

指令作用操作数
CBW字节 → 字(8位 → 16位)隐含ALAX
CWD字 → 双字(16位 → 32位)隐含AXDX:AX

1.2.8 十进制调整指令

指令作用操作数
DAA加法后的压缩BCD码调整隐含AL
DAS减法后的压缩BCD码调整隐含AL
AAA加法后的非压缩BCD码调整隐含AL
AAS减法后的非压缩BCD码调整隐含AL
AAM乘法后的非压缩BCD码调整隐含AX
AAD除法前的非压缩BCD码调整隐含AX

压缩BCD码(Packed BCD):

  • 一个字节存两位十进制数
  • 例如:0x12= 12(十进制)
  • 有效范围:00H ~ 99H

非压缩BCD码(Unpacked BCD):

  • 一个字节存一位十进制数(高4位为0)
  • 例如:0x02= 2,0x09= 9
  • 有效范围:00H ~ 09H

1.3 位运算指令

1.3.1 逻辑运算指令

指令格式功能说明特殊要求
ANDAND target, source按位与:1 & 1 = 1,其余为0,结果保存到target操作数要求同MOV
OROR target, source按位或:`11 = 11
XORXOR target, source按位异或:相同为0,不同为1,结果保存到target同上
NOTNOT target按位非:1 → 00 → 1,结果保存到target操作数不能是立即数
TESTTEST target, source按位与操作,只设置标志位,不保存结果同上

注意事项:

  1. 通常使用AND指令对指定位清0
  2. 通常使用OR指令对指定位置1
  3. 通常使用NOT指令将某个数据取反码,再加1就得到补码
  4. 通常使用XOR指令来取反某位
  5. 通常使用TEST指令来测试指定位置是0还是1
  6. 非运算对标志位不影响,其余指令对标志均会产生影响

1.3.2 移位运算

  • 非循环移位运算
指令格式类型移动方向补位方式标志位影响
SHL(逻辑左移)SHL reg/mem, 1/CL无符号数左移低位补0,最高位移入 CF移位后若 CF ≠ 最高位,则 OF=1,否则 OF=0
SAL(算术左移)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带进位循环左移最高位移入 CF,CF 原值移入最低位
RCRRCR reg/mem, 1/CL带进位循环右移最低位移入 CF,CF 原值移入最高位

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、MOVSW

  • MOVSB; 字节串传送,ES:[DI] ← DS:[SI] ; DF0,SI←SI+1,DI←DI+1;DF1,则递减
  • MOVSW; 字串传送,ES:[DI] ← DS:[SI] ; DF0,SI←SI+2,DI←DI+2;DF1,则递减

在使用串操作指令前,需要提前将DS、ES、SI、DI、CX、DF设置好。

1.4.2 串存储指令stos

作用:把AL或AX的数据传送至目的地址

使用格式,指令包括 STOSB、STOSW

  • STOSB; 字节串存储:ES:[DI] ← AL ; DI ← DI ± 1
  • STOSW; 字串存储:ES:[DI] ← AX ; DI ← DI ± 2

1.4.3 串读取指令lods

作用:将字节/字从数据段中读取出来保存在AL或者AX中

使用格式,指令包括 LODSB、LODSW

  • LODSB; 字节串读取:AL ← DS:[SI] ; SI ← SI ± 1
  • LODSW; 字串读取:AX ← DS:[SI] ; SI ← SI ± 2

1.4.4 串比较指令cmps

作用:将主存中的源操作数减去目的操作数,以便设置标志,进而比较两操作数之间的关系

使用格式,指令包括 CMPSB、CMPSW

  • CMPSB; 字节串比较:DS:[SI] - ES:[DI] ; SI ← SI ± 1,DI ← DI ± 1
  • CMPSW; 字串比较:DS:[SI] - ES:[DI ; SI ← SI ± 2,DI ← DI ± 2

1.4.5 串扫描指令scas

使用格式,指令包括 SCASB、SCASW

  • SCASB; 字节扫描:AL - ES:[DI] ; DI ← DI ± 1
  • SCASW; 字扫描:AX - ES:[DI] ; DI ← DI ± 2

1.4.6 重复前缀指令rep

重复前缀 REP 可以加到串传送操作指令时。REP 前缀是每次执行串指令后 CX-1。CX-1 后,重复执行串指令,直到 CX 值为 0 时,指令才终止。

使用示例:REP、REPZ、REPNZ、REPE、REPNE

  • rep movsx; 无条件重复直到 CX == 0
  • repz cmpsx; 无条件重复直到 CX == 0 或 ZF == 0
  • repnz cmpsx; 无条件重复直到 CX == 0 或 ZF == 1
  • repe cmpsx; 不断比较,直到 CX == 0 或 ZF == 0
  • repne cmpsx; 不断比较,直到 CX == 0 或 ZF == 1

1.5 控制转移指令

1.5.1 无条件转移指令jmp

作用:跳转到对应的指令地址

使用格式

  • jmp label; IP ← IP + 位移量
  • jmp reg/mem; IP ← reg/mem(reg以及mem都需要是16位)
  • jmp far ptr label; CS = label的段地址,IP = label的偏移地址
  • jmp far ptr mem; CS = [mem+2],IP = [mem]

当指令只需要在当前代码段范围内转移时(±32KB),不需要更改CS地址,只需要修改IP地址。

实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移/近转移/远转移。

程序员可用操作符short/near ptr/far ptr强制指定。

1.5.2 条件转移指令jcc

作用:根据运算结果跳转到对应的指令地址。CC 即指令条件码。

JCC指令含义检查符号位典型C应用
JZ / JE若为0则跳转;若相等则跳转ZF=1if (i == j); if (i == 0);
JNZ / JNE若不为0则跳转;若不相等则跳转ZF=0if (i != j); if (i != 0);
JS若为负则跳转SF=1if (i < 0);
JNS若为正则跳转SF=0if (i > 0);
JP / JPE若1出现次数为偶数则跳转PF=1(null)
JNP / JPO若1出现次数为奇数则跳转PF=0(null)
JO若溢出则跳转OF=1(null)
JNO若无溢出则跳转OF=0(null)
JC / JB / JNAE若进位则跳转;若低于则跳转;若不高于等于则跳转CF=1if (i < j);
JNC / JNB / JAE若无进位则跳转;若不低于则跳转;若高于等于则跳转CF=0if (i >= j);
JBE / JNA若低于等于则跳转;若不高于则跳转ZF=1 或 CF=1if (i <= j);
JNBE / JA若不低于等于则跳转;若高于则跳转ZF=0 且 CF=0if (i > j);
JL / JNGE若小于则跳转;若不大于等于则跳转SF != OFif (si < sj);
JNL / JGE若不小于则跳转;若大于等于则跳转SF == OFif (si >= sj);
JLE / JNG若小于等于则跳转;若不大于则跳转ZF != OF 或 ZF=1if (si <= sj);
JNLE / JG若不小于等于则跳转;若大于则跳转SF == 0 且 ZF == 0if (si > sj);
TablesAre
Z/E相等
N
S符号
P奇偶
O溢出
C进位
L小于(有符号数)
G大于(有符号数)
A高于(无符号数)
B低于(无符号数)

1.5.3 计数器CX为0跳转指令jcxz

CX寄存器通常在程序中用作计数器,JCXZ指令用来判断计数是否为0。

使用格式

  • jcxz label; 若 CX = 0,发生转移:IP ← IP + 8位位移量 ; 若 CX ≠ 0,顺序执行

1.5.4 循环指令loop、loopz、loopnz、loopne

  • LOOP label; CX ← CX − 1,若 CX ≠ 0,则循环到标号 label
  • LOOPZ label; CX ← CX − 1,若 CX ≠ 0 且 ZF = 1,则循环到标号 label
  • LOOPNZ label; CX ← CX − 1,若 CX ≠ 0 且 ZF = 0,则循环到标号 label

(注:LOOPNELOOPNZ的等效写法,功能相同)

1.5.5 子程序跳转指令call

子程序:子程序是完成特定功能的一段程序,当主程序(调用程序)需要执行这个功能时,采用 CALL 调用指令转移到该子程序的起始处执行,当运行完子程序功能后,采用 RET 返回指令回到主程序继续执行。

使用格式

  • CALL label
  • CALL reg/mem; SP ← SP − 2,SS:[SP] ← IP,然后 jmp label/reg/mem
  • CALL far ptr label
  • CALL far ptr mem; SP ← SP − 2,SS:[SP] ← IP ; SP ← SP − 2,SS:[SP] ← CS

CALL 指令其实是做了两件事:执行到 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 号中断
  • 溢出中断:执行溢出中断指令,OF=1 产生的 4 号中断
  • 单步中断:TF=1 时,在每条指令执行后产生的 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 ← 0
  • STC; 置位进位标志位,CF ← 1
  • CMC; 求反进位标志位,CF ← ~CF
  • CLD; 复位方向标志位,DF ← 0(串操作指令中使用)
  • STD; 置位方向标志位,DF ← 1
  • CLI; 复位中断标志位,IF ← 0(用于控制可屏蔽中断的允许和禁止)
  • STI; 置位中断标志位,IF ← 1
  • NOP; 空操作,占用一个字节存储单元,空耗一个指令执行周期
  • 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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/15 10:21:23

Windows Server FTP服务搭建:IIS与FileZilla Server配置详解与安全实践

1. 项目概述&#xff1a;为什么在Windows Server上搭建FTP服务依然重要&#xff1f;在云存储和对象存储服务大行其道的今天&#xff0c;很多人可能会觉得FTP&#xff08;文件传输协议&#xff09;已经过时了。但作为一名经常需要在内网环境、开发测试服务器或特定合规场景下工作…

作者头像 李华
网站建设 2026/8/15 10:20:00

魔兽争霸3闪退卡顿怎么解决?WarcraftHelper兼容性修复完整指南

魔兽争霸3闪退卡顿怎么解决&#xff1f;WarcraftHelper兼容性修复完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 深夜十一点&#xff0c;你终…

作者头像 李华
网站建设 2026/8/15 10:17:01

量化回测引擎架构设计与性能优化实践

1. 量化回测引擎的核心价值与挑战 十年前我第一次接触量化交易时&#xff0c;用Excel手工计算策略收益的场景还历历在目。当时为了验证一个简单的双均线策略&#xff0c;需要手动录入行情数据、编写复杂的公式、逐日计算持仓变化。整个过程不仅耗时费力&#xff0c;更难以避免人…

作者头像 李华
网站建设 2026/8/15 10:16:00

告别电脑自动休眠烦恼:NoSleep防休眠工具完整使用指南

告别电脑自动休眠烦恼&#xff1a;NoSleep防休眠工具完整使用指南 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 开会时你起身倒了杯水&#xff0c;回来发现屏幕已经锁上&…

作者头像 李华
网站建设 2026/8/15 10:13:57

Ryzen超频翻车自救手册:SMUDebugTool实战调校从入门到进阶

Ryzen超频翻车自救手册&#xff1a;SMUDebugTool实战调校从入门到进阶 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…

作者头像 李华