汇编语言基础
数据定义:
数据传送、算术运算、跳转指令
MOV 指令
“先目的操作数,再源操作数。”
MOV 指令需要遵循的规则:
-
两个操作数的尺寸必须一致。
-
两个操作数不能同时为内存操作数。
mov reg, reg mov mem, reg mov reg, mem mov mem, imm mov reg, imm mov var2, var1 ;不合法,需要用寄存器来实现 -
目的操作数不能是
CS,EIP和IP。 -
立即数不能直接送至段寄存器。
XCHG 指令
用来交换两个操作数的内容。
xchg reg, reg
xchg reg, mem
xchg mem, reg
若要交换两个内存操作数,还是需要利用寄存器,即 MOV 与 XCHG 结合使用。
INC 和 DEC 指令
分别实现加 1 与减 1 操作。
inc reg/mem
dec reg/mem
ADD 和 SUB 指令
ADD 将同尺寸的源操作数和目的操作数相加,结果在目的操作数中(不改变源操作数)。
SUB 将源操作数从目的操作数中减掉,结果在目的操作数中(不改变源操作数)
两者都同 MOV 指令一样,先目的操作数,再源操作数。
.data
var1 DWORD 20000h
var2 DWORD 10000h
.code
mov eax, var1
add eax, var2 ;30000h
sub eax, var2 ;20000h
NEG 指令
认为操作数是有符号数,形式是补码。该指令将操作数按位取反、末位加 1。
算术运算影响的标志
-
零标志位
ZFmov cx, 1 sub cx, 1 ; ZF = 1 mov ax, 0FFFFh ; 全1理解成补码,真值就是-1 inc ax ; ZF = 1 inc ax ; ZF = 0 -
符号标志位
SFmov cx,0 sub cx,1 ; SF = 1 add cx,2 ; SF = 0 -
进位标志位
CFmov al,0FFh add al,1 ; CF = 1 mov ax,00FFh add ax,1 ; CF = 0 mov ax,0FFFFh add ax,1 ; CF = 1 mov al,1 sub al,2 ; CF = 1。最高位向更高位有进位或借位时置1 -
溢出标识位
OF\(OF = C_n \oplus C_{n - 1}.\)
其中 \(C_n\) 是符号位产生的进位,即标志位
CF; \(C_{n-1}\) 是最高有效位向符号位产生的进位。mov al,+127 add al,1 ; OF = 1 mov al,-128 sub al,1 ; OF = 1 mov al,-128 ; AL = 10000000b neg al ; AL = 10000000b, OF = 1 mov al,+127 ; AL = 01111111b neg al ; AL = 10000001b, OF = 1
JMP 和 LOOP 指令
JMP :无条件转移
LOOP :条件转移
