汇编语言大灰狼DOC.docx

上传人:b****0 文档编号:712952 上传时间:2022-10-12 格式:DOCX 页数:22 大小:979.58KB
下载 相关 举报
汇编语言大灰狼DOC.docx_第1页
第1页 / 共22页
汇编语言大灰狼DOC.docx_第2页
第2页 / 共22页
汇编语言大灰狼DOC.docx_第3页
第3页 / 共22页
汇编语言大灰狼DOC.docx_第4页
第4页 / 共22页
汇编语言大灰狼DOC.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

汇编语言大灰狼DOC.docx

《汇编语言大灰狼DOC.docx》由会员分享,可在线阅读,更多相关《汇编语言大灰狼DOC.docx(22页珍藏版)》请在冰豆网上搜索。

汇编语言大灰狼DOC.docx

汇编语言大灰狼DOC

CPU的结构

CPU对设备的读写

1、程序是如何运行的?

·双击程序应用程序载入内存CPU找到应用程序在内存中的位置通过某种途径把程序传送给CPU

CPU通过一些很细的线与外围设备进行通讯,这些线叫做总线

CPU与内存通信的线叫做地址总线(通过这里将应用程序在内存中的位置的地址传递给CPU)

在找到应用程序在内存中的位置之后呢,还得想办法把应用程序的内容传递给CPU,这个途径成为数据总线

与CPU连接的除了地址总线和数据总线之外,还有一个是控制总线,即:

CPU用来控制外围设备的(如硬盘、光驱、声卡等)

2、CPU是如何传输数据的?

CPU运行起来时0101的数据,这些线只能传输两种信号,即0和1信号,高低电平分别是1和0信号。

8086CPU有20条地址总线,从CPU连到内存,则CPU的最大寻址范围就是2

=1024KB=1MB,即8086最大寻址范围是1MB

假设CPU要到内存中找数据,则CPU要把应用程序的地址传送给内存,然后内存通过地址找到相应的数据,再通过数据总线把内容传输给CPU。

其中CPU中有一个内存控制器,它会根据CPU传递过来的地址找到相应的数据内容。

控制总线用来干什么呢?

有的时候CPU要读内容,有的时候要写内容,则是通过控制总线执行什么动作。

CPU就是通过这三种总线与外围设备通讯的。

3、总线的宽度

所谓总线的宽度就是指CPU有多少根线连接到内存当中,或者说地址总线的宽度决定了CPU的最大存储范围,也可以说CPU是多少位的就是多大的寻址范围。

比如说CPU是32位的话,最大的寻址范围就是2的32次方就是4G内存,所以即便你安装了8G的内存,另外4G是无法利用起来的。

2

=1MB

4、继续探讨CPU执行程序

当内存将数据送到CPU之后,是不是立即就开始执行程序呢?

不是的,CPU是先将程序的数据放入寄存器,然后再从寄存器里取出数据来执行

寄存器概念

5、那什么事寄存器?

它有什么作用?

答:

存放CPU要执行的数据或指令

寄存器分为:

通用寄存器和段寄存器

寄存器知识补充:

1数据寄存器(或称通用寄存器) 

数据寄存器包括AX,BX,CX,DX四个通用寄存器,他们可以以字16位的形式使用,也可以以字节8位的形式使用。

 

以字形式使用时四个通用寄存器称为AX,BX,CX,DX,以字节形式使用,高八位通用寄存器称AH,BH,CH,DH。

低八位称AL,BL,CL,DL。

 

这四个都是通用寄存器,又可用于专用的目的。

 

AX做累加器用(ACCUMALATOR)

BX在计算存储器地址时,经常用做基地址寄存器,所以又称基址寄存器。

(BASE) 

CX(COUNT)可用做通用寄存器。

此外,在循环( LOOP)和串处理指令中用做隐含的计数器。

 

DX(DATA)在做双字长的运算时,把DX和AX组合在一起存放I/O端口地址。

 

2,指针及变址寄存器 

他们包括SP,BP,SI,DI四个16位寄存器。

他们可以象数据寄存器一样在运算过程中存放操作数,单他们只能以字16位为单位使用。

 

SP(STACK POINTER)堆栈指针寄存器; 

用来指示堆栈的栈顶的偏移地址,与SS堆栈段寄存器形成栈顶存储单元的物理地址。

 

BP(BASE POINTER)基址指针寄存器。

 

用来指示堆栈中某个数据区的偏移地址-----基地址。

 

SI(SOURCE INDEX)源变址寄存器; 

DI(DESTINATION INDEX)目的变址寄存器; 

3,段寄存器 

包括CS,DS,SS,ES四个16位段寄存器 

CS(CODE SEGMENT)代码段寄存器 

SS(STACK SEGMENT)堆栈段寄存器 

DS(DATA SEGMENT)数据段寄存器 

ES(EXTRA SEGMENT)附加段寄存器 

8086/8088采用存储空间的分段技术来解决寻址1M字节的存储空间。

这些段寄存器的内容和有效的地址偏移量(称偏移地址)一起可确定内存的存储单元的物理地址。

CS控制程序区DS和ES控制数据区,SS控制堆栈区。

 

4控制寄存器 

分为两个16位的寄存器IP和PSW。

 

IP(INSTRUCTION POINTER)指令指针寄存器;他用来存放代码段中的偏移地址。

程序运行中始终指向下一条指令的首地址。

计算机就是用IP寄存器来控制指令序列的执行流程的 

PSW(PROGRAM STATUS WORD)程序状态字寄存器或称标志寄存器; 

由状态码标志和控制标志构成, 

OF溢出标志;运算结果超出机器能表示的数值范围称溢出OF=1,否则OF=0; 

SF符号标志;运算结果的符号为负时置1否则置0 

ZF;零标志 

CF进位标志 

AF辅助进位标志 

PF奇偶标志 

DF方向标志 DF=1每次操作后使SI和DI减量,使串处理指令向低地址方向进行 

IF中断标志 

TF跟踪标志 

控制标志是由系统程序或用户程序根据需要用指令来设置的。

AX寄存器(8086寄存器的一种.成为累加寄存器)

AX寄存器是通用寄存器,是专门用来存放数据的寄存器。

高8位成为AH,低8位成为AL。

它是如何组织数据的?

AX中有两个字节

字节:

用8个二进制数表示一个字节

字:

用两个字节表示一个字,即16位二进制数据

双字:

两个字表示,即32位二进制数

当然还有4字的。

CPU内部是由哪些部件构成的?

1、寄存器

2、运算器(+-*/)

3、控制器,控制各器件运行,发送一些命令(各个运算器做什么有这个决定)

4、内部总线连接各种器件,在它们之间进行数据传输

物理地址表示方法

8086主板地址线20根进行寻址必须一次传20位二进制数,但是CPU最大一次只能床16个二进制位,如何解决?

比如有两个小纸条,每张最低只能写三位数字,要求用这两张纸条来表示一个四位数字

CPU也是类似于这样进行处理的。

CPU用地址加法器完成这样的功能

如上图,234成为基地址,23成为偏移地址

CPU用基地址+偏移地址得到实际物理内存地址

内存地址的表示方法:

基地址:

偏移地址=实际内存地址

计算方法:

实际内存地址=基地址*16+便宜地址

解释:

我们人是基于十进制运算的,要想后面加一个0即加一位,所以用234*10然后加23,而8086计算机是基于16进制的,所以要乘以16然后加上偏移地址

具体例子:

1402:

100;

1402H*16(10进制,16基址的10H)+0100H=14120H

其中H表示16进制。

CPU如何对内存进行逻辑的分段处理

1000H转化为基地址:

偏移地址

1000H:

0000

寄存器分为公用寄存器和段寄存器,通用寄存器用来存放普通的数据,而段寄存器与这里的段地址是一个概念,就是存放基地址的。

段地址和偏移地址

CS和IP寄存器

主要内容:

CS、IP寄存器;debug命令的使用;内存访问

1、程序被载入内存后,CPU是从哪里开始执行程序代码的?

在C语言中main函数是第一个被执行的

那么在汇编语言中是从哪里开始的呢?

我们知道,段地址*16+偏移地址=实际物理地址

CS(codesegment)寄存器保存了要被CPU执行的代码的基地址

IP寄存器保存了要被CPU执行代码的偏移地址

IP寄存器别名为指令指针寄存器

也就是说:

CS*16+IP=实际地址

2、Debug工具

什么是debuge

Debug是DOS、Windows都提供的实模式程序调试工具可以查看CPU各种寄存器中的内容和机器码级跟踪程序的运行

Debug命令的使用

Debug的R命令用来查看和改变各个寄存器内容

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

屏幕上的内容有3部分:

左边显示的是用“基地址:

偏移地址”即“CS:

IP”的形式表示内存内容。

中间是用16进制的形式表示内存内容。

右边是由ASCII的形式表示内存内容

如果想查看某个寄存器的内容,可以在d的后面加相应的寄存器:

0000

然而用16进制表示的内容我们看不懂,如果希望用汇编语言显示,则可以用下面的命令

Debug的U命令将内存机器码转为汇编指令

下面用ucs:

0100表示查找cs寄存器

其中左边是基地址:

偏移地址。

中间是16进制表示的操作指令。

右边两行表示的是汇编指令

Debug的T命令跟踪代码运行

Debug的A命令以汇编指令格式在内存中写入指令

以上是把1234赋值给ax寄存器

验证:

CSIP指定的存地址中的内容就是CPU要执行的内容

第一步:

看一下CS中当前的内容

之后我们用T命令跟踪程序的执行

看出:

第一个cs=0B6FIP=0103即ES:

命令

第二个CS=0B6FIP=0108即JZ命令

第三个CS=0B6FIP=010A即CALL命令

通过相邻两个ip的差可以算出上一个指令所占用的空间是多大

下面看一个例子:

intnumber;

intmain(){

inta=10;

if(a>0)

a++;

return0;

}

程序分为:

数据段,,代码段,堆栈段

其中数据段用来存放应用程序的全局变量,如本例的intnumber

代码段:

if(a>0)a++;

堆栈段:

inta=10;局部变量

如果我们想为全局变量赋值,我们必须先找到其在内存中的地址

CPU根据什么指定内存中的哪些数据是我们定义的全局变量?

即DS寄存器(内存访问)

CPU是根据DS(DataSegment)这个寄存器和任意一个通用寄存器的值或其他数值组成数据段的物理地址如:

DS:

[0]或者DS:

[BX]

第一个表示方法是将一个内容直接保存在DS寄存器的一个地址中

第二种表示时将一个内容保存到另一个BX通用寄存器中

当然还有其他表示方式

上面两种方式表示的都是物理内存中具体的地址

因为全局变量保存在内存地址中,因此我们要访问这些物理地址

内存的表示方法:

在汇编语言中表示内存的两种写法

movds:

[13ABH],1234H

即把1234放入内存地址ds*16+13AB中

mov[13ABH],1234H

第二种更常见

堆栈

主要内容:

栈的概念ss寄存器和sp寄存器post和pop指令

栈的数据结构:

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

数据出栈:

在内存中栈是从高字节向低字节存放数据

堆栈段存放的是函数的局部变量,数据段存放的是全局变量

ss、sp寄存器

同代码段和数据段一样,CPU如何知道一段内存空间被当做栈使用?

Cpu是根据ss这个段寄存器和sp这个通用寄存器来感知堆栈段的存在。

也就是说,cpu从ss中取出一个值,再从sp中取出一个值,ss*16+sp所指向的那个内存单元即是栈内存

段寄存器ss存放栈的基地址,sp存放的是栈顶的偏移地址

执行入栈和出栈的时候,如何知道哪个单元是栈顶单元?

cpu规定,任何时候ss:

sp都指向站顶元素

push指令的执行过程:

如果ax=1234h。

即ax寄存器中存放的是1234这个16进制的数,现在想把它放入栈中,假设现在是空栈,ss:

sp指针指向栈顶,此时,将34压入栈低,12放到栈顶,即先放低字节的数,再放高字节的数,最后ss:

sp指针指向12

具体过程:

pushax

(1)将ax中的内容送入ss:

sp指向的内存单元处,ss:

sp此时指向新栈顶

(2)Sp=sp

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1