微机原理笔记 - chap3 - Intel处理器指令系统及汇编语言
汇编语言基础
数据定义:
数据传送、算术运算、跳转指令
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
:无条件转移
top:
jmp top ;repeat the endless loop
LOOP
:条件转移
mov ax,0
mov ecx,5
L1: inc ax
loop L1
;循环体的第一条指令必须要给标号。循环体的最后一条指令要用loop,后面跟这个标号
;循环结束时,AX=5 ECX=0
过程
条件处理
AND 指令 与 OR 指令
AND / OR 目的操作数 源操作数
两个操作数可以是8、16 或 32位的,但它们的尺寸必须相同。
影响的标志位:总是清除 OF
和 CF
,根据结果修改 SF
、ZF
、PF
。
AND 指令应用:
OR 指令应用:
NOT 指令
将操作数所有数据位取反,结果为反码。
mov al,11110000b
not al ; AL = 00001111b
条件跳转指令
整数算数指令
移位指令
乘法和除法指令
字符串和数组
基址变址 (base-index) 操作数:将两个寄存器的值相加(称为基址寄存器、变址寄存器)来产生偏移地址。
保护模式程序中,可使用任意32位通用寄存器。
宏
使用I/O端口控制硬件
x86属于独立编址,要访问接口地址空间只能用 IN 指令
和 OUT 指令
。不管是8086还是32位、64位的CPU,接口地址都是16位的,端口地址范围为0~FFFFh。