程序如何执行:

CPU先找到程序在内存中的入口地址 -- 地址总线

(8086有20根地址总线,每一根可以某一时传0或1,

20位的二进制数字可以表示的不同的数字的个数是2^20=1048576

1048576 byte/1024=1024 KB    (注:8bit(位)=1Byte(字节) 1024Byte(字节)=1KB 1MB=1024kb=1024x1024b)

1024KB/1024=1 MB

所以寻址范围为2的20次方byte=1M

)

因此有多少根地址总线(总线宽度)决定了CPU内存寻址的范围

以上也可以理解为:CPU是多少位的寻址就是2的位的次方,ex:32位CPU寻址范围就是2的32次方=4G

即使此刻内存容量有8G,CPU也只能够利用当中的低4G中的内存地址,高4G地址无法寻址到

然后通过一定的途径将程序输送给CPU存于CPU的对应的寄存器中,再去执行 -- 数据总线

如果CPU需要控制外围设备、是加是减、或是读是写内存等 -- 控制总线

CPU对数据的+-/*等运算 -- 运算器

总结:CPU的组成=寄存器+运算器+控制器+内部总线(连接各种器件在它们之间传送数据)

控制器

|                    |

-------------------------------------------  内部总线

|                          |

运算器                                      CPU结构图

什么是CPU的寄存器:

寄存器分为通用寄存器、段寄存器...

寄存器用于存放CPU要执行的数据或指令

例如:8086CPU的AX通用寄存器结构如下:

物理地址的表示方法:

问题:8086主板地址线20根,所以进行寻址操作一次需要传送20位的二进制数据

但是CPU最大一次只能够传送16位的二进制数据,那如何处理呢?

例子:如何将 两个3位的数 进化为 一个4位数

ex:   23        -->          234 ×10       +           xxxx

↑                                ↑                       ↑

偏移地址   -->    物理地址

以上的类似实现在CPU中通过地址加法器实现:

实际内存地址=基地址:偏移地址

实际内存地址=基地址×16(×16进位,类似10进制中的×10进位) + 偏移地址

demo:1402:100

1402H (16进制数 4*4=16位的二进制数)  ×  16    + 0100

即   14020H       --基地址×16

+    0100H       --偏移地址

--------------

14120H       --实际物理地址

计算机中是不是这么表示的呢?

WIN+R --> cmd,进入Widows环境下的命令行下  输入debug命令

  1. C:\Documents and Settings\Administrator>debug

debug工具是DOS/Widows提供的实模式程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。

它可以用于逐指令执行某个程序以验证程序运行的正确性,

也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区等

输入d命令查看寄存器的内容:

  1. -d
  2. 0B5D:0100  02 00 EB 0E 50 B0 03 B4-FF E8 9E 00 58 EB 03 E8   ....P.......X...
  3. 0B5D:0110  1D 01 58 C3 F9 C3 55 51-26 8A 4F 08 34 00 4C 0B   ..X...UQ&.O.4.L.
  4. 0B5D:0120  74 0D 8D 6F 09 E8 19 04-73 08 E8 0E 00 E2 F6 F9   t..o....s.......
  5. 0B5D:0130  EB 06 2E 89 2E 5D 91 F8-59 5D C3 26 80 7E 00 00   .....]..Y].&.~..
  6. 0B5D:0140  74 03 45 EB F6 45 C3 2E-80 0E 56 91 10 E8 C6 FF   t.E..E....V.....
  7. 0B5D:0150  72 4A 2E 80 26 56 91 EF-50 2E A1 59 91 2B C6 2E   rJ..&V..P..Y.+..
  8. 0B5D:0160  01 06 57 91 58 2E 8B 36-59 91 2E 80 3C 00 75 26   ..W.X..6Y...<.u&
  9. 0B5D:0170  2E 80 7C FF 3A 75 09 2E-C7 06 4A 91 09 00 EB 1F   ..|.:u....J.....

可以看到物理地址的表示方法都是基地址:偏移地址 ex:0B5D:0100

在CPU中 基地址 存于 段寄存器,偏移地址 存于通用寄存器

物理地址 = 段地址*10H + 偏移地址的更多相关文章

  1. 汇编语言——物理地址=段地址x16+偏移地址,检测点2.2

    一.为什么 物理地址=段地址x16+偏移地址? 刚开始学时,我都笨到不明白为什么是2的N次方,咱把物理地址就当数字,计算机中数字是由很多位0或1自由组合的, 而每一位上要么是0要么是1,只有这两种情况 ...

  2. 物理地址为20位 如10000H 用段地址*16+偏移地址表示

    段地质在cpu中,为16位 段地质*16则变成物理首地址20位,这个物理首地址必定是16的倍数. 偏移地址16位, 则表明一个段的大小为64k. 同时也表明16位地址的寻址能力为64kb

  3. 「汇编」加深理解段地址*10H(*16)必须是16的倍数

    王爽的汇编语言,有这样一道题: 检测点2.2 (2)  有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元.则SA应满足的条件是:最小为         , 最大为   ...

  4. CPU结构及段地址偏移地址的概念

    原文地址:http://blog.csdn.net/yihuiworld/article/details/7533335#comments 程序如何执行: CPU先找到程序在内存中的入口地址 -- 地 ...

  5. 王爽汇编习题2.2(1):给定地址段为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为____到____

    此题解题背景默认为8080型CPU,地址总线为16根.(8080-16,8086-20,8088-20,80286-24,80386-32) 16根地址总线寻址能力:(2 ** 16) / 1024 ...

  6. 转: PE rva to raw 虚拟偏移地址和文件物理偏移地址

    +---------+---------+---------+---------+---------+---------+| 段名称 虚拟地址 虚拟大小 物理地址 物理大小 标志 |+-------- ...

  7. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)

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

  8. java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值

    在上一篇文章中.我们列出了计算java对象大小的几个结论以及jol工具的使用,jol工具的源代码有兴趣的能够去看下.如今我们利用JDK中的sun.misc.Unsafe来计算下字段的偏移地址,一则验证 ...

  9. 怎样求结构体成员的偏移地址 || 结构体的 sizeof 总结

    C 语言中同意将值为 0 的变量强制转换成任一类型的指针,转换结果是一个NULL指针. (type*)0 // 一个 type 类型的NULL指针 用这个指针訪问结构体内的成员是非法的,可是 & ...

随机推荐

  1. UI3_视图切换

    // // ViewController.m // UI3_视图切换 // // Created by zhangxueming on 15/7/3. // Copyright (c) 2015年 z ...

  2. NDK 通过java调用so文件

    首先我们来看so文件的来源 1. 自己写.c文件,然后生成so库 2. 引用别人的静态库,或者动态库来生成新的jni调用库. 我们先来看最简单的编写一个jni调用的so库,包含一个获取字符串的方法,通 ...

  3. Allegro设置十字大光标

    使用大十字光标,在摆放元器件时,容易对齐.在allegro中,可以通过设置实现大十字光标,其具体方法如下: 1.选择Setup->User Perferences,即可出现如下图所示界面: 2. ...

  4. 实验九--裸机LCD

    一.环境 系统:ubuntu12.04 开发板:jz2440 编译器:gcc 二.说明 有空补上 三.代码 Makefile: CC = arm-linux-gcc LD = arm-linux-ld ...

  5. jQuery滚动监听插件Waypoints

    页面内滚动操作的导航插件Waypoints.它可以让你方便的处理页面滚动事件,你可以比较自由的在自己的UI中使用这个插件控制页面滚动事件. Waypoints根据用户滚动的位置来帮助开发者构建相关的设 ...

  6. 【Sql Server】使用触发器把一个表中满足条件的数据部分字段插入到另一个表中

    create trigger 触发器名称 on 对哪个表起作用 after insert,update as return set nocount on begin transaction; inse ...

  7. Mysql多表查询(两张独立表,一张关系表)

    一.数据库设计 1.三个数据表长这样   其中user表记录用户信息,cat主要记录男女性别,mete表是用户id和性别id的对应关系   2.具体数据如下   二.查询目标 查询出所有性别为“男”的 ...

  8. h5 web模板

    <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --><html lang="zh-cmn-Hans"> ...

  9. c#读写注册表示例分享

    c#读写注册表示例,示例中有详细注释. 代码: //写注册表RegistryKey regWrite;//往HKEY_CURRENT_USER主键里的Software子键下写一个名为“Test”的子键 ...

  10. 左右滑动删除ListView条目Item--第三方开源--SwipeToDismiss

    Android的SwipeToDismiss是github上一个第三方开源框架(github上的项目链接地址:https://github.com/romannurik/Android-SwipeTo ...