汇编语言基础
数据定义:
数据传送、算术运算、跳转指令
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
。
算术运算影响的标志
-
零标志位
ZF
mov cx, 1 sub cx, 1 ; ZF = 1 mov ax, 0FFFFh ; 全1理解成补码,真值就是-1 inc ax ; ZF = 1 inc ax ; ZF = 0
-
符号标志位
SF
mov cx,0 sub cx,1 ; SF = 1 add cx,2 ; SF = 0
-
进位标志位
CF
mov 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
:条件转移