《汇编语言-王爽》 读书笔记

来源:互联网 发布:西安长城宽带网络 编辑:程序博客网 时间:2024/05/16 19:25

                               第一章:基础知识

1.1.汇编指令和机器指令

  汇编语言的主体是汇编指令,汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是极其指令便于记忆的书写格式.

  机器指令 1000100111011000表示把寄存器BX的内容送到AX中。汇编指令则写成mov ax, bx。在汇编指令和机器码之间有一个编译器起到一个转换的作用。

1.2.汇编指令的组成

  (1)汇编指令:汇编码的助记符,有对应的机器码

  (2)伪指令:没有对应的机器码,由编译器执行。计算机并不执行

  (3)其它符号:+,-,*,/。由编译器识别,没有对应的机器码。

1.3.存储单元

   一个存储器被划分成多个存储单元。一个byte8bit,一个存储单元是可以存储一个byte的。

1.4.cup对存储器的读写

  cup访问存储器,首先要确定是访问那个单元(地址信息)。然后是确定对这个单元进行那种操作,是读,还是写(控制信息)。然后才能真正的读数据或写数据(数据信息)。这三种信息就是cup和内存之间的信息交互。

 

 

1.5地址总线

 Cup通过地址总线来寻址,如果有10根地址总线,每根地址总线都有01两种状态,那么可以寻址多少个存储单元,210次方。(1023个存储单元,1k

如图:cup寻找15这个存储单元的实际过程

 

 

 

1.6数据总线

8根数据总线一次可以传送8 bit16根数据总线一次可以传送16bit即2个byte

 

1.7存储器

Cup不能直接操作外围设备如显示器,打印机而是操作相应的显卡,网卡。他们插在主板上的扩充插槽里,扩充插槽通过总线和cup相连接。从而实现了cup对外围设备的间接控制。

PC中的各种存储器情况:

 

第二章 寄存器

一个典型的cup由寄存器,控制器和运算器等器件组成,这些器件又总线(内部总线,区别上一章将的外部总线)相连。在cup内部

寄存器用于存放指令和数据

控制器用于控制各个器件进行工作

运算器用于信息处理

2.1通用寄存器 (AX,BX,CX,DX)都是16位的寄存器

416位通用寄存器又可分配成两个独立的寄存器:

AX可分为:AHAL

BX可分为: BHBL

CX可分为: CHCL

SX可分为: SHDL

cup可以一次处理两种数据类型

Byteword

Byte8位正好可以存储在8位寄存器中。

Word16位的分为高位和低位,(AX为例)分别放入ALAH

2.2 8086cpu给出物理地址的方法

8086cpu20位的地址总线,可以选址1MB的存储单元,但是8086cpu16位结构,在内部一次性处理,传输,暂时存储为16位,那么其内部职能寻址64KB的存储单元

8086cpu采用一种内部用两个16位地址合并的方法来形成一个20位的物理地址

 

 

地址加法器采用 物理地址 =段地址(Segment)×16 +偏移地址(offset):cup访问内存是,用一个基础地址(段地址×16)和一个相对基础地址的偏移地址相加,最后得到物理地址。

比如:cup要访问12348H的内存地址,那么首先把段地址1230H ,和偏移地址0048H输入加法器。1230H×16=12300H,然后加上0048H = 12348H.

地址加法器的运算过程:

 

                       

一个X制进的数据左移一位,相对于乘以X.

段地址:把若干连续的地址看做是一个段,比如:10000H~100FFH。注意段地址的宽度是16位,所 以最大的寻址地址64K

物理地址   段地址     偏移地址

21F60H     2000H       1F60H

           2100H       0F69H

结论:一个物理地址可以由不同的偏移地址和段地址构成;

SA = SA×16 + OA;

 

2.3段寄存器

上面运算器,在获得段地址和偏移地址的时候是由其它的部件提供的,那么是由那个部件提供的呢?cup里面有段寄存器(CS,DS,SS,ES);

一个重要的cs+ip cs为代码段寄存器,存放要访问代码段的段地址。Ip为指令指针寄存器。他们指示了cup当前要读取指令的偏移地址,在cup加点启动或复位后(cpu刚开始工作的时候)csip被指示为:FFFFH,ip被指示为:0000Hcup在刚启动时,cup从内存FFF0H单元里面读取指令执行。FFF0H单元是cpu执行的第一条指令。内存里面的数据cup有的是看作指令,有的是看作数据。都是二进制数据,那么cup什么时候看作指令,什么时候看作数据。我们可以说,cupcs:ip指向的内存单元里面数据看作指令,然后读取执行。如果说内存里面的那段信息被cup执行过,那么他们所在的内存必然被cs:ip指向过。

 

 

2.4修改cs,ip的指令 jmp

Jmp段地址:偏移地址来修改cupcs:ip的值

Jmp 2AE3:3执行后:cs=2AE3Hip=0003H cpu将从2AE3H处读取指令

如果只要修改ip

jmp某一个合法寄存器

Jmp ax等价于 jmp ip, ax;

 

2.5代码段

在内存中一段连续的地址,称为段。在这个段里面存放的都是指令。我们称之为代码段。如何让cup来执行这段的指令,就必须要cs:ip指向所定义的代码段中的第一个指令的首地址。

 

                   第三章 寄存器(内存访问)

从内存的角度分析几个寄存器

3.1  在内存中,都是字节单元,是一个字占用两个字节,所以在内存中使用两个内存单元来存储。

20H

4EH

12H

00H

 

                                                                                                                                  

 

 

 

 

 

4E20H这个字存储在0号单元,低字节存储在低位,高字节存储在高位

Cpu中有一个ds寄存器专门用来存放要访问的数据段的段地址(cs是专门用来访问代码段的段地址)。

Move ax,1000H //把数据段段地址放入 ax

Move ds,ax;   //再放入ds

Move al,[0]

这段代码就是把1000:0这个内存单元的数据读到al里面,反过来,如果要把al里面的数据读到内存里面去 move [0] ,al

Move既可以把内存数据直接放入寄存器,也可以把寄存器里面的数据放到另外一个寄存器里面。

[]表示内存单元的偏移地址Move al,[0] 会自动从ds中取段地址,然后加上0偏移地址,组后得到物理地址。

那么 为什么不直接把数据段段地址1000h直接放入ds呢,因为,ds是数据段寄存器,不能直接将数据1000H直接放入ds ,只能通过通用寄存器来做中转。

3.2堆栈

偶尔我们把一段内存当作堆栈来使用,我们称之为栈段(一段连续的内存<=64KB)

Cup如何把一段内存当作栈段,cup如何从栈顶访问数据,栈顶单元是如何确定的。

这就要用到 SS:SP就好象CS:IP是访问代码段一样,任意时刻SS:SP都指向栈顶元素

push pop指令执行时,cpuSSSP中得到栈顶的地址。

push ax指令

1.sp = sp – 2 SS:SP指向新的栈顶。

2.ax里的数据放入堆栈。

这两部分,如果是pop ax正好是相反的,先是取出数据,然后修改sp

 

 

Cpu入栈时,栈顶地址从高地址向高地址方向增长。

Pushpop可以在访问的内存单元和寄存器之间传送数据,于move不同的是,push要访问的内存单元地址不是在指令中给出,而是由ES:SP指出。同时还要改变sp的值。

 

第一个汇编程序

(1)        标号:汇编源程序中,除了汇编指令和伪指令之外,还有一些标号如:codesg。一个标号指代一个地址比如codesgsegment前面作为一个段的名称。这个段的名称最终将编译、连接程序处理成一个段的段地址。

assume cs:abc //abc当作代码段来使用

abc segement

move ax,2;

adb ends //段结束标志

end  //程序结束标志

(2)        程序返回

一个程序结束,将把cup的控制权给使这个程序得以运行的程序。使之继续执行。这个过程就是程序返回

move ax,4c00H;

int 21H;

(2)loop

Lopp指令格式

Loop标号

Cup执行loop指令时需要做两件事

a.cx =cx -1

b.判断cx是否为0不为0转到标号处执行程序,如果为0继续执行;

00 01 10 11 100 101 110 111

10

010

011

实现程序 2*11

assume cs:code

code segment

    mov ax,2

    mov cx,11

    s: add ax,ax

    loop s

    mov ax,4c00h

    int 21h

 code ends

end

s:是一个标号,代表内存里面的一段指令。只要cx不为0则一直执行标号所在处内存里面的指令。既add ax,ax