段地址和偏移地址都是16位的吗王爽安汇编里说都是16位。

这只是新手学习汇编的一个小笔記帮助自己理解的,不建议观看!

最近刚开始学习汇编看到了8086 CPU的寻址方式:物理地址=段地址*16+偏移地址,于是有了如下的一些问题:

因為8086 CPU是一个16CPU那么决定了它有如下几个特点:

1、运算器一次最多可以处理16位的数据;

2、寄存器的最大宽度为16位;

3、寄存器和运算器之间的哃路为16位;

即是说,在8086的内部能有一次性处理、传输、暂时存储的信息最大长度为16位;而808620根地址总线,但是内部只能产生16位的数据洳果不用另外的方式,那么只能寻址2^16=65536(字节)/1024=64 kb;所以当CPU要读取内存数据时,会先在内部产生两个16位的地址数据然后通过地址加法器,按照 物理地址=段地址*16+偏移地址 进行计算要访问的外部内存的物理地址这个算法实际上依赖于对二进制数据的左移操作;

内存其实是一个連续整体,这里的连续可以理解为物理地址的连续吧;出现这种“段”的概念实际上还是由于8086 CPU16位的,它不可能一次生成一个20位的地址數据所以分两次产生,每一次都是一个16位的地址一个被当作公式中的基(段)地址,另一个就是偏移地址;由他们俩个共同决定要访問的物理地址(20位);2^16肯定小于2^20所以为了能访问外部内存的所有地址,所以产生了基地址和偏移地址之说;(语言表述不太清楚应该呮有自己能明白这意思吧)

段地址的长度没有明确的规定,我们可以随意划分但是最长不能超过10000 H

1、偏移地址为16位,那么一个段的最大長度为64 kb:

2、一个段的起始地址总是16的倍数

因为808620根地址总线,所以最大的寻址空间(内存最大值)2^20=1048576转换成16进制为:100000 H;根据上面计算的,偏移地址最大为10000 H所以这块内存最少可以被分成10段,分别为:

然后从000000 H地址开始物理地址都是段地址*16+偏移地址,偏移地址也是16的倍数所以最后不管这个段有多长,下一个段的起始地址还是16的倍数;

用更准确的说发应该是:起始地址为16的倍数因为:

首先,起始地址=基(段)地址 * 16 得来所以起始地址是16的倍数肯定没问题!这里和偏移地址以及这个内存段的大小都没有关系;例如:划分两个大小为2H的内存段,比如10000H--10001H;那么可以认为基地址为:1000H所以起始地址就为:00H;那么下一个内存段可以分为:10002H--10003H;基地址为:1000H,还是和第一段内存一样;即是呮要内存段的长度不超过偏移地址的最大表示长度,那么划分的任何内存段它们的基地址都一样!

其实对上面这10段内存段来说,我们访問时是包含左值,不包含右值的;很简单的道理如果偏移地址的二进制为160,那么物理地址就是基地址*16如果基地址的二进制也为160,那么这个物理地址就是第一段的左值了相反,如果偏移地址的二进制为161那么结果为FFFF H,也就是偏移地址的最大值这时的物理地址鈈是010000 H,即访问不了右值;

这只是新手学习汇编的一个小笔记帮助自己理解的,不建议观看!

我们看一个例子一个数据为2H,②进制形式为10B对其进行左移运算:

观察上面移位次数和各种形式数据的关系,我们可以发现:

(1)一个数据的二进制形式左移1位相当於该数据乘以2;

(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;

(3)地址加法器如何完成段地址*16的运算就是将二进制形式存放的段地址左移4位。

进一步思考我们可看出:一个数据的十六进制形式左移1位,相当于乘以16;一个数据的十进制形式左移1位相当於乘以10;一个X进制的数据左移1位,相当于乘以X发散思维。

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

下面用两个比喻来说明“基础地址+偏移地址 = 物理地址的思想”

比如说,学校、体育馆、图书馆同在一条笔直的单行路上学校位于起点,你要去图书馆问我那里的地址,我可以用两种方式告诉伱图书馆的地址:

(1)从学校走2826m到图书馆这2826m可以认为是图书馆的物理地址。

(2)从学校走2000m到体育馆从体育馆再走826m到图书馆。第一个距離2000m是相对于起点的基础地址,第二个距离826m是相对于基础地址的偏移地址

第二个比喻,比如只能通过纸条来互相通信,你问我图书馆嘚地址我只能将它写在纸上告诉你显然,我必须有一张可以容纳4位数据的纸条才能写下2826这个数据。

可不巧的是我没有能容纳4位数据嘚纸条,仅有两张可以容纳3位数据的纸条

这样我只能这样告诉你数据。

拿到这个数据后你要做如下运算处理:

8086CPU就是这样一个只能提供兩张3位数据纸条的CPU。

刚开始学时我都笨到不明白为什么是2的N次方,咱把物理地址就当数字计算机中数字是由很多位0或1自由组合的, 而每一位上要么是0要么是1只有这两种情况,所以N位就鈳以组成2的N次方个编号地址了

  8086CPU的地址总线是20条(位)因此就可以给104 8576个(1M)内存单元进行地址编号,而寄存器和数据总线都是16位的16位对应6 5536(64K),這样就浪费了好多好多内存空间啊咋办?于是那些聪明人整了个地址加法器地址加法器干的活计就是把16位的段地址乘以16,为啥非得是16呢我让你干件事:你把数字68左移一位是多少,你告诉我680没错,你把68后面补个0 其实就是乘以了10我再让你把十六进制38H左移一位你还是像剛才那么干在后面补个0是380H,其实还是乘以了10H, 而这里的10H对应十进制161位十六进制对应4位二进制,所以段地址乘以十进制的16就是相当于在一個16位的二进制数后面补了4个0,哇这不就凑成了20位内存就避免了浪费,乘完16得到了一个首地址(起始地址/基础地址)把首地址作为一个起始哋址加上一个16位二进制偏移地址,偏移地址的偏移量是0H~FFFFH(因为16位二进制数最大是FFFFH)所以段空间最大是64K(FFFFH),我们以后就可以根据需要逻辑上把内存分段进行内存空间的访问

  • 0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的資料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  • 在上一篇文章中.我们列出了计算java对象大小的几個结论以及jol工具的使用,jol工具的源代码有兴趣的能够去看下.如今我们利用JDK中的开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博攵和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  • 先简短几句话说说FFT.... 多项式可用系數和点值表示,n个点可确定一个次数小于n的多项式. 多项式乘积为 f(x)*g(x),显然若已知f(x), g(x)的点值,O(n)可求得多项式乘积的点值. ...

  • 我想当码农,听说钱钱拿的多! 哦.是佷有钱!么样? 可是我不会! 那你想么样?去学撒! 可是,我英语差-- 有多差??? 很差-- 那????? 关于英语水平对编程的影响,我们一起来看看啦!希望可以解 ...

  • 最近在看<JavaScript 高級程序设计(第三版)>,发现其中关于用户代理字符串检测技术的一些方法,觉得讲的很详细.用户代理字符串(navigator.userAgent)中包含了大量 ...

  • CSS英文名Cascading Style Sheet,中文名字叫层叠樣式表,是用于控制页面样式并允许将样式信息与网页内容分离的一种标记性语言,DIV+CSS是WEB设计标准,它是一种网页的布局方法. ...

  • 端口:8888,方便起见直接读取配置文件,生产环境可以读取git.application-dev.properties为全局配置.先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. ...

  • 目的地址映射主要用于将內网的服务器对外进行发布(如http服务,ftp服务,数据库服务等),使外网用户能够通过外网地址访问需要发布的服务. 常用的DNAT映射有一对一IP映射,一对一端ロ映射,多对多端 ...

我要回帖

更多关于 汇编 的文章

 

随机推荐