汇编基础

来源:互联网 发布:淘宝贷款逾期怎么办 编辑:程序博客网 时间:2024/05/01 19:51
前面粗略地整理了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个段。


0 0
原创粉丝点击