zoukankan      html  css  js  c++  java
  • 汇编语言程序设计学习笔记(第一遍学习)第2节:寄存器

      最近有几天没有写学习笔记了,主要是汇编语言的学习比我想象中的繁琐,很多东西需要大量实践才能灵活运用,经过几天的实践我差不多熟识了一些基本的东西,所以呢!学习笔记继续!

    计算机系统组成图

    我们先来看看计算机到底由哪些东西组成的

    *从上图我们可以看到,CPU通过系统总线访问主存贮器。然后也是通过系统总线访问IO接口并间接访问辅助存储器,输入和输出设备。这样一来CPU到IO到辅助存储器,输入输出设备,它的速度是由最慢的1个决定。因为IO啊,辅助存储器啊,输入输出设备啊一级一级的更慢,所以计算机采取了1个措施,就是预先读取一部分数据到主存储器中。因为主存的速度比辅助存储器快很多了。

    汇编语言程序最关系的东西是什么呢?!当时是寄存器了。

    寄存器

    老汇编书上最常见的8个寄存器

    AX BX CX DX SI DI BP SP

    我其实学习汇编语言的第一天很害怕它,感觉好多个。每个又有共同点,每个又有通用点,又有它特殊的地方。感觉蛮繁琐的。不过几天后,我觉得这些只是1个练习的过程,刚开始不要刻意去记忆,在实践中练习中学习最有效!加油!它们有一个共同点就是暂时可以放一些东西。然后边往后学边去理解各个寄存器的作用。比如这个BP要结合到函数才能深刻的学习。我们可以这样理解,我们身边有8个金刚罗汉。他们都有共同点就是都很能打坏蛋,但是他们的武功又有所不同。

    调试程序debug

    *debug是常用的汇编语言级调试工具,为汇编语言程序员提供了分析指令,跟踪程序的有效手段。

    *debug常用命令:-A 汇编  -U 反汇编  -T单步执行  -G 断点执行  -D 数据显示 -R 寄存器

    最近学汇编进度慢了不少,主要是时间是花在了debug的实践上。

    8086内部结构

    哇!好晕,不过再继续逐步结合寻址方式学习,就会觉得很简单啦!

    8086内部结构对于程序员来说什么最重要

    最重要的是寄存器组:*8个通用寄存器  *1个指令指针寄存器 *1个标志寄存器  *4个段寄存器

    下面分别来学习下。

    8086的16位通用寄存器组:

    AX BX CX DX SI DI BP SP 共八位虎将啊!有的精通做加法,有的精通做基址定位,有的作为循环控制,有的作为访问端口等等。我们挨个进行学习、现在我们要知道这几个寄存器可以暂时放东西。前4个ABCD数据寄存器还可以分为高8位和低8位,也就是分成了AH BH CH DH AL BL CL DL也就是高字节,低字节,而且对其中某8位的操作,并不影响另外对应8位的数据。我们在选择寄存器的时候要多用AX,因为处理器厂商宣称对AX有硬件优化。它本来是作为加法器的,加法器在CPU的地址是很重要的。只要把加法优化千分之一,整个程序的性能就上去了。

    数据寄存器各自专业目的简析

    *数据寄存器用来存放计算机的结果和操作数,也可以用来存放地址。

    AX-----累加器,使用频率最高,用于算术,逻辑运算以及对外设传送信息的等等,加上处理器厂商宣称对其进行了硬件优化。所以首选。

    BX-----基址寄存器,常用于做存放存储器地址、这个我暂时还不懂,以后学到了就会明白啦!

    CX-----计数器,作为循环和串操作等指令中的隐含计数器,有些我们代码需要循环的啦!通过检查               CX知道是不是应该退出循环了!

    DX-----数据寄存器,常用来存放双字长数据的高16位,或者存放外设的端口地址。有时候我们做乘法结果超过了寄存器的容量,那么超过的高位就到了DX中去啦!

    现在我们都先记住这些基本概念啦!

    变址寄存器

    当我们要处理或者修改一大片数据的时候,而且这些数据是连续存放的话,那么这些数据就会有起点和终点。我们拷贝数据的话就会涉及到原数据和目标数据,所以这里有SI是源变址寄存器,DI就是目的变址寄存器。在串操作类指令的时候,SI和DI具有特别的功能。

    指针寄存器

    指针寄存器用来寻址内存中堆栈内的数据。这里大家一定要注意1个概念,中国的语言博大精深,比如在小说中说1个人爱佩刀剑,其实这里只是指的剑,没有刀,这里的堆栈呢!也一样,堆栈就是值栈,并没有堆,堆是堆,栈是栈。

    栈是主存中一个特殊的区域,栈是一个先进后出的概念,比如坐电梯先进去的最后出来,子弹夹,也是先放入的子弹,后面才打出来。

    栈通常由寄存器自动维持,在8086中,由堆栈段寄存器SS和堆栈指针寄存器SP共同指示。为什么要共同指示呢!这个还是由于寻址方式有关系。

    这是一种结构,先只要记住就好!

    *SP不能再用于其他目的,具有专用目的,但是技术这个东西不能把它说死,修改也是可以的,但是修改以后程序如何跑下去就很难说了。

    *BP为基址指针寄存器,表示数据在堆栈段中的基地址,基地址是这样的,比如,我们现在去找公共厕所,我们在路上问1个人,他说,你看见前面的红灯吗,红灯处往左100米就有个公共厕所、那么这时候红灯就是一个基地址。

    *SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址。

    指令指针IP

    我们的指令是一条一条的执行,所以我得有个记录,目前执行到了哪里,所以我们必须要有指令指针IP以确定指令执行到什么地方啦!我们学C语言的时候就知道存储器有一个唯一编号,既然存储器中有可以放数据又可以放代码,比如我们现在执行到了10000行代码,下一条指令是3字节,那么这时候IP会被修改为10003.IP永远指向下一条指令的地址。IP也是一个专用寄存器,同理,技术不是绝对的,你想放也可以放,有些特种需要可以放一下,当然这必须在你谋划好了的情况下,这样一切都还你的控制之下,如果不是你的控制之下,一下子把IP搞混淆了,指向了数据段去,结果数据段又没代码。这个时候就指令走飞啦!

    标志寄存器

    用于反应指令执行结果或控制指令执行形式,8086处理器的各种标志形成了一个16位的标志寄存器FLAGS。

    比如做加法,溢出或者进位的时候,标志寄存器就可以表示出来。

    标志寄存器有以下分类:

    *状态标志--用来记录程序运行结果的状态信息,许多指令的执行都将相应的设置它

    CF ZF SF PF OF AF

    CF进位标志:当运算结果的最高有效位有进位或者借位时,进位标志置1,即CF=1 否者CF=0。

    ZF零标志ZF:若运算结果为0,则ZF=1 否则ZF=0;

    SF符号标志:这个是针对有符号的数,运算结果最高位为1,则SF=1.否则SF=0;

    PF奇偶标志;OF溢出标志:主要是对有符号而定,若算术运算的结果有溢出,则OF=1,否则OF=0;

  • 相关阅读:
    1.1.28 文字所在段落增加下划线
    Microsoft Project 2010基础使用方法
    16.3 将Win7文档的内容到复制Linux的vi中
    3.4 在Word中的公式和序号之间填充连续的点
    18.25 JLink调试程序步骤
    18.24 Ubuntu修改静态IP
    18.23 inline函数功能
    18.22 sprintf函数功能
    18.21 关键字extern
    18.20 频率单位转换
  • 原文地址:https://www.cnblogs.com/dodolook/p/2073625.html
Copyright © 2011-2022 走看看