汇编学习笔记(一)--王爽老师教材

学习汇编的目的

通过学习汇编进行编程,而深入的了解计算机底层的基本工作机理,可以达到随心所欲的控制计算机。在学习的过程中,比如操作系统,编译原理等内容都会影响我们,但是我们只是利用masm等工具进行更好的学习汇编,不要让这些额外的东西分散我们的注意力,要明确我们学习的目的,不要多手抓多手都丢失的厄运!!

第二章知识点

1.物理地址

    所有的内存单元构成存储空间是一个一维德线性空间,每一个内存单元在这个空间中都有唯一的地址。

2.16位CPU

    运算一次最多可以处理16位数据

    寄存器最大宽度为16位

    寄存器和运算器之间的通路位16位

3.8086CPU采用一种在内部两个16位地址合成的方法来形成一个20位的物理地址,其中采用了地址加法器,物理地址=段地址*16+偏移地址。

cpu逻辑结构

本质含义:CPU在访问内存的时候,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

4.段地址

    其实在内存中是没有段地址的,在以后的编程中,将若干个地址连续的内存单元看做一个段,用段地址*16来表示基础地址(起始地址),用偏移地址来定义段中的内存单元。要注意的又两点:

段的起始地址一定是16的倍数

段的最大长度为64k

5.段寄存器

    CS,DS,SS,ES,其中CS和IP是最关键的寄存器,它们指示了CPU当前要读取指令的地址。

    CS为位代码寄存器,IP为指令指针寄存器。位CPU提供所需的执行指令的地址,CS为段地址,IP为偏移地址,经过加法器后,通过20为地址总线到内存中寻找数据,然后通过数据总线放到输入输出控制电器,然后放到指令缓冲器,之后到指令执行器执行。

    如何修改CS,IP指令

jmp 段地址:偏移地址,jmp 2AE3:3,说明执行后:CS= 2AE3H,IP=0003H,CPU将从2AE33H处读取指令

    如果只想修改IP内容,jmp 某一合法寄存器,如jmp ax

第三章知识点

1.内存中字的存储以字单元来表示,存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成,高内存单元存高字节,低内存单元存低字节

2.DS

    用来存放访问数据的段地址(可以在mov的指令中给出单元偏移的地址,此时段地址ds是默认的)

3.数据段

    将一组长度为N(N<=64k),地址连续的,起始位16的倍数的内存单元当做专门储存数据的内存空间,从而定义了一个数据段。

4.栈顶越界问题

 

第四章知识点

如何构建第一个程序?

1.伪指令和汇编指令

汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终由CPU来执行

伪指令:没有对应的机器指令,最终不被CPU所执行,由编译器来执行指令,编译器根据伪指令来进行相关的编译工作

assume cs : codesg

codesg segment

           mov ax,0123H

           mov bx,0456H

           add ax,bx

           add ax,ax

           mov ax,4c00H       //代表了程序返回

           int 21H                 //将CPU的控制权交换给使得它的一运行其他的程序

codesg ends

end

从以上这段简单的源码可以看出,伪指令有:***segment…….***ends(一个有效的汇编程序必须的,因为这个代表了一个段,用来存放代码),assume(将有特定用途的段和相关的段寄存器关联起来),end(汇编程序的结束的标志)

2.汇编从写出到执行的过程

编程(edit)—>test.asm-->complie—>test.obj—>link—>test.exe-->load—>the program in memory—>run

第六章知识点

1.程序的框架

assume cs : code

code segment

            data                  //存放数据的地方

start:                           //指明了程序的入口

            codes

code ends

end start

一个简单的数据加法程序

assume cs :code

code segment

    dw 0123h , 0456h , 0789h , 0abch , 0defh , 0fedh , 0987h , 0cbah //刚好占了16个空间

    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

start:mov ax , cs

        mov ss , ax 

        mov sp , 30h         //设置栈顶ss:sp指向cs:30h

 

        mov bx , 0

        mov cx , 8

s:  push cs:[bx]

         add bx , 2

         loop s

 

         mov bx , 0

         mov cx , 8

s0:  pop cs:[bx]

         add bx , 2

         loop s0

 

         mov ax , 4c00h

          nt 21h

code ends

end starts

posted @ 2010-03-27 16:15  云端小飞象cg  阅读(306)  评论(0编辑  收藏  举报