[已注销]对《汇编语言(第2版)》的笔记(5)

汇编语言(第2版)
  • 书名: 汇编语言(第2版)
  • 作者: 王爽
  • 页数: 337
  • 出版社: 清华大学出版社
  • 出版年: 2008-4
  • 第11页 寄存器

    P11: 上述的那些存储器,在物理上是独立的器件,但在以下两点上相同: (1)都和CPU的总线相连 (2)CPU对它们进行读或写的时候都通过控制线发出内存读写命令。 这也就是说,CPU在操纵它们的时候,把它们都当作内存来对待,把它们总的看做一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。 P24: 其实内存并没有分段,段的划分来自于CPU。以后,在编程时可以根据需要,将若干地址连续的内存单元看成一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。 CPU可以采用不同的段地址和偏移地址形成同一个物理地址。 P25: 8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。读取一条指令后,IP的值自动增加,增加的值为刚读取的那条指令的长度。 P32: MOV指令不能用于设置CS、IP的值,因为8086CPU没有提供这样的功能。能够改变CS、IP的内容的指令被统称为转移指令。例如:JMP P34: 将一段内存当作代码段,仅仅是我么在编程时的一种安排,CPU并不会由于这种安排,就自动地将我们定义的代码段中的指令当作指令来执行。CPU只认识被CS:IP指向的内存单元中的内容作为指令。所以,要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。 P35: 8086CPU的工作过程: (1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器。 (2)IP指向下一条指令。 (3)执行指令。(转到步骤(1),重复这个过程)

    2012-04-26 00:39:48 回应
  • 第49页 寄存器(内存访问)

    P49:  8086CPU不支持将数据直接送入段寄存器的操作,要用一个寄存器进行中转。如先将数据送入bx,再将bx中的内容送入ds P53:  将一段内存当作数据段,是我们在编程时的一种安排,可以在具体操作的时候,用ds存放数据段的段地址,再根据需要,用县官指令访问段中的具体单元。  用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。 P59:  一个重要的问题时,CPU如何知道10000H~1000FH这段内存当作栈来使用?  push,pop在执行的时候,必须知道那个单元是栈顶单元,可是如何知道呢?   8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。push和pop指令执行时,CPU从SS和SP中得到栈顶的地址。 8086CPU中,入栈时,栈顶从高地址向地地址方向增长。 P61:

    2012-04-28 23:39:27 3人喜欢 回应
  • 第124页 第六章 包含多个段的程序
    P124: 我们是不能自己随便决定哪些空间可以使用的,应该让系统来为我们分配。我们可以在程序中,定义我们希望处理的数据,这些数据就会被编译,连接程序作为程序的一部分写到可执行文件中。当可执行文件中的程序被加载入内存时,这些数据也同时被加载入内存中。与此同时,我们要处理的数据也就自然而然地获得了存储空间。 END除了通知编译器程序结束外,还可以通知编译器程序的入口子什么地方。 如何知道哪一条指令是程序的第一条要执行的指令?这一点,是由可执行文件中的描述信息指明的。我们知道,可执行文件由描述信息和程序组成,程序来自于源程序中的汇编指令和定义的数据;描述信息则主要是编译、连接程序对原程序中相关伪指令进行处理所得到的信息。用伪指令END描述了程序的结束和程序的入口。在编译、连接后,由END START 指明程序的入口,被转化为一个入口地址,存储在可执行文件的描述信息中。当程序被加载入内存之后,加载者从程序的可执行文件的描述信息中读到程序的入口地址,设置CS:IP。这样,CPU就从我们希望的地址处开始执行。 P128: 我们要将cs:10~cs:2f的内存空间当作栈来使用,初始状态下栈为空,所以ss:sp要指向占地,则设置ss:sp指向cs:30。 所以我们在描述DW的作用时,可以说用它定义数据,也可以说用它开辟内存空间。
    引自 第六章 包含多个段的程序
    2012-04-30 21:32:05 回应
  • 第147页 第七章 更灵活的定位内存地址的方法
    P139: 我们可以在汇编程序中,用'......'的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的ASCII码。 P141: 要改变一个字母的大小写,实际上就是要改变它所对应的ASCII码。小写字母的ASCII码值比大写字母的ASCII码值大20H。 P142: 就ASCII码的二进制形式来看,除第五位(位数从0开始算)外,大写字母和小写字母的其他各位都一样。大写字母的ASCII码第五位是0,小写字母的第五位为1。因此可以用and(and 11011111B)指令,将第5位置0,将该字母变成大写字母;用or(or 00100000B)指令,将它的第5位置1,将它变成小写字母。 P147: SI和DI是8086CPU中和BX功能相近的寄存器,但SI和DI不能够分成两个8位寄存器来使用。
    引自 第七章 更灵活的定位内存地址的方法
    2012-05-01 21:43:58 回应
  • 第152页 第七章 更灵活的定位内存地址的方法
    P152: [idata]用一个常量来表示地址,可用于直接定位一个内存单元。 [bx]用一个变量来表示内存地址,可用于间接定位一个内存单元。 [bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元。 [bx+si]用两个变量表示地址。 [bx+si+idata]用两个变量和一个常量表示地址。
    引自 第七章 更灵活的定位内存地址的方法
    2012-05-02 23:20:48 回应