我是靠谱客的博主 动人雪糕,最近开发中收集的这篇文章主要介绍内存地址空间02,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一个CPU的地址线宽度为10(2的10次方),那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。
主板:主板上有核心器件和一些主要器件,(CPU,内存)
接口卡:CPU对外部设备不能直接控制,如显示器、音箱、打印机等。直接控制这些设备进行工作的是插在扩展槽上的接口卡。()
各类存储器芯片
随机存储器(RAM):内存就是一个RAM,断电后数据会遗失
只读存储器(ROM):
装有BIOS的ROM
BIOS:Basi Input/output System,基本输入输出系统。
BIOS是由主板和各类接口卡(如:显卡、网卡等)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。在主板和某些接口卡上插有存储相应BIOS的ROM
--
CPU将一些存储器看做一个整体,这些存储器包括:主存储器地址、显存存储器、显卡BIOSROM、网卡BIOS ROM,系统BISO ROM;CPU将这些存储器地址分配:如:0~7FFFH的32KB空间为主随机存储器的地址空间;地址8000H~9FFFH的8KB空间为显存地址空间;A000H~FFFFH的24KB空间为BIOS ROM地址空间。
不同的计算机地址空间分配时不同的。
8086PC机的内存地址空间分配:00000~9FFFF是主存储器地址空间(RAM);A0000~BFFFF是显存地址空间;C0000~FFFFF各类ROM地址空间。
----
最终运行程序的是CPU,必须要从CPU角度考虑问题。
对CPU来讲,系统中的所有存储器中的存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是内存地址空间。
-----
CPU概述
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
内部总线实现CPU内部各个器件之间的联系。
外部总线实现CPU和主板上其它器件的连接
寄存器(CPU内部的存储器芯片)
8086CPU有14个寄存器它们名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
8086CPU所有的寄存器都是16位的,可以存放两个字节。
AX、BX、CX、DX一般用来存放一般性数据被称为通用寄存器。
AX的逻辑结构
15/14、13/12/11/10/9/8/7/6/5/4/3/2/1/0(16位)
一个16位数据在寄存器中的存放情况
数据:18
二进制:10010
在寄存器AX中的存储:000000000010010;
通用寄存器:8086上一代CPU中的寄存器都是8位的;为保证兼容性,这个寄存器都可以分为两个独立的8位寄存器使用。
AX可以分为AH寄存器和AL寄存器(H为高,L为低)
BX可以分为BH和BL
CX可以分为CH和CL
DX可以分为DH和DL
-------
字在寄存器中的存储
一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存储的高8位的寄存器,低8位的寄存器。
几条汇编指令:
汇编指令不区分大小写
mov ax,18 将18送入AX(寄存器) AX=18
mov ah,78 将78送入AH AH=78
add ax,8 将寄存器AX中的数值加上8 AX=AX+8=26;
mov ax,bx 将寄存器BX中的数据送入到寄存器AX AX=BX
add ax,bx 将AX,BX中的内容相加,结果存在AX中 AX=AX+BX
注:这里一般都将后面值放入到前面的寄存器,相当于赋值,
CPU执行下表中的程序段的每条指令后,对寄存器中的数据进行改变:
(原AX中的值,0000H, 原BX中的值,0000H)
程序段中的指令 指令执行后AX的数据 指令执行后BX中的数据
mov ax,4E20H 4E20H 0000H
add ax,1406H 6226H 0000H
mov bx,2000H 6226H 2000H
add ax,bx 8226H 2000H
mov bx,ax 8226H 8226H
add ax,bx 1044CH 8226H
注:1044CH超过十六位为将1去掉;CPU如何将1放在哪,寄存器中只能是044CH;这里的丢失,指的是进位制不能再8位寄存器中保存,但是CPU不是真的丢弃这个进位值。
-------------
物理地址
CPU访问内存单元时需要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。()
16位结构的CPU具有的特征:
1)、运算器一次最多可以处理16位的数据
2)、寄存器的最大宽度为16位
3)、寄存器和运算器之间的通路是16位的
8086有20位地址总线,可传送20位地址,寻址能力为1M。(2^20)
8086内部16位结构,它只能传送16位的地址,表现出寻址能力却只有64KB。(2^16)
问:8086CPU采用一种内部用两个16位地址合成的方法来形成一个20位的物理地址。
是用段地址+偏移地址;16位段地址+16位偏移地址 通过地址加法器合成一个20位物理地址;
-----------、
8086CPU读写内存时,发生的一些事:
1、CPU中的相关部件提供两个16位地址,一个称为段地址,另一个称为偏移地址。
2、段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
3、地址加法器将两个16位地址合并成一个20的地址
地址加法器工作原理
物理地址=段地址*16+偏移地址,段地址*16也就是段地址向左移动1位。段地址*16有一个更为常用的说法就是数据左移4位(二进制)。
1、一个数据的二进制左移N位,相当于该数据乘以N位
------------
段地址*16(基础地址)+偏移地址=物理地址;例如:需要2826这个数字,但一张纸只能容纳3位数,所以需要两张纸才能完成,一张作为基础地址,一张作为偏移地址。
段的概念:
内存并没有段,段的划分来自于CPU,由于8086CPU用"段地址*16+偏移=物理地址“的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址*16点位端的起始地址(基础地址),用偏移地址点位段中的内存单元。
段的起始地址也一定是16倍,偏移地址为16位,16位地址寻址能力为64K,所以一个段的长度最大为64K。CPU访问内存单元时,必须向内存提供内存单元的物理地址。CPU可以用不同的段地址和偏移地址形成同一个物理地址。
------------
数据在21F60H内存单元中。对于8086PC机有两种描述:
1、数据存在2000:1F60单元中。2000是段地址*16(段地址是16位进制),向左移动一位,变为20000,然后加上1F60就等于21F60H。
2、数据存在内存的2000段中的1F60H单元中。(课程10未开始)
--------------
段寄存器
段寄存器是提供段地址的,
8086CPU有4个段寄存器:
CS(Code )、DS、SS、ES
当8086CPU需要访问内存时,由这4个段寄存器提供内存地址。
CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前需要读取指令的地址。
CS为代码段寄存器
IP为指令指针寄存器
--------
8086PC工作过程:
1、从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器
2、IP=IP+所读取指令的长度,从而指向下一条指令
3、执行指令。转到步骤1,重复这个过程。
CS:IP代表的是读取一个内存单元的物理地址;2000:0000,代表一个内存物理地址20000开始,内存单元包含20000,20001,20003;
在8086CPU加电或复位后,CS和IP被设置为CS=FFFFH,IP=0000H。
即在8086PC机启动时,CPU内存FFFFOH单元中读取指令执行。
FFFFOH单元中的指令是8086CPU机开机中执行的第一条指令
在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。
------------
修改CS、IP的指令
程序员可以通过改变寄存器中的内容实现对CPU的控制。
mov ax,123
mov指令可以改变8086CPU大部分寄存器的值,被称为传送指令。
mov 指令不能用于设置CS、IP的值,它是用转移指令改变CS、IP;
同时修改CS、IP的内容利用jmp:
jmp 段地址:偏移地址
jmp 2AE3:3 告诉cpu执行2AE33;
jmp 3:0B46 3是0003,
进修改IP的内容:
jmp 某一合法寄存器
jmp ax
jmp bx
CPU只认被CS:IP指向的内存单元中的内容为指令。
将CS:IP指向代码段的第一个指令,代码段可以被看做一个方法。也就是指向方法中第一行代码的地址。
----------------------
利用Debug查看CPU和内存(cmd 进入debug窗口)(window10是不能利用,自己用的是32win7,是10年的机器)
上机实验:
R命令查看、改变CPU寄存器的内容
D命令查看内存中的内容
E命令改写内存中的内容
U命令将内存中的机器指令翻译成汇编指令
T命令执行一条机器指令
A命令以汇编指令的格式在内存中写入一条机器指令
----
-r可以查看CPU当前寄存器的内容
AX=0000 BX=0000 CX=0000 DX=0000 ....CS=144E IP=0100 .....
----------
修改ax寄存器的
-r ax
显示:AX 0000
:1111
-r 查看寄存器,ax变成1111
-----------
-d 查看内存存储情况
-------
使用a命令向内存中写入内容,利用汇编命令向内存写内容
-a
144E:0100 mov ax,4e20 (144E:0100是内存单元开始的地址,往内存存入mov ax,4e20指令),利用-t命令执行指令,指令的地址是由CS:IP决定,要执行命令前,要设置cs:ip,这里指令开始的位置是144e:0100;(它们是寄存器,-r cs修改cs寄存器的段地址,-r ip偏移地址)
..........
添加完内存,利用-d 144E:0100查看内存,是否写入了
利用-u 144E:0100命令查看写入内存的汇编语句
执行上面的语句,利用CS:IP;向内存中写入指令数据,需要改变CS:IP执行内存的单元位置;这里的CS:IP 的段地址和偏移地址就是144E:0100,利用t命令执行
------------
-e B810:0000 01 01 02 02 03 03 04 04; 向显卡写入内容,会在显示界面显示笑脸;B810:0000是显卡内存物理地址

转载于:https://www.cnblogs.com/lazyli/p/10923909.html

最后

以上就是动人雪糕为你收集整理的内存地址空间02的全部内容,希望文章能够帮你解决内存地址空间02所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部