精华内容
下载资源
问答
  • 1.bx(偏移地址存放在bx寄存器中) bx表示偏移地址偏移的大小,[bx]表示偏移地址内的存储数据 在debug中可以直接用[ ]表示,masm需要用bx表示 mov ax, [bx] mov ah, [bx] mov al, [bx] 三者不一样,前面寄存器的...

    bx(偏移地址存放在bx寄存器中)
    bx表示偏移地址,偏移的大小,[bx]表示偏移地址内的存储数据
    debug中可以直接用[ ]表示,masm需要用bx表示,例如在汇编源程序中:mov ax,[0] 会被编译器当作 mov ax, 0 处理
    在这里插入图片描述
    举例:
    mov ax, 0ffffh
    mov ds, ax
    用法1:
    mov bx, 0
    mov ax, [bx] //送入ax寄存器中的是字型数据
    mov bx, 1
    mov ah, [bx] //送入ah寄存器中的是字节型数据
    mov bx, 2
    mov al, [bx] //送入al寄存器中的是字节型数据
    用法2:
    mov ax, ds:[0]
    mov ah, ds:[1]
    mov al, ds:[2]
    用法3:
    mov bx, 0
    mov ax, ds:[bx]
    ……

    三者不一样,前面寄存器的类型决定了寄存器如何存储偏移地址bx中的数据
    一个内存单元8bit,ax存储16bit,ah和al分别存储8bit

    展开全文
  • 偏移地址的求取

    2019-04-17 18:43:00
    有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻址到此单元,则SA 应满足的条件是? 段地址*10H +偏移地址 = 物理地址,次10H为16进制的数据,则段地址=(物理地址-偏移地址)/10H 则最大值...

    有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻址到此单元,则SA 应满足的条件是?

    段地址*10H +偏移地址 = 物理地址,次10H为16进制的数据,则段地址=(物理地址-偏移地址)/10H

    则最大值为2000H

    因为题目要求是要物理地址最终为20000H。

    我们知道偏移地址最小为0H,最大为FFF0H(此处不为FFFFH的原因是要求(物理地址-偏移地址)这个数要能被10H整除)

    转载于:https://www.cnblogs.com/billcharint/p/10725451.html

    展开全文
  • 地址偏移地址

    2021-02-03 20:30:11
    cpu和内存之间通过20条地址总线相连接,地址总线就是cpu通过地址找到对应的内存的物理数据的传递工具 计算机只能处理0,1 二进制数据 每一条线可以处理 0,1 两种类型数据 所以20根线的 总共能拥有 2^20=1048576...

    首先必须明白 cpu和内存的区别

    cpu 中央处理器 内存是物理数据存放的地方

    cpu不直接存放数据而是通过内存来存放数据

    cpu和内存之间通过20条地址总线相连接,地址总线就是cpu通过地址找到对应的内存的物理数据的传递工具

    计算机只能处理0,1 二进制数据

    每一条线可以处理 0,1 两种类型数据

    所以20根线的 总共能拥有 2^20=1048576个不相同的地址 也就是能搜索 1048576个地址范围内的内存

    那么 一个地址代表一个存储单元 一个存储单元能够存储 1byte数据

    那么也就是1048576个地址 能够找到 1048576个1byte数据=1M的数据

    就是说 20位地址总线总共也就能处理1M的内存 数据

     

    然后cpu的寻址能力只能16位不能达到20位 怎么处理了

    cpu的地址都是使用16进制表示

    最多也只能找到 2的16次方 个地址 也就是65536个地址 只能处理 也就是只能处理 64K的内存数据  64K内存的电脑能用???
    这里就提出了段的概念 将1G的数据划分为 n个段 每一个段 是64K

    64K也就是65536个地址   16位的寻址就能找到了这65536个地址了  难道每个64K的 相同的位置的地址都有同一个    但是有n个64MK歇菜了 还是找不到

    真正的那个地址啊  

    如果在加入一个地址了??? 这个地址用来处理n个 这个地址就是段地址

    每一个段也就是每一个64K就是一个基地址  段内的数据的地址就是当前基地址的偏移地址

    此时 段地址+偏移地址就能够找到真正的内存数据了

    cpu表示的地址为:基地址:偏移地址 (2个16位的地址 2byte)

     

    而偏移地址相当于在首地址的基础上 移动的距离

     

    比如 0BAC:0100

    0BAC是基地址,0100是偏移地址

    0BAC 4位的十六进制 表示 16位的2进制数据 转换后为:

    0000 1011 1010 1100   

    必须要转换成 20位(也就是5位的16进制) 才能在20位地址总线中传递 才能达到 1G的数据访问范围

    怎么转换成 20位 能让数据传递到内存中找到物理数据了

    内存的物理地址 =基地址*16+偏移地址

    内存的物理地址 =0BAC*16+0100=0BAC0+0100=0BBC0H

    0BBC0 就是5位的十六进制  就是 4*5=20位了 可以传递到内存了

    实际传递二进制就是:

    0000 1011 1011 1100 0000

    20根地址总线就能处理了

     

     

    32位汇编 32根地址总线 总共能够直接 就找到  2的32次方个地址 也就是4294967296 byte数据 也就是 4G的内存

    而且不在将内存分成一段一段 所有的内存区域都是连续的

    展开全文
  • 地址偏移地址

    万次阅读 多人点赞 2012-12-29 13:06:37
    8086:关于物理地址=段地址*16+偏移 首先我们知道8086中段地址是从能被10H整除的地址开始的,即地址最后一位都是0(16进制表示)。这样设计CPU时就没有必要表示这个最后一个0了。例如FFFF[0]H,这个地址,假设...

    8086:关于物理地址=段地址*16+偏移

    首先我们知道8086中段地址是从能被10H整除的地址开始的,即地址最后一位都是0(16进制表示)。这样在设计CPU时就没有必要表示这个最后一个0了。例如FFFF[0]H,这个地址,假设段地址是FFFFH,那么它的偏移地址就是0000H了。 因为CPU在设计时去掉了一个16进制的0,所以要乘以10H(十进制的16)。

    8086CPU有20位地址总线,这个总线是指的外部总线(也就是CPU与内存交换数据时的总线的宽度),可以传送20位的地址,达到1M的寻址能力。

    8086CPU又是16位的结构,在内部一次处理,暂时存储,传输的地址为16位,这里的16位指的是CPU内部总线(也就是CPU内各个寄存器直接传送数据时的总线宽度)。

    所以如果从CPU内部直接发送数据只能送出16位的地址,表现出的寻址能力只有64KB(小于前面说的1M)。为了解决这个问题,8086CPU在内部采用两个16位的地址(一个是段地址,一个是偏移地址)合成一个20位的地址。所以合成的方法就是:段地址*16+偏移=物理地址。

    段地址*16的意思是:让段地址左移4位,比如2000H左移4位,成为20000H。再加上一个16位的偏移地址。这样就是20位的物理地地址了。

    实模式与保护模式

    16位实模式下,一个物理地址由段地址和偏移地址两部分组成,段地址在16位段寄存器中,然后在指令中用16位偏移地址寻址。物理地址=段地址*0x10+偏移地址

    ------关于“实模式与保护模式”定义的相关内容,参看:http://www.cppblog.com/mydriverc/articles/30719.html

    ----对于8086/8088来说计算实际地址是用绝对地址对1M求模。8086的地址线的物理结构:20根,也就是它可以物理寻址的内存范围为2^20个字节,即1 M空间,但由于8086/8088所使用的寄存器都是16,能够表示的地址范围只有0-64K,这和1M地址空间来比较也太小了,所以为了在8086/8088下能够访问1M内存,Intel采取了分段寻址的模式:16位段基地址:16位偏移EA。其绝对地址计算方法为:16位基地址左移4位+16位偏移=20位地址。

    ----如果访问100000h~10FFEFh之间的内存(大于1M空间),则必须有第21根地址线来参与寻址(8086/8088没有)。因此,当程序员给出超过1M(100000H-10FFEFH)的地址时,因为逻辑上正常,系统并不认为其访问越界而产生异常,而是自动从0开始计算,也就是说系统计算实际地址的时候是按照对1M求模的方式进行的,这种技术被称为wrap-around

    -----在80286以及更高系列的PC中,即使A20 Gate被打开,在实模式下所能够访问的内存最大也只能为10FFEFH,尽管它们的地址总线所能够访问的能力都大大超过这个限制。为了能够访问10FFEFH以上的内存,则必须进入保护模式

    32位保护模式下,问题变复杂了。首先要明白,保护模式保护什么?保护的是:分清楚各个程序使用的存储区域,不允许随便跨界访问。然后,怎么保护?方式是:为内存里的每段地址空间定义一些安全上的属性,比如可以被多少优先级的代码写入,是不是允许执行等。这个时候,段寄存器远远不能满足要求了。原因有二:段寄存器只有32位,保存不了这么多信息;段寄存器个数有限,不能保存内存中所有段的信息。

    intel的工程师们就想出了用64位的段描述符表(descriptor table)来存储所有的段信息,段描述符表存放在内存的某个位置。段寄存器不再表示段首地址了,而是表示这个段在段描述符表的索引信息。通过段寄存器在段描述符表里找到关于这个段的所有信息

    但是,段描述符表不止一个。首先有一个全局段描述符表,简称GDT,每个程序都有自己的段描述符表,简称LDT。相应的,80386里面引入了两个新的寄存器,一个是48位的全局描述符表寄存器GDTR,指向全局描述符表GDT的首地址,一个是16位的局部描述符表寄存器LDTR,它的值随时变化,总是指向CPU当时正在执行的那个程序的局部描述符表LDT。注意,这里不说指向LDT的首地址,是因为LDTRCSDS等段寄存器一样,存放的也是在GDT中的索引值,而不是实际地址。

    那么段寄存器里的索引到底是GDT的索引还是LDT得索引呢?下面是实模式下段寄存器的结构

    TI位为0 表示从全局描述符表中找

    TI位为1 表示从局部描述符表中找

    以保护模式下的虚拟地址xxxx:yyyyyyyy(16位段地址,32位偏移)为例,首先看xxxx的TI位,如果为0,那么在GDT中以xxxx的高13位作为索引找出段描述符,这样就得到了段基址、段限长、优先级等信息。如果TI位为1,那么从LDTR中得到当前程序的LDT在GDT中的索引,再在GDT里找到这个LDT的描述符,得到LDT的首址,然后再以xxxx的高13位为LDT里的索引找到段基址、段限长、优先级等信息。(LDTR,TR的内容只在第一次运行任务0的时候(init/main.c)需要“人工”加载,之后都由CPU自动完成)

    在保护模式下,虚拟地址xxxx:yyyyyyyy(16位段地址,32位偏移),xxxx为段选择子,是段描述符相对于GDT首地址的偏移字节数。通过xxxx找到段描述符从而得到段首址,再加上偏移地址得到实际地址。

    GDTR寄存器的结构

    GDT和LDT里的描述符的通用结构

    各属性位作用如下:

    G:G=0时,段限长的20位为实际段限长,最大限长为2^20=1MB

    G=1时,则实际段限长为20位段限长乘以2^12=4KB,最大限长达到4GB

    D/B:当描述符指向的是可执行代码段时,这一位叫做D位,D=1使用32位地址和32/8位操作数,D=0使用16位地址和16/8位操作数。如果指向的是向下扩展的数据段,这一位叫做B位,B=1时段的上界为4GB,B=0时段的上界为64KB。如果指向的是堆栈段,这一位叫做B位,B=1使用32位操作数,堆栈指针用ESP,B=0时使用16位操作数,堆栈指针用SP。

    AVL:available and reserved bit 通常为0

    P:存在位,P=1表示段在内存中

    DPL:特权级,0为最高特权级,3为最低,表示访问该段时CPU所需处于的最低特权级

    S:S=1表示该描述符指向的是代码段或数据段;S=0表示系统端(TSS、LDT)和门描述符

    TYPE:类型,和S结合使用

    S=1且TYPE<8时,为数据段描述符。数据段都是可读的,但不一定可写。

    S=1且TYPE>=8时,为代码段描述符。代码段都是可执行的,一定不可写,不一定可读

    S=0时,描述符可能为TSS、LDT和4种门描述符

    GDT和LDT的关系

    展开全文
  • 表示偏移地址的寄存器

    千次阅读 2018-09-30 10:52:09
    8086寄存器中,只有bx,bp,si,di这四个寄存器可以用[……]中表示偏移地址
  • 物理地址=段地址X16(十进制)+偏移地址 == 物理地址=段地址X10(十六进制)+偏移地址 Cs是代码段寄存器,IP是指令指针寄存器 段地址 x 16 等于 左移四位 一个数据(16进制)左移1位,相当于乘以16。 一个数据 (十...
  • 地址偏移地址的概念

    千次阅读 2016-02-29 20:44:18
    首先必须明白 cpu和内存的区别cpu 中央处理器 内存是物理数据存放的地方cpu不直接存放数据而是通过内存来存放数据cpu和内存之间通过20条地址总线相连接,地址总线就是cpu通过地址找到对应的内存的物理数据的传递工具...
  • 地址寄存器、偏移地址寄存器

    千次阅读 2020-11-15 12:43:19
    1. 数据寄存器:AX,BX,CX,DX 2. 地址寄存器,看图找规律
  • 一、逻辑地址和物理地址 物理地址可以理解成是某个存储单元的真正的地址,然而地址总线有20位,寄存器们只有16位,无法完全访问到呀。所以就想到一个办法,搞出一个逻辑地址,之后...物理地址=段地址左移一位+偏移...
  • mov ax,[0]与debug中编写出来的结果是不一样的,文件中表示的意思是把0 mov 到 ax,debug中是把ds:[0]的内容 mov 到 ax,所以要想表达相同的意思,.asm文件中应该用寄存器来存放偏移地址,即 mov ax,[bx]的...
  • 由PE装载器将PE文件加到虚拟内存时使用的地址均是RVA地址, 而文件中存放的数据的地址是基于文件的偏移地址, 因此存在一个从RVA到偏移地址的转换过程。当我们通过内存映射文件的方式获取文件数据内容时使用的是...
  • 指令指针寄存器IP:存放下一条指令的地址偏移量 (下一条指令的地址,CS给出段基值+ip偏移地址,20位的物理地址) 标志寄存器FR:存放当前程序执行的状态,相加以后结果为0,溢出,符号位为正为负等。指令指针IP...
  • 1、段基址和段内偏移地址都是16位(8086仅有16位数据总线);物理地址是20位(8086有20位地址总线)。 2、由于段内偏移地址是16位,所以每个段最大2^16,即0xFFFF。 3、段基址也是16位的,它放在一个20位的数据中,...
  • 我们看一个例子,一个数据为2H,二进制形式为10B,对其进行左移运算: 观察上面移位次数和各种形式数据的关系,我们可以发现: ...就是将二进制形式存放的段地址左移4位。 进一步思考,我们可看出:一个
  • BX和BP指示偏移地址时有何不同?

    千次阅读 2013-01-11 12:40:42
    用户编程中指示偏移地址的寄存器有BX、BP、SI、DI.    存储器单元寻址方式中,使用BX指示偏移地址时,隐含引用的是数据段DS。  若使用BP指示偏移地址,隐含引用的是堆栈段SS。
  • 笨笨的小白菜最近刚开始学习汇编,看到了8086 CPU的寻址方式:物理地址=段地址*16+偏移地址,于是有了如下的一些问题: 一、为何8086 CPU会采用这种寻址方式? 因为8086 CPU是一个16位CPU,那么决定了它有如下...
  • 地址不是单纯的16进制数值,它表达的是内存空间。
  • 之所以有文件偏移和相对内存偏移的不同,是因为文件的节磁盘中的存放结构,和载入内存中的存放结构不同。这就产生了节偏移
  • 输入输出指令格式及功能输入输出指令的实例输入输出指令的两种寻址方式及注意事项取偏移地址指令什么是取偏移地址指令?指令格式取偏移地址指令的实例其他传送类指令 输入输出指令 什么是输入输出指令? 输入指令:...
  • 关于大端和小端,容易混淆,现在只记小端:小端,是数的高位存在内存地址的高位 下面是从网上摘抄的一些东东,帮助理解和记忆,来自http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_14837.html: 端模式(Endian...
  • 利用指针地址偏移打印一维数组

    千次阅读 2015-07-27 21:33:10
    // 利用指针地址偏移打印一维数组 // // Created by wanghy on 15/7/24. // Copyright (c) 2015年 wanghy. All rights reserved. //   #include #define len 10   int main(int argc, const char * ...
  • 8086 cpu为什么要把段地址*16+偏移量形成物理地址呢? 这是因为,8086地址线是20位,段寄存器是16位,将段寄存器*16实际上就是向左移动4位,形成20位和8086的二十位地址线匹配. IP(Instruction Pointer):指令指针...
  • 结构体成员偏移

    2015-07-28 17:01:42
    今天研究计算C语言中,结构体成员的偏移量问题。发现一个宏定义就可以计算得到,这里... 结构体变量的某成员的地址等于该结构体变量的基址加上结构体成员变量结构体中的偏移量 (type*)0,就是假设地址0处存放
  • ARM 为什么地址线要偏移一位接

    千次阅读 2013-01-21 23:33:41
    以前某些书上看到过,某些RAM、nor flash推荐的接法是地址线偏移一位,即cpu的a1接到芯片的a0,不是一一对应。今天上课终于搞懂了 原来就是因为这类RAM、nor flash是16位的 一般我们c语言软件编程的概念,...
  • 数据寻址——偏移寻址

    千次阅读 2021-05-15 14:39:47
    文章目录偏移寻址三种偏移地址区别:基址寻址问题:(b)要用几个bit指明...基址寻址:以程序的起始存放地址作为“起点” 变址寻址:程序员自己决定从哪里作为“起点” 相对寻址:以程序计数器PC所指地址作为“起点”

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 140,475
精华内容 56,190
关键字:

偏移地址存放在