码迷,mamicode.com
首页 > 编程语言 > 详细

汇编语言 王爽

时间:2015-02-28 22:53:18      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

汇编语言

王爽

 

目录

汇编语言... 1

王爽... 1

第一章:基础知识

第二章:寄存器

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

第四章 第一个程序

第六章  包含多个段的程序

第七章 更灵活定位内存的方法

第八章 数据处理的两个基本问题

 

 

 

 

第一章:基础知识

 

汇编语言:汇编语言是什么?为什么学习汇编语言?学习汇编语言是学习什么?

 

                  早起使用机器语言,但机器语言 晦涩难懂也难以使用,所以出现了汇编语言。即用通熟易懂的汇编指令替代全是二进制0和1的机器指令。

于是也就出现了编译器,即把汇编指令翻译成机器指令。

机器指令和汇编指令都不能脱离具体的硬件设计和内部结构,没有可移植性故而又产生了高级语言。

 

汇编语言发展至今,由一下3类指令组成。

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

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

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

 

汇编语言的核心即汇编指令,它也决定了汇编语言的特性

 

 

 

 

 

 

 

何为CPU 即 指令和数据的处理!

 

指令和数据存储的地方 即内存

 

CPU来完成具体指令和数据的动作,那么存取就要和内存交互

1、  存储单元的地址(地址信息)

2、  器件的选择、读或写的命令 (控制信息)

3、  读或写的数据(数据信息)

 

 

地址总线: 决定寻址能力

数据总线:决定一次传输的数据位数

控制总线:决定了CPU对外部器件提供了多少种控制 即CPU对外部器件的控制能力

 

 

 

 

 

一句话:CPU为具体外部器件分配对应内存地址空间并通过各种控制器(接口卡)对其进行控制。

 

8086地址总线宽度为20,(0~220)即内存地址空间为1MB

80386地址总线款第为32, (0~232)内存地址空间为4GB

 

大B 小 b ,默认一个内存空间大小为1BYTE = 8bit  即字节和位的区别

为什么一个内存单元是8位? 看计算机组成原理吧

 

 

 

第二章:寄存器

 

 

一个典型的CPU由运算器 寄存器 和控制器组成;运算器进行运算,寄存器负责存储,控制器控制各个器件进行工作;内部总线负责连接各个器件在他们之间传递数据。

         对于一个程序员来讲,CPU主要器件是寄存器,我们通过改变各种寄存器中的内容来现实对CPU的控制。

         8086CPU有14个寄存器:AX BX CX DX

                                                           CS DS SS ES

                                                           SI DI SP BP IP PSW

 

 

CPU如何寻址内存?

 

 

 

 

20位地址线  16位宽寄存器

8086采用 物理地址 = 段地址X16  + 偏移地址 的方式

由地址加法器完成

 

“段地址X 16 + 偏移地址 = 物理地址” 的本质含义是: CPU在访问内存时 用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加 给出内存单元的物理地址

 

注意: 分不分段  段的大小  代码段 数据段 堆栈段 。。。和内存绝无关系 内存只是内存

       一切只是CPU如何根据我们的安排操作而已

 

 

段地址自然由四个段寄存器提供    CS DS ES SS

 

CS 和IP 

                   CS为代码段寄存器 IP 为指令指针寄存器 CS:IP 指向的内容当作当前指令执行

 

CS:IP指令段寄存器

MOV 传送指令

JMP  转移指令 能够修改CS IP内容的指令被统称为转移指令

 

jmp 段地址:偏移地址

Jmp 某一合法寄存器  : 用寄存器中的值修改IP

 

 

Jmp 2AE3:3  执行后: CS=2AE3H  IP=0003H

Jmp ax,       执行前: ax=1000H  CS=2000H IP=0003H

                             执行后: ax=1000H    CS=2000H IP=1000H

 

第二章从CPU如何执行指令的角度讲解了8086CPU的逻辑结构、形成物理地址的方法、相关的寄存器以及一些指令。

 

 

关于DEBUG实验

         1、R   查看 改变寄存器内容  -r, r ax

         2、D   查看 内存中内容      d 1000:0  (指定地址开始的128个内存单元)

                                                                           使用d之后 可以继续d

                                                                     d  1000:0 10

         3、E    修改内存的内容      e 1000:0 0 1 2 3 4 5 6 7 8 9

         4、U         查看机器码对应汇编指令

         5、T    执行一条或多条指令

6、A    以汇编指令形式在内存中写入机器码

 

   

 

实验一:

查看、修改CPU中寄存器的内容: R指令

查看内存中的内容: D 命令

修改内存中的内容: E 命令(可以写入数据、指令,在内存中他们实际没有区别)

将内存中的内容解释为机器指令和对应的汇编指令:U命令

执行CS:IP指向的内存单元处的指令: T 指令

以汇编形式向内存中写入指令: A指令

 

 

 

 

 

 

 

 

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

 

字节单元

字单元

 

 

 

DS和[address]

 

DS 通常用来存放要访问数据的段地址

Mov bx,1000H

Mov ds,bx

Mov al,[0]

[…]  表示一个内存单元  数据表示内存单元的偏移地址  自动取DS为段地址

 

思考: 写几条指令 ,将al 数据传送到内存单元10000H处

 

即: Mov al,[0]    mov [0],al

MOV 内存单元地址,寄存器名

 

目前为止:

MOV 寄存器,数据

MOV 寄存器,寄存器

MOV 寄存器,内存单元---MOV 段寄存器,内存单元

MOV 内存单元,寄存器---MOV 内存单元,段寄存器

MOV 段寄存器,寄存器—MOV 寄存器,段寄存器

 

 

 

第三章从内存访问角度学习寄存器

 

 

 

字单元   N地址字单元

 

8086CPU 不支持将数据直接送入段寄存器的操作 只好用一个寄存器中转

这属于硬件设计的问题,不必深究

Mov bx,1000H

Mov ds,bx

 

栈 是一种具有特殊的访问方式的存储空间,其特殊性在于,最后进入这个空间的数据最先出去。

LIFO  Last In First Out  后进先出

入栈 出栈

 

CPU提供栈机制

于是我们可以把一段内存当作栈来使用

最基本的两个指令即 PUSH(入栈) POP(出栈)

 

相应的 提供两个寄存器 段寄存器SS 和 寄存器SP

栈顶的段地址放在SS中  任意时刻,SS:SP指向栈顶元素

PUSH 和POP 是 CPU从SS:SP中得到栈顶的地址

 

 

 

 

 入栈时 栈顶从高地址到底地址方向增长

 

SS:SP指向栈空间最高地址单元的下一个单元

 

 

 

 

         CPU对栈的操作是否越界不负责任

 

 

Push 寄存器

Pop 寄存器

 

    栈也是内存一部分 

       自然有    

PUPSH 内存单元

       POP内存单元

 

     PUSH 段寄存器

    POP  段寄存器

 

 

改变SP后 写入内存

读内存后 改变SP

 

 

 

 

 

 

 

 

 

                                            

 

 

 

 

 

 

 

 

 

[1]

 

 

 

 

 

第四章 第一个程序

 

1、  编辑  预处理  编译 链接 执行(载入内存)

 

伪指令格式:

XXX segment

 

XXX ends

 

end   汇编程序的结束标记

 

assume  “假设” 某些情况下可以将段寄存器和某一段关联

 

DOS程序加载过程

 

 

 

 

学习汇编的目的就是通过汇编语言进行编程而深入理解计算机底层的基本工作机理,进而随心所欲的控制计算机。

 

 

 

 

 

 

第五章 [bx] 和loop

 

                           1、[bx]  和[0]类似   段地址也都在ds中

                               2、loop 循环

                               3、定义描述性符号”()” 

                                             (ax) 表示ax中的内容

 

 

 

 

 

4、  约定idata 表示常量

 

@来个[bx] 有啥意思呢???

 

Loop指令执行过程

1、(cx)=(cx)-1

2、判断cx值 不为0则转至标号处执行,为0 向下执行

 

 

考虑这样一个问题: 计算ffff:0006单元中的数乘以3,结果存到dx中.

 

 

Debug 和masm 处理mov a1,[0]方式不同

 

 

 

 

段前缀

 

 

 

 

第六章  包含多个段的程序

 

 

 

 

 

第七章 更灵活定位内存的方法

 

 

 

 

 

第八章 数据处理的两个基本问题

 

 

 

 

 

 

 

 

 

 

 

 

 

第九章 转移指令的原理

 

 

 

段内转移

段间转移

 

短转移

近转移

 

 

 

 



[1]

汇编语言 王爽

标签:

原文地址:http://www.cnblogs.com/wangxiaoer/p/4306290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!