add
add 目的,源 ; 加法指令,结果放入目操作数,操作数的长度必须相同
adc
adc 目的,源 ; 带进位加法,目的=目的+源+CF
and
and 目的,源 ; 逻辑按位与 指令,结果放到目的操作数。
; 影响标志位OF、SF、ZF、PF和CF。
call
call s
; 使call s下一条指令的 CS:IP 入栈(段内转移只有 IP 入栈),跳转到标号处
cmp
cmp des, sou ; des - sou 不改变 源/目的 的值
注:如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如右表所示:
CMP结果 | ZF | CF |
---|---|---|
目的操作数 < 源操作数 | 0 | 1 |
目的操作数 > 源操作数 | 0 | 0 |
目的操作数 = 源操作数 | 1 | 0 |
注:如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如右表所示:
CMP结果 | 标志位 |
---|---|
目的操作数 < 源操作数 | SF ≠ OF |
目的操作数 > 源操作数 | SF=OF |
目的操作数 = 源操作数 | ZF=1 |
cmov
指令 | 同义名 | 条件 | 描述 |
---|---|---|---|
cmovne | cmovnz | -ZF | ZF不为0时,进行传送 |
dec
dec 目的 ; 减一(自减)指令。
inc
inc 目的 ; 加一(自增)指令,和add 目的,1效果相同,inc的机器码更短,,执行快
jmp
无条件跳转
jmp 标号
jmp short 标号 ; 段内短转移,位移范围(-128~127)
jmp near ptr 标号 ; 段内近转移,位移范围(-32768~32767)
jmp far ptr 标号 ; 段间转移
jmp word ptr 内存单元地址 ; 段内转移
jmp dword ptr 内存单元地址 ; 段间转移
jne、jnz
jne s ; 条件转移指令。当ZF = 0,转至标号处执行。
jnz s ; 条件转移指令。当ZF != 0,转至标号处执行。
lea
lea 目的,源
; 取有效地址指令,获取的是源的内存单元的地址(偏移地址)不是数据
; 源操作数必须是存储器操作数(ds:[0123H])或者标号
loop
s:
add ax, ax
loop s ; cx寄存器不为0,则跳转到s;s标号
; 执行时,先(cx)=(cx)-1,再判断cx是否为0
mov
mov ax, 0 ; 把 0 复制到 ax
mov byte ptr xx:[x], 0 ; 8 位数传送 ptr – pointer (指针)缩写。
mov word ptr xx:[x], 0 ; 16 位数传送
movzx
movzx 16位寄存器, 8位寄存器
; 把8位寄存器的值复制给16位寄存器,前面用0填充
; 只适用于无符号整数
mul
乘法指令
mul 寄存器或内存单元
; 两个相乘的数,位数必须是相同的,如果是8为其中一个默认在AL,结果存放在AX
; 如果是16位其中一个默认在AX,结果高位存放在DX,低位存放在AX
not
not 目的 ; 逻辑非 指令;结果放到目的操作数。
; 不影响标志位。
offset
mov ax,offset 标号 ; 取标号的偏移地址
; offset是操作符不是汇编指令,由编译器执行。
or
or 目的,源 ; 逻辑按位或 指令;结果放到目的操作数。
; 影响标志位OF、SF、ZF、PF和CF。
push
push ax
; 将ax寄存器的数据压入栈中
; 执行时,先SP - 2,随后写入数据,高位对高位,低位对低位.
pop
pop ax
; 从栈中取出数据存入ax
; 执行时,先取出数据写入ax寄存器,随后SP + 2
注:如果寄存器是32位的则SP ± 4。(push/pop 8位寄存器 报错)
ret/retf
ret 相当于 pop ip
retf 相当于 pop ip pop cs
sub
sub 目的,源 ; 减法指令,结果放入目操作数。
sbb
sbb 目的,源 ; 带借位减法,目的=目的-源-CF
test
test ax, bx
; 将两个操作数进行 逻辑与 运算,并根据运算结果设置相关的标志位。
; 但是两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。
; TEST AX,BX 与AND AX,BX命令有相同效果,只是Test指令不改变AX和BX的内容,
; 而AND指令会把结果保存到AX中。
; 影响标志:C,O,P,Z,S(其中C与O两个标志会被设为0)
Intel的技术手册
TEMP ← SRC1 AND SRC2; // 逻辑与的结果赋值给TEMP
SF ← MSB(TEMP); // 最高位赋值给 SF 标志位
IF TEMP = 0
THEN ZF ← 1; // TEMP == 0 ZF 标志位设置1
ELSE ZF ← 0; // TEMP != 0 ZF 标志位设置0
FI:
PF ← BitwiseXNOR(TEMP[0:7]); // PE = 将TEMP的低8位,从第0位开始,逐位取同或。也就是第0位与第1位的同或结果,去和第2位同或,结果再去和第3位同或....直到和第7位同或。
CF ← 0; // CF 和 OF 标志位设置0
OF ← 0;
(* AF is undefined *) // AF 不确定
xchg
xchg ax,bx ; 交换两个寄存器的数据,两个操作数的类型要相同,内存和内存之间不能使用
xor
xor 目的,源 ; 逻辑按位异或 指令;结果放到目的操作数。
; 影响标志位OF、SF、ZF、PF和CF。
标志寄存器
ZF(零标志位)
用于记录相关指令执行后的结果是否为0
为0: ZF = 1 不为0: ZF = 0
影响ZF的指令:add、sub、mul、div、inc、or、and等(大多数是运算指令)
PF(奇偶标志位)
用于记录相关指令执行后的结果所有bit位中1的数量是否为偶数
偶数: PF = 1 奇数: PF = 0
SF(符号标志位)
用于记录相关指令执行后的结果是否为负
负: SF = 1 非负 :SF = 0
CF(进位标志位)
一般情况下,在进行无符号运算时,记录运算结果的最高有效位向更高位的进位值(或借位值)
发生进位(借位):CF = 1 未发生进位(借位): SF = 0
OF(溢出标志位)
一般情况下,在进行有符号运算时,记录运算结果是否发生溢出
发生溢出:OF = 1 未发生溢出: OF = 0
未完待续,持续更新中...