您的位置:首页 > 其它

汇编基础

2016-01-25 17:01 288 查看
前面粗略地整理了C和C++的一些基础性的知识点,在这过程中也加深了其中一些重要知识点的理解。

虽然还远谈不上有多么地深入浅出,至少还算符合当初写博客的初衷:乐于分享,利人利己!

接下来对汇编语言作一个大致的整理和总结。

1、汇编语言的特点
a.与机器相关性
b.执行的高效率
c.编程的复杂性
d.调试的复杂性

2、数据表示

二进制 :B/Y 例:1010B
八进制 :Q/O 例:123Q
十进制 :D/T 例:456D
十六进制:H 例:123H
BCD码:每位十进制数用4位二进制表示。常用8421BCD码表示十进制数。
对比二进制:单纯地用4位二进制代替一位十进制数,在表示数值较大时位数较少。

3、寄存器

80X86的32位通用寄存器:8个
EAX:累加器,在乘除法中被主动调用;
ECX:循环计数器;
EBX:基址寄存器,常用作存放存储器地址;
EDX:数据寄存器,常用作存放8字长数据的高32位;
ESP:堆栈指针寄存器,指向最上层栈的栈顶;
EBP:基址指针寄存器,指向最上层栈的栈底;
ESI:源变址寄存器;
EDI:目的变址寄存器;

80X86的16位通用寄存器:8个
AX BX CX DX
SP BP SI DI
前4个寄存器可分为高8位和低8位两个独立的寄存器,
80X86的8位通用寄存器:8个
AH BH CH DH
AL BL CL DL
正因高8位寄存器和低8位寄存器是相互独立的,故对其中某8位的操作不影响另外对应8位的数据。

其他寄存器:
IP:指令指针寄存器,指示代码段中指令的偏移地址;
CS:代码段寄存器;
CS:IP:指示下一条指令的物理地址;
计算机通过CS:IP寄存器控制指令序列的执行流程;

FLAGS:标志寄存器,16位;
标志:反应指令执行结果,控制指令执行形式;
状态标志:记录程序运行结果的状态信息,大多指令的执行都会设置状态标志;
共有6个状态标志:
CF:进位标志,运算结果最高有效位进位(加法)或借位(减法)时,CF=1;否则 CF=0;
ZF:零标志,运算结果为0,则ZF=1,否则ZF=0;
SF:符号标志,运算结果最高位为1(为负),则SF=1;否则SF=0;
PF:奇偶标志,运算结果最低8位中“1”的个数为零或偶数时 PF=1,否则 PF=0;
OF:溢出标志,有符号数的运算结果超出范围,则 OF=1,否则 OF=0 (运算结果已不正确);
AF:辅助进位标志,运算时低4位有进位或借位时 AF=1,否则 AF=0;
控制标志:由程序根据需要用指令设置,用于控制处理器执行智力的方式;
共有3个控制标志:
DF:方向标志,用于串操作指令中,控制地址变化方向。
DF=0,存储器地址自动增加,DF=1,存储器地址自动减小;
CLD:复位方向标志,执行后DF=0;STD:置位标志,执行后DF=1;
IF:中断允许标志,IF=1 则允许中断,否则禁止中断;
CLI:复位中断标志,执行后 IF=0;STI:置位中断标志,执行后 IF=1;
TF:陷阱标志,用于控制处理器进入 单步操作方式,TF=0则处理器正常工作;TF=1则处理器单步执行指令
单步执行:处理器在每条指令执行结束时,产生一个编号为1的内部中断,这种内部中断称为单步中断,因此TF也称为单步标志,利用单步中断可对程序进行逐条指令的调试,即单步调试。

栈:
定义:内存中的一个特殊区域,本质上不属于寄存器;
存取原则:先进后出FILO、后进先出LIFO,非随机存取方式;
指示:8086中,堆栈寄存器SS和堆栈指针寄存器共同指示;

4、内存分段管理

8086CPU有20条地址线,最大可寻址空间为2^20=1MB,8086CPU用两个16位地址合成为一个20位物理地址,物理地址范围从0000H~FFFFFH。CPU将1MB空间分成许多逻辑段,每个段最大限制为64KB,段地址低4位为0000B,这样的话,一个存储单元除了具有一个唯一的物理地址,还具有多个逻辑地址。实质上,内存并未分段,是CPU将其分段看待。
对应每个物理存储单元都有一个唯一的20位编号,即物理地址,从00000H~FFFFFH。CPU将内存分段后,我们在编程时采用的是逻辑地址表示,即段基地址:段内偏移地址 形式,而同一物理地址,可以由不同的段地址和偏移地址表示。怎样从逻辑地址转换为物理地址呢,我们将逻辑地址中的二进制段地址左移4位,加上偏移地址就得到20位物理地址。

段寄存器和逻辑段:
8086有4个16位寄存器
CS:代码段寄存器,指明代码段的起始地址;
代码段:存放程序的指令序列;
处理器利用 CS:IP 取得下一条要执行的指令。
SS:堆栈段寄存器,指明堆栈段的起始地址;
堆栈段:确定堆栈所在的内存区域;
处理器利用 SS:SP 操作栈顶的数据。
DS:数据段寄存器,指明数据段的起始地址;
数据段:存放运行程序所用的数据;
处理器利用 DS:EA(有效地址)存取数据段中的数据。
ES:附加段寄存器,指明附加段的起始地址;
附加段:附加的数据段,用于数据的保存;
处理器利用 ES:EA 存取附加段中的数据。
每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途。

一般情况下,数据访问在DS段,使用BP在SS段访问主存,但是,默认的情况也允许改变,不过需要使用段超越前缀指令:
CS:代码段超越,使用代码段的数据;
SS:堆栈段超越,使用堆栈段的数据;
DS:数据段超越,使用数据段的数据;
ES:附加段超越,使用附加段的数据;
示例:
未采用段超越:
MOV AX,[2000H] ;AX<-DS:{2000H},从默认的DS数据段取出数据;
采用段超越:
MOV AX,ES:[2000H] ; AX<-ES:[2000H],从指定的ES附加段取出数据;

存储器分段:
a.段地址低4位均为0;
b.每段最小为16个存储单元,即16个字节,最大为64KB,不要求必须是64KB;
c.逻辑段之间可以重叠。
可以得出,1MB空间最多可有64K个段,最少可有16个段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: