汇编简单入门教程(一)基础知识、寄存器


 

 

参考:《汇编语言》 王爽  第一,二章

 

一、基础知识 

 

1. 用汇编语言编写程序的工作过程

汇编本质就是为了方便程序员,把二进制代码用汇编指令来表示

 

汇编指令---------------->  编译器  ---------------->机器码----------------> 计算机执行

mov ax, bx                                                          100010001

................                                                              ...............

 

2. 汇编语言的组成

汇编由下面3类指令组成

(1)汇编指令:如mov, add 等,有着对应的机器码.

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

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

 

 

3. 指令和数据

指令和数据,存在存储器中没有区别。比如同一段二进制1000100111011000

cpu可以把它看作指令 mov ax, bx  也可以看作数据 89D8H

 

 

4. 位,字节、字(word)、字长、存储单元

字节:由8位组成

字(word):计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,大小由cpu决定,如8086cpu就是16位即2个字节。

字长:就是字的长度。

存储单元:存储器被划分成若干个存储单元,大小为8位即一个字节。如内存最小单元就是一个字节,[0]中就是一个字节。

 

5.CPU总线

外部总线

    地址总线:决定CPU的寻址能力。8086CPU有20根地址总线寻址能力是2^20即1MB。

    数据总线:决定CPU与其他器件(如内存,显卡)进行数据传输的传输量。8086CPU有16根地址总线(就是字长)。

    控制总线:决定CPU对系统中其他器件(如内存,显卡)的控制能力。

 

6. 地址空间

 

    电脑由很多器件组成。如内存条,网卡,显卡。他们都有内存的。它们都与cpu总线相连。CPU对它们进行读或写的时候都是通过控制线发出内存读写命令。也就是说CPU在操 控它们的时候,把它们都当作内存看待,把它们总的当作一个由若干存储单元组成的逻辑存储器,这个存储器就是内存地址空间(就是说CPU的地址空间,不仅仅是内存条的内存,而是电脑上所有的存储器)

如:

00000~9FFFF  主存地址空间(内存条)

9FFFF~A0000 显存地址空间

C0000~FFFFF 各类ROM地址空间(如主板BIOS,显卡BIOS)

 

二、寄存器

 

前面讲的总线都是对cpu外部来讲的外部总线。cpu 的运算器、控制器、寄存器都是靠内部总线相连的

 

运算器:进行信息的处理

存储器:进行信息存储

控制器:控制各个器件进行各种

 

对于汇编程序来说,CPU中主要的部件是寄存器。

 

如8086CPU有14个寄存器:

ax, bx, cx, dx, si, di, sp, bp, ip, cs, ss, ds, es ,psw

ax,bx,cx,dx, 用来存放一般数据。大小是16位即2个字节

cs是代码段地址寄存器

ip是指令指针寄存器,存放偏移地址

ds是数据段寄存器


1.通用寄存器

ax,bx,cx,dx, 用来存放一般数据。大小是16位即2个字节

8086CPU为了兼容上一代的8位CPU,ax,bx,cx,dx都可以分成两个独立的寄存器

AX 可分为 AH (AX的高8位)和 AL(AX低8位)

同理BX 可分为 BH 和BL 、CX 可分为CH 和 CL 、DX可分为DH和AL

 

2.几条汇编指令

mov ax, 18    ax=0018H

mov ah, 78     ah=0078H

add ax, 8        ax = ax+008H

mov ax, bx      ax = bx

add ax, bx  ax = ax + bx


3. 8086CPU给出物理地址的方法

8086CPU地址总线有20根,而8086是16位的CPU,只能一次性处理传输和暂时存储16位。

8086CPU采用了用两个16位地址合成一个20位物理地址的方法就是:

物理地址 = 段地址 * 16 + 偏移地址 

 

 

4. 段寄存器

8086CPU 有4个段寄存器 CS、DS、SS、ES

(1)cs和ip

 

cs是代码段地址寄存器

 

ip是指令指针寄存器,存放偏移地址

 

不能用 mov cs, 1000H mov ip, 0 来修改段寄存器

 

要用jmp指令如

jmp  2AE3:3  把cs改成2AE3H   把ip改成003H

 

如果只想改ip用如下指令

jmp  0 或者jmp ax 

 

特别注意: cs=0001H ip=0000H

                 与 cs=0000H  ip=00010H 是同一个地址 ,因为 物理地址 = 段地址 * 16 + 偏移地址相同。不要以为cs不同物理地址就不同。

                    

可以通过《汇编语言》 王爽 的实验一来了解寄存器的工作

 

 

 

 

 

 

 

  • mask

    评论: 赞赞赞

    2017-09-30 18:53:22          回复

  • hero

    评论: hao

    2017-08-20 19:45:54          回复

  • xubiao

    @cyrus: cool

    评论: 作者是大神啊

    2017-06-28 15:46:15          回复

  • codergeek

    评论: 文章讲解的很清晰

    2016-05-03 10:22:16          回复

  • cyrus

    评论: cool

    2015-09-17 16:50:47          回复