x86汇编急救指南:二进制数据和寄存器

假装自己基础知识都会,结果发现还是要先补……

二进制数据

bit

是最小的单位;

最右边一位编号为0,叫最低位/LSB;最左一位是最高位/MSB。

nibble

1 nibble = 4 bits eg. 1001

用于16进制数处理,因为1H = 0001B;

用于BCD码处理。

byte

1 byte = 8 bits (= 2 nibbles) eg. 1001

是8086的最小可寻址单元,主存按byte编址;

可以存放0-255的unsigned或-128-127的signed;

还用来存放字符。

word

1 word = 16 bits = 2 bytes

0-7位:低字节 Low Order Byte;8-15位:高字节 High Order Byte;

8086中内存段地址和偏移地址都是word。

double word

1 double word = 32 bits = 2 words = 4 bytes

0-7位:低字 Low Order Word;8-15位:高字 High Order Word。

 

寄存器

8086有14个16bits寄存器。分为:8个通用寄存器,4个段寄存器,2个控制类寄存器。

通用寄存器

数据寄存器 AX, BX, CX, DX

每一个寄存器XX分为高低XH, XL两个。

AX:

Accumulator 累加器

乘除法运算、串运算、I/O指令中作为专用寄存器

BX:

Base 基址寄存器

寻址时存放基址

CX:

Count 计数寄存器

循环、串操作指令中用作计数器

DX:

Data 数据寄存器

寄存器间接寻址的I/O指令中存放I/O端口地址;

双字长除法运算时和AX存放一个双字长数据,DX存高位。

变址寄存器 SI, DI

除做通用寄存器外,常常用来寻址

SI:

Source Index 源变址寄存器

DI:

Destination 目的变址寄存器

地址指针寄存器 SP, BP

存放数据,更多存放内存单元的偏移地址

SP:

Stack Pointer 堆栈指针寄存器

堆栈的栈顶内存单元的偏移地址

除了堆栈操作外不应改变SP的地址

BP:

Base Pointer 基址指针寄存器

做通用寄存器、寻址

一点说明

只有BX, BP, SI, DI可以用在方括号[]中来寻址

缺省地址:如果方括号中有bp,段地址就是ss;如果没有bp,一律是DS

段寄存器 CS, SS, DS, ES

CS:

Code Segment 代码段寄存器

存放代码段的段地址

SS:

Stack Segment 堆栈段寄存器

存放堆栈段的段地址

DS:

Data Segment 数据段寄存器

存放数据段的段地址

ES:

Extra Segment 附加数据段寄存器

存放附加段的段地址

控制寄存器 IP, FL

IP:

Instruction Pointer 指令指针寄存器

存放代码段中的偏移地址

程序运行过程中, CS:IP始终指向下一条指令的首字节;CS是段地址, IP是偏移地址

用户程序不能直接访问IP

FL:

Flags 标志寄存器

16位寄存器,但只用其中9位(只考6个常用的:CF, ZF, OF, SF, DF, IF)

OF:

Overflow Flag 溢出标志

运算溢出置1, 否则置0;

JO:OF=1跳;JNO:OF=0跳;

非符号数运算不用考虑OF。

SF:

Sign Flag 符号标志

记录运算的符号,负数置1,否则置0;

JS:SF=1跳;JNS:SF=0跳;

仅对符号数有意义。

ZF:

Zero Flag 零标志

运算结果为零置1,否则置0;

JZ/JNZ.

CF:

Carry Flag 进位标志

运算时从最高位产生的进位值或借位值;

有进位/借位置1, 否则置0;

JC/JNC;

CLC:置0,STC:置1,CMC:反转CF;

仅对非符号数有意义。

DF:

Direction Flag 方向标志

DF=1时每次操作后SI和DI减量,使串处理从高地址向低地址方向进行;DF=0相反;

CLD:置0,STD:置1.

IF:

Interrupt Flag 中断标志

IF=1允许中断,IF=0关闭中断;

CLI:置0,STI:置1.