zoukankan      html  css  js  c++  java
  • 汇编学习笔记(2)寄存器

    本篇文章是汇编语言(王爽)一书的学习笔记,对应书中的第二、三章,寄存器。

    CPU主要是由运算器、寄存器和控制器组成,这一篇笔记主要是寄存器相关知识的学习总结,考虑到通用性,用8086CPU来学习。本次笔记共涉及8086CPU中的7个寄存器(总数14个),分别是AX,BX,CS,IP,DS,SS,SP。

    字与字节

    8086CPU中,可以处理以下两种尺寸的数据

    1.字节:Byte,1Byte=8Bit

    2.字:word,1word=2Byte,这2个字节分别称为这个字的高位字节和低位字节

    数制

    计算机中只能存储二进制数据,由于二进制数据书写和阅读困难,也是为了描述不同的问题,我们平时主要使用十进制和十六进制来表示。十进制20000D(D为十进制符号),用十六进制表示为4E20H(H为十六进制符号),用二进制表示为100111000100000B(B为二进制符号)。

    通用寄存器

    通用寄存器用来存储一般性的数据,8086的寄存器都是16位的,可以存放2个字节(1个字)型数据,最大容量2^16Bit即64KB。AX,BX属于通用寄存器,又可分为2个独立的8位寄存器来用,即AH,AL,BH,BL,AH存放高位数据,AL存放低位数据,BH,BL同理,下图是20000D在AX中的存储示例。

    AH中存储了这个字的高8位,AL中存储了低8位,图中可以清晰的看到十进制数据20000可以表示成4E20H,AH可以用2个十六进制数据表示(因4位数据可以表示的最大值为2^4即16,若从0开始是0-15,正好是1个十六进制可以表示的范围),我们说AH中的数据是4EH,比01001110要直观的多,所以以后多用十六进制来表示。

    段寄存器

    说到段寄存器就不得不先了解下8086CPU中地址的表示方法,8086地址总线有20位(5个十六进制位,类似1000FH这样的地址表示),就是说一次可以传输20位的地址,到达1MB的寻址能力。但是CPU是16位结构的,内部寄存器一次只能处理、传输16位的地址(4个十六进制位,类似1000H这样的地址表示),这就需要采取一种特殊的方法来表示20位地址:段地址X16+偏移地址。

    段地址和偏移地址都是存储在CPU中的,通过地址加法器将段地址X16再加上偏移地址,得到地址总线需要的20位地址。如果我们要访问的内存单元物理地址为2000FH,则段地址为2000H,偏移地址为000FH。在地址加法器中,先将段寄存器X16,变为20000H,然后加上偏移地址,20000H+000FH即可得到物理地址2000FH。至于为什么是X16,而不是X8,X10,这是因为地址都是以十六进制表示,X16正好是左移一位。和10进制一样,如果100D左移一位1000D,就需要X10,任何进制数左移一位都是X相应进制,二进制左移一位相当于X2,八进制左移一位相当于X8,左移N位就是X进制数N次方。

    在CPU中,段地址是存放在段寄存器CS中,偏移地址则存放在指令寄存器IP中。访问物理地址2000FH,CS=2000H,IP=000FH,记作CS:IP。CS:IP指向的内存单元中一般存放的是程序。

    8086CPU中还有一个段寄存器也是用来存放段地址的,他就是DS,偏移地址用[地址]表示,DS:[地址]指向的内存单元中存放的一般是数据

    一些汇编指令

    目前,可以使用的汇编指令有mov,add,sub和jmp。

    • mov ax,bx表示将寄存器bx中的值送入寄存器ax中,用高级语言描述就是ax=bx

    • add ax,bx表示将寄存器ax的值加上寄存器bx的值,结果存在ax中,用高级语言描述就是ax=ax+bx

    • sub ax,bx表示将寄存器bx的值加上寄存器ax的值,结果存在ax中,用高级语言描述就是ax=bx-ax

    • jmp 2AE3:3表示将CS中的值修改为2AE3H,IP中的值修改为0003H,若用jpm ax的形式则表示用ax中的值修改IP

    mov,add,sub指令有多种形式,这里就不一一记录了,需要注意的是,数据是不能直接与段寄存器交互的,形如 mov 段寄存器,数据的形式是非法的。要想完成mov ds,2000H的操作只能通过通用寄存器来中转,mov ax,2000H;mov ds,ax.

    书中还介绍了Debug的使用,这里就不记录在笔记中了,网上有很多相关的资料,win7的操作系统没有自带的Debug程序,可以下载DOSBox 0.74这个小程序来使用debug命令。

    数据段与栈

    数据段是编程时的一种安排,划出一段内存空间专门用来存储数据。例如,可以将内存单元123B0H-123B9H作为一个数据段,长度为10Byte。

    说到栈,热爱编程的同学应该都不陌生,栈其实就是一种特殊的数据段,满足后进先出(LIFO)的结构。既然也是数据段,就需要我们自己约定栈的长度和起始地址,8086中的段寄存器SS和寄存器SP提供了这种功能。

    SS、SP的功能和CS、IP的功能一样,SS中存放段地址,SP中存放偏移地址,SS:SP指向的内存单元就是栈顶。如果将10000H-1000FH这段空间当作栈空间,则SS=1000H,SP=0010H,执行一次push ax操作后,SS=1000H,SP=000EH。在一段栈空间中,SS指向的段地址不会变化,只有SP可以在0-FFFFH范围内移动,所以一段栈空间的最大容量为64KB。

  • 相关阅读:
    取三级分销上下级用户id
    Map集合
    Log4j
    异常
    逻辑运算符
    变量
    变量名命名规则
    命名法
    Nessus
    Nmap扫描工具
  • 原文地址:https://www.cnblogs.com/michaelle/p/4023310.html
Copyright © 2011-2022 走看看