16ASM 分段和机器码

news2024/11/28 4:33:33

8086CPU存储分段管理

问题1:8086是16位cpu,最多可访问(寻址)多大内存?

  • 运算器一次最多处理16位的数据。
  • 地址寄存器的最大宽度为16位。
  • 访问的最大内存为:216 = 64K 即 0000 - FFFF。

问题2:8086允许最大内存1M,如何实现访问(寻址)到所有内存?

  • 8086CPU有20位地址总线,可以传输20位地址,达到1M寻址能力,但8086CPU是16位构造。
  • 8086CPU采用一种在内部使用两个16位地址合成的方式来形成一个20位的物理地址。

在8086cpu中,对存储器的管理是采用分段管理的方式。将内存划分成多段,通过段基址 + 段偏移 方式访问。

8086CPU有20条地址线

  • 最大可寻址控件为2 20 = 1MB
  • 物理地址范围从 00000H ~ FFFFFH

8086CPU 将1MB控件分成许多逻辑段

  • 每个段最大限制为64K
  • 段地址的低4位为0000B

物理地址和逻辑地址

  • 物理地址:对应每个物理储存单元都有唯一的20位地址编号,就是物理地址,从 00000H ~ FFFFFH。
  • 逻辑地址:分段后在用户编程时,采用的逻辑地址,形式为:段基地址:段内偏移地址

注意:

  • 一个物理地址可以由任意个逻辑地址表示。
  • 虽然一个物理地址可以由多个逻辑地址表示,但基于分段原则,一般编程中不会碰到。

逻辑地址解析:

  1. 段地址说明逻辑段在主存中的起始位置。
  2. 8086规定端地址必须是模16的地址。为什么?因为这样处理器就不用多一次不必要的运算。
  3. 偏移地址说明主存单元距离短起始位置的偏移量
  4. 每段不超过64KB,偏移地址也可用16位数据表示。

逻辑地址与物理地址的转换

将逻辑地址中的端地址左移4位,加上偏移地址就得到20位物理地址

一个物理地址可以有多个逻辑地址

内存地址 = 段基址 * 10H(<<4) + 段偏移

逻辑地址1460 : 100、 1380 : F00

物理地址:14700H 、 14700H

例子:

  • 段基址:073F,段偏移:0100    =    内存地址:073F0 + 100 = 074F0;
  • 段基址:063F,段偏移:1200    =    内存地址:063F0 + 1200 = 075F0;
  • 段基址:043F,段偏移:0120    =    内存地址:043F0 + 120 = 04510;

注意

  • 段基址 + 段偏移 的方式一般写作 段地址:段偏移,称为逻辑地址
  • 偏移地址称为 EA。(effective address)
  • 通过逻辑地址计算出来的内存地址称作为物理地址
  • 一个段最大是64K
  • 一个段最小是0,即是不存在
  • 段与段之间重叠1M内存最多可以划分65535个段

  • 段与段之间不重叠1M内存最多可以划分 1M/64k = 16 个段

段划分的原则

  • 段大小可以不是64K。
  • 段与段之间不能有重叠。

注意:

  • 8086不会管分配,dos系统不会管分配,内存分段靠自己。

程序员可用内存,dos系统中编程,应用程序可用内存约600K。

段寄存器

8086中,段基地址都是存储在段寄存器中,段偏移可以用立即数或者通用寄存器指明。

DS

数据段,默认使用DX,SI,  DI

CS

代码段,保存的是代码,绑定CS:IP使用

SS

堆栈段,用作函数栈,绑定SS:SP使用  默认使用BP

ES

扩展段,常用于字符串操作

跨段访问

在DOXBOX的Debuug环境下,

没有段超越的指令实例:

MOV AX,[2000H] ; AX <- DS:[2000H]
从默认的DS数据段取出数据

采用段超越前缀的指令实例:

MOV AX,ES[2000H] ;AX <-- ES:[2000H]
从指定的ES附加段取出数据

使用A,U命令,默认是CS段;使用D,E命令,默认是DS段。

地址加法器

  • 8086有20根地址线,16根数据线,其中数据线与地址线的低16位复用。
  • 内部通过地址加法器计算地址。

访问16位内存,20位地址内存谁更快?

访问16位地址内存块。因为不用经过地址加法器,直接到20根地址总线。

机器码

汇编指令的组成:

  • 指令由操作码和操作数两部分组成。
  • 操作码说明计算机要执行哪种操作,如传送,运算,移位、跳转等操作,它是指令不可缺少的部分。
  • 操作数是指令的参与者,既各种操作的对象
  • 有些指令不需要操作数,通常的指令都是一个或两个操作数,也有个别指令是3个操作数甚至4个操作数。
  • 指令系统设计了很多操作数的来源
  • 寻找操作数的过程就是操作数的寻址
  • 操作数采取哪一种寻址方式,会影响机器运行的速度和效率

机器码的分析

问题:

  1. 内存中存储的是机器码,是一些16进制的数字,计算机是如何知道 多长的十六进制数字是代表一段执行机器码的?
  2. 如何知道机器码有多长?
  3. 如何知道操作数和源操作数的?

操作码 操作数1,操作数2;注释

  • 操作数2,称为源操作数 src,它表示参与指令操作的一个对象
  • 操作数1,称为目的操作数dest,它不仅可以作为指令操作的对象,还可以用来存放指令操作的结果
  • 分号后的内容是对指令的解释

给出如下代码,分析mov

89C3          MOV     BX,AX 1000 1001 1100 0011
89CB          MOV     BX,CX 1000 1001 1100 1011
89D3          MOV     BX,DX 1000 1001 1101 0011
89DB          MOV     BX,BX 1000 1001 1101 1011
89E3          MOV     BX,SP 1000 1001 1110 0011
89EB          MOV     BX,BP 1000 1001 1110 1011
89F3          MOV     BX,SI 1000 1001 1111 0011
89FB          MOV     BX,DI 1000 1001 1111 1011

89C3          MOV     BX,AX 1000 100 1 11 000 011
89CB          MOV     BX,CX 1000 100 1 11 001 011
89D3          MOV     BX,DX 1000 100 1 11 010 011
89DB          MOV     BX,BX 1000 100 1 11 011 011
89E3          MOV     BX,SP 1000 100 1 11 100 011
89EB          MOV     BX,BP 1000 100 1 11 101 011
89F3          MOV     BX,SI 1000 100 1 11 110 011
89FB          MOV     BX,DI 1000 100 1 11 111 011

如上可以得出结论:

16位寄存器是按位存储的

  • ax - 000、 cx - 001、 dx - 010、 bx - 011、sp - 100、 bp - 101、 si - 110、 di - 111
mov si, di
1000 1001 1111 1110 89fe
    
88C7          MOV     BH,AL 1000 1000 1100 0111
88E7          MOV     BH,AH 1000 1000 1110 0111
88DF          MOV     BH,BL 1000 1000 1101 1111
88FF          MOV     BH,BH 1000 1000 1111 1111
88CF          MOV     BH,CL 1000 1000 1100 1111
88EF          MOV     BH,CH 1000 1000 1110 1111
88D7          MOV     BH,DL 1000 1000 1101 0111
88F7          MOV     BH,DH 1000 1000 1111 0111

88C7          MOV     BH,AL 1000 100 0 11 000 111
88E7          MOV     BH,AH 1000 100 0 11 100 111
88DF          MOV     BH,BL 1000 100 0 11 011 111
88FF          MOV     BH,BH 1000 100 0 11 111 111
88CF          MOV     BH,CL 1000 100 0 11 001 111
88EF          MOV     BH,CH 1000 100 0 11 101 111
88D7          MOV     BH,DL 1000 100 0 11 010 111
88F7          MOV     BH,DH 1000 100 0 11 110 111
    

如上可得出结论:

8位寄存期也是按照位来存储的,分别如下:

al - 000、 cl - 001、 dl - 010、 bl - 011、 ah - 100、 ch - 101、 dh - 110、 bh - 111


89FE          MOV     SI,DI 1000 1001
88FE          MOV     DH,BH 1000 1000

89C3          MOV     BX,AX           1000 10 0 1 11 000 011
89CB          MOV     BX,CX           1000 10 0 1 11 001 011
89D3          MOV     BX,DX           1000 10 0 1 11 010 011
89DB          MOV     BX,BX           1000 10 0 1 11 011 011
89E3          MOV     BX,SP           1000 10 0 1 11 100 011
89EB          MOV     BX,BP           1000 10 0 1 11 101 011
89F3          MOV     BX,SI           1000 10 0 1 11 110 011
89FB          MOV     BX,DI           1000 10 0 1 11 111 011
88C7          MOV     BH,AL           1000 10 0 0 11 000 111
88E7          MOV     BH,AH           1000 10 0 0 11 100 111
88DF          MOV     BH,BL           1000 10 0 0 11 011 111
88FF          MOV     BH,BH           1000 10 0 0 11 111 111
88CF          MOV     BH,CL           1000 10 0 0 11 001 111
88EF          MOV     BH,CH           1000 10 0 0 11 101 111
88D7          MOV     BH,DL           1000 10 0 0 11 010 111
88F7          MOV     BH,DH           1000 10 0 0 11 110 111
    
8B07          MOV     AX,[BX]         1000 10 1 1 00 000 111		1000 10 d w mod rrr rrr/mmm
8B05          MOV     AX,[DI]         1000 10 1 1 00 000 101
8B03          MOV     AX,[BP+DI]      1000 10 1 1 00 000 011
8B00          MOV     AX,[BX+SI]      1000 10 1 1 00 000 000
8B4212        MOV     AX,[BP+SI+12]   1000 10 1 1 01 000 010 disp8
8B825634      MOV     AX,[BP+SI+3456] 1000 10 1 1 10 000 010 disp16
8A825634      MOV     AL,[BP+SI+3456] 1000 10 1 0 10 000 010 disp16
8B817856      MOV     AX,[BX+DI+5678] 1000 10 1 1 10 000 001 disp16
89817856      MOV     [BX+DI+5678],AX 1000 10 0 1 10 000 001 disp16 
    

如上可得出结论:

前面6位是操作码

d:代表源操作数是寄存器还是内存

  • 0:从寄存器里面取值
  • 1:从内存里面取值

w:目的操作数宽度

oo:模式

  • 11:寄存器到寄存器
  • 10:DISP 16位
  • 01:DISP 8 位
  • 00:内存到寄存器,没有偏移

89FE          MOV     SI,DI 1000 1001
88FE          MOV     DH,BH 1000 1000

89C3          MOV     BX,AX           1000 10 0 1 11 000 011
89CB          MOV     BX,CX           1000 10 0 1 11 001 011
89D3          MOV     BX,DX           1000 10 0 1 11 010 011
89DB          MOV     BX,BX           1000 10 0 1 11 011 011
89E3          MOV     BX,SP           1000 10 0 1 11 100 011
89EB          MOV     BX,BP           1000 10 0 1 11 101 011
89F3          MOV     BX,SI           1000 10 0 1 11 110 011
89FB          MOV     BX,DI           1000 10 0 1 11 111 011
88C7          MOV     BH,AL           1000 10 0 0 11 000 111
88E7          MOV     BH,AH           1000 10 0 0 11 100 111
88DF          MOV     BH,BL           1000 10 0 0 11 011 111
88FF          MOV     BH,BH           1000 10 0 0 11 111 111
88CF          MOV     BH,CL           1000 10 0 0 11 001 111
88EF          MOV     BH,CH           1000 10 0 0 11 101 111
88D7          MOV     BH,DL           1000 10 0 0 11 010 111
88F7          MOV     BH,DH           1000 10 0 0 11 110 111
    
8B07          MOV     AX,[BX]         1000 10 1 1 00 000 111		1000 10 d w mod rrr rrr/mmm
8B05          MOV     AX,[DI]         1000 10 1 1 00 000 101
8B03          MOV     AX,[BP+DI]      1000 10 1 1 00 000 011
8B00          MOV     AX,[BX+SI]      1000 10 1 1 00 000 000
8B4212        MOV     AX,[BP+SI+12]   1000 10 1 1 01 000 010 disp8
8B825634      MOV     AX,[BP+SI+3456] 1000 10 1 1 10 000 010 disp16
8A825634      MOV     AL,[BP+SI+3456] 1000 10 1 0 10 000 010 disp16
8B817856      MOV     AX,[BX+DI+5678] 1000 10 1 1 10 000 001 disp16
89817856      MOV     [BX+DI+5678],AX 1000 10 0 1 10 000 001 disp16 

8E1E1200 mov bx,[0012]	1000 1110 0001 1110 0001 0002 0000 0000
8A1E1200 mov bx,[ds+12]

8B078B058B038B008B42128B8256348A8256348B81785689817856

*******立即数 到寄存器*********
BB3412  MOV BX,1234  1011 1 0 11 0011 0100 0001 0010	
BB1200  mov bx,12    1011 1 0 11     
BE1200 	mov si,12	 1011 1 111 

BB1200			mov bx,12
BB3412			MOV BX,1234
B712  			mov bh,12
    
*******立即数 到 内存*********		   	   1100 011 w oo 000 mmm 立即数
C60712      	mov byte ptr [bx],12		1100 011 0 00 000 111 0001 0010
C60012      	mov byte ptr [BX+SI],12		1100 011 0 00 000 000 0001 0010
C60212      	mov byte ptr [BP+SI],12		1100 011 0 00 000 010 0001 0010
 
C60712C60012C60212
****** 内存 到 段寄存器*****
8E1F			mov ds,[bx]
    
*******寄存器 到 段寄存器*****
8ED8 	mov ds,ax			 				1000 1110 11 011 000 
8CC8	mov ax,cs   						1000 1100 11 001 000

段寄存器编号分析
8EC8	mov cs,ax	1000 1110 11 001 000
8ED8	mov ds,ax	1000 1110 11 011 000
8EC0	mov es,ax	1000 1110 11 000 000
8ED0	mov ss,ax	1000 1110 11 010 000

es,cs,ss,ds


    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1300451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】手把手教你用tkinter设计图书管理登录UI界面(三)

上一篇&#xff1a;【Python】手把手教你用tkinter设计图书管理登录UI界面&#xff08;二&#xff09;-CSDN博客 下一篇&#xff1a; 紧接上一篇文章&#xff0c;继续完善项目功能&#xff1a;用户登录。由于老王的注册部分有亿点点复杂&#xff0c;还没完成&#xff0c;但是…

泽攸科技桌面型扫描电子显微镜(SEM)技术解析

台式扫描电子显微镜是一种利用电子束扫描样品表面并检测样品反射或发射的电子信号&#xff0c;从而获得样品表面形貌、结构和成分信息的仪器。它的工作原理是由电子枪发出的电子束经过栅极静电聚焦后成为直径50微米的点光源&#xff0c;然后在加速电压作用下&#xff0c;经两三…

JAVA实操经验

零&#xff1a; 按照需要&#xff0c;可以使用需要某个类下&#xff08;主要是java提供的&#xff09;的方法来实现某个功能。&#xff08;主要是用在不同类下的方法会进行重写功能不同&#xff09; 方法和构造方法不同&#xff1a;方法是方法&#xff0c;构造方法是构造器&a…

[算法每日一练]-双指针 (保姆级教程篇 1) #A-B数对 #求和 #元音字母 #最短连续子数组 #无重复字符的最长子串 #最小子串覆盖 #方块桶

目录 A-B数对 解法一&#xff1a;双指针 解法二&#xff1a;STL二分查找 解法三&#xff1a;map 求和 元音字母 最短连续子数组 无重复字符的最长子串 最小子串覆盖 方块桶 双指针特点&#xff1a;双指针绝不回头 A-B数对 解法一&#xff1a;双指针 先把数列排列成…

GDPU 数据结构 课后作业(持续更新……)

文章目录 第 1 章第 2 章&#x1f437; 作业1&#x1f437; 作业2 第 3 章&#x1f437; 作业1&#x1f437; 作业2 第 4 章第 5、6 章二叉树&#x1f437; 作业1 第 7 章 哈夫曼树第 8 章 图&#x1f437; 图 1&#x1f437; 图 2&#x1f437; 图 3 第9 章 排序 第 1 章 第 2…

STM32F103

提示&#xff1a;来源正点原子&#xff0c;参考STM32F103 战舰开发指南V1.3PDF资料 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 开发环境硬件普中科技&#xff0c;接…

javaSwing酒店管理系统

一、 使用方法&#xff1a; 在使用前&#xff0c;需要到druid.properties 配置文件中&#xff0c;修改自己对应于自己数据库的属性&#xff1b;如用户名&#xff0c;密码等 driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql:///hotel?useUnicodetrue&characterEn…

【C++】:AVL树

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关多态的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

C语言 内联函数 + 递归函数

函数分类 内联函数 1&#xff09;内联函数在编译时将函数的代码直接插入到调用它的地方&#xff0c;而不是通过函数调用的方式执行&#xff0c;从而减少了函数调用的开销&#xff0c;提高了代码的执行速度 2&#xff09;使用 inline 关键字来声明 3&#xff09;将函数声明为内联…

深入理解Dubbo-4.Dubbo扩展SPI

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

Redis探秘:AOF日志与数据持久性之旅

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Redis。你知道吗&#xff0c;Redis作为一个超高效的内存数据库&#xff0c;真的是超级给力。它可以秒速处理数据&#xff0c;让咱们的应用运行得飞快。但是&#xff0c;小黑得告诉你&#xff0c;虽…

四. 基于环视Camera的BEV感知算法-BEVFormer

目标 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. BEVFormerv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章—…

nginx多ip部署

1.修改网卡信息自定义多个IP 进入/etc/sysconfig/network-scripts&#xff0c;编辑ifcfg-ens33网卡文件。将dhcp动态分配修改成static&#xff0c;同时添加ip地址子网掩码、网关和DNS。 修改完成后重启网卡&#xff0c;systemctl restart network 2.修改nginx配置文件 有几个…

【数据结构实践课设】新生报道注册管理信息系统

目录 1.主要框架 2.写入文件 3.读取文件 4.注册学生信息 5.增加学生信息 6.删除学生信息 7.按姓名查询 8.按班级查询 9.按专业查询 10.打印学生信息 11.完整代码 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所…

【S32K3环境搭建】-0.4-使用SEGGER J-Link烧录调试程序

【S32K3_MCAL从入门到精通】合集&#xff1a; S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 导入一个编译没有报错的S32K312工程。接着在菜单栏中&#xff0c;依次选择Debug下拉箭头 -- > Debug Configuration&#xff1b; 在弹出的Create…

FL Studio 21注册机激活码序列号下载 附激活码

FL Studio 21 keygen激活码序列号是一款基于同名软件激活程序。操作非常简单。用户只需使用本激活工具生成激活码&#xff0c;即可一键激活软件所有功能&#xff0c;无需付费。去购买注册程序&#xff0c;永久免费使用所有功能。很多用户应该都知道&#xff0c;专业的编辑工具只…

SpringCloud-高级篇(六)

&#xff08;1&#xff09;Seata架构 &#xff08;2&#xff09;部署TC服务 修改注册中心&#xff1a;做服务注册&#xff0c;tc服务配置注册中心&#xff0c;tc服务可以做集群&#xff0c;他也是一个服务 &#xff0c;微服务里面RM 跟TM跟它建立联系肯定是基于注册中心去找&a…

using dapers on diffusers: Dreambooth, Texual Inversion, LoRA and IP-Adapter

using dapers on diffusers: Dreambooth, Texual Inversion, LoRA and IP-Adapter 参考自&#xff1a;https://huggingface.co/docs/diffusers/using-diffusers/loading_adapters 如今&#xff0c;对于 diffusion 模型&#xff0c;有许多高效的训练技术来微调一个定制化的模型&…

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效的处理任何大小项目的版本管理。 核心功能&#xff1a; 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外&#xff0c;其他都无脑安装 3、检查一下安装情况 win…

Android系统中使用Cunit测试C/C++接口

Android系统中使用Cunit测试C/C接口 Cunit是C/C语言的单元测试框架&#xff0c;但常用于Windows和Linux开发中。 Android系统中经常有jni、so库、hal service等都是C/C实现&#xff0c;本文讲解如何将Cunit嵌入Android中&#xff0c;用于测试一些C/C api。 Cunit简介 Cunit是很…