2009-04-01

汇编语言学习笔记 (2)

  1. 寄存器
  2. 通用寄存器
  3. 为什么使用 16 进制
  4. 16 位的 cpu
  5. 物理地址
  6. 段寄存器
  7. CS 和 IP

    1.寄存器
    对于汇编程序员来说,cpu 中的主要部件是 寄存器(Register)。
    8086 cpu 共有 14 个寄存器,每个寄存器有一个名称:
    AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

    2.通用寄存器 AX,BX,CX,DX
    这 4 个寄存器用来存放一般性的数据,称为通用寄存器。
    AX,BX,CX,DX 这 4 个寄存器可以分为两个可以独立的 8 位寄存器来用:
    • AX 可分为 AH,AL (H-高,L-低)
    • BX 可分为 BH,BL
    • CX 可分为 CH,CL
    • DX 可分为 DH,DL
    例如:
    AX=0000110011110011

    AH=00001100
    AL=11110011

    3.为什么使用 16 进制
    内存中数据以二进制存储,8 位为 1 个字节(byte),16 位为 1 个字(word)。
    使用 16 进制来表示,刚好 4 位 2 进制数为一位 16 进制数,这样,16 进制可以清晰的表示出二进制数。
    例如:
    (16 进制数以 H 结尾)
    AX=0000110011100010 = 0CE2H
    AH=00001100 = 0CH
    AL=11100010 = E2H
    这样,知道 AX 的值就能够马上写出 AH 与 AL 的值,反之亦然。

    4. 16 位的 cpu
    8086 为 16 位结构的 cpu,在 8086 内部,一次可以处理,传输,暂时存储的信息最长长度是 16 位的:
    • 运算器一次最多可以处理 16 位数据
    • 寄存器的最大宽度为 16 位
    • 寄存器的运算之间的通路为 16 位

    5. 物理地址
    8086 虽然有 20 条地址总线,但是 8086 是 16 位的结构,那么他一次只能够发送 16 位的地址,那么寻址能力只有 64 KB。实际上 8086 却可以发送 20 位的地址,可以表现出 1 MB 的寻址能力。
    在 8086 内部用两个 16 位的地址来合成一个 20 位的物理地址。

    物理地址 = (段地址 X 16d) + 偏移地址
    物理地址 = (SA X 16d) + EA
    例如要访问 123C8H 的内存单元,cpu 先给出一个段地址 1230H ,然后给出偏移地址 00C8H
    经过 (段地址 X 16d) + 偏移地址 之后,就得到 12300H + 00C8H = 123C8H 的物理地址了。
    ps: 实际上 X 16d 就等于 十六进制数左移一位然后右边多出的一位补上零
    应该注意到,实际上 123C8H 可以由不同的段地址加上偏移地址来构成,所以,内存中并没有明确分的段。一般自己规定段地址,通过不同的偏移地址来访问段内的内存单元。

    6. 段寄存器
    cpu 中段地址存放于段寄存器内,8086 cpu 有 CS,DS,SS,ES 四个段寄存器。

    7. CS 与 IP
    CS 和 IP 是 8086 cpu 两个最关键的寄存器
    CS : 代码段寄存器
    IP : 指令指针寄存器
    在任意时刻,cpu 把 CS:IP 指向的内存单元的内容作为指令来执行。

    我们通过指令 JMP 来改变 CS 和 IP 的内容
    JMP 07BF:0200 -> 使 CS = 07BFH , IP = 0200H
    执行之后,cpu 将会从内存单元 07DF0H 处读取指令

    编程时,我们将一块连续的内存单元作为代码段,存放要执行的代码。
    要执行代码,需要将 CS:IP 指向代码段的第一条指令的首地址。

    No comments:

    Post a Comment