16ASM 分段和機器碼

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 101189C3          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 89fe88C7          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 011188C7          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 100089C3          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 1118B07          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 100089C3          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 1118B07          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 0010C60712C60012C60212
****** 內存 到 段寄存器*****
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 000es,cs,ss,ds

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212405.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212405.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hadoop集群破壞試驗可靠性驗證

集群環境說明&#xff1a; 準備5臺服務器&#xff0c;hadoop1、hadoop2、hadoop3、hadoop4、hadoop5&#xff1b; 分別部署5個節點的zookeeper集群、hadoop集群、hbase集群 本次對于Hadoop集群測試主要分為五個方面&#xff1a; 手動進行datanode節點刪除&#xff1a;&#…

typedef 與#define 的區別

typedef 與#define 的區別 typedef &#xff1a; 給一個已經存在的數據類型&#xff08;注意&#xff1a;是類型不是變量&#xff09;取一個別名&#xff0c;而非定義一個新的數據類型 #define宏定義&#xff1a; #define宏定義&#xff1a;在預編譯時直接進行簡單的文本替換 舉…

WIFI直連(Wi-Fi P2P)

一、概述 Wifi peer-to-peer&#xff08;也稱Wifi-Direct&#xff09;是Wifi聯盟推出的一項基于原來WIfi技術的可以讓設備與設備間直接連接的技術&#xff0c;使用戶不需要借助局域網或者AP&#xff08;Access Point&#xff09;就可以進行一對一或一對多通信。這種技術的應用…

計算機畢業設計 SpringBoot的樂樂農產品銷售系統 Javaweb項目 Java實戰項目 前后端分離 文檔報告 代碼講解 安裝調試

&#x1f34a;作者&#xff1a;計算機編程-吉哥 &#x1f34a;簡介&#xff1a;專業從事JavaWeb程序開發&#xff0c;微信小程序開發&#xff0c;定制化項目、 源碼、代碼講解、文檔撰寫、ppt制作。做自己喜歡的事&#xff0c;生活就是快樂的。 &#x1f34a;心愿&#xff1a;點…

Xmanager

什么是 XManager Xmanager 是市場上領先的 PC X 服務器&#xff0c;可將X應用程序的強大功能帶入 Windows 環境。 提供了強大的會話管理控制臺&#xff0c;易于使用的 X 應用程序啟動器&#xff0c;X 服務器配置文件管理工具&#xff0c;SSH 模塊和高性能 PC X 服務器。 Xman…

javaScript(六):DOM操作

文章目錄 1、DOM介紹2、DOM&#xff1a;獲取Element對象3、DOM&#xff1a;事件監聽3.1、事件介紹3.2、常見事件3.3、設置事件的兩種方式3.4、事件案例 1、DOM介紹 概念 Document Object Model &#xff0c;文檔對象模型 將標記語言的各個組成部分封裝為對應的對象&#xff1a…

Realme X7 Pro Root 刷機教程

Realme X7 Pro 刷機教程 Just For Fun&#xff0c;最近倒騰了下Realme X7 Pro 刷root。此博客為個人記錄刷機過程&#xff0c;如有機友跟隨本教程操作&#xff0c;請謹慎操作&#xff01;&#xff01;&#xff01; 以下教程真針對Realme X7 Pro&#xff0c;其他版本方法未知&…

springboot(ssm高校競賽管理系統 在線競賽平臺 Java系統

springboot(ssm高校競賽管理系統 在線競賽平臺 Java系統 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 數…

qt 模型視圖結構

在Qt中&#xff0c;Model、View和Delegate三者之間的關系如下&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;Model是數據的抽象表示&#xff0c;它提供了一種結構化的方式來存儲和管理數據。Model負責維護數據的狀態&#xff0c;并提供接口供其他組件&#xff08…

【Flutter】vs2022上開發flutter

在vs上開發flutter&#xff0c;結果擴展倉庫上沒辦法找到Dart&#xff0c;Flutter。 在 這 搜索Dart時也無法找到插件。 最后發現是安裝工具出錯了 安裝了 開發需要的是

挖漏洞之文件上傳

&#xff08;一&#xff09;漏洞原理 文件上傳漏洞是指由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷&#xff0c;而導致的用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件。這里上傳的文件可以是木馬&#xff0c;病毒&#xff0c;惡意腳本或者WebShell等。…

從線性回歸到神經網絡

目錄 一、線性回歸關鍵思想 1、線性模型 2、基礎優化算法 二、線性回歸的從零開始實現 1、生成數據集 2、讀取數據集 3、初始化模型參數 4、定義模型 5、定義損失函數 6、定義優化算法 7、訓練 三、線性回歸的簡潔實現 1、生成數據集 2、讀取數據集 3、定義模型…

論文代碼閱讀:TGN模型訓練階段代碼理解

文章目錄 [toc] TGN模型訓練階段代碼理解論文信息代碼過程手繪代碼訓練過程compute_temporal_embeddingsupdate_memoryget_raw_messagesget_updated_memoryself.message_aggregator.aggregateself.memory_updater.get_updated_memoryMemoryget_embedding_moduleGraphAttentionE…

什么是W3C標準? 什么要遵循?

Hi i,m JinXiang ? 前言 ? 本篇文章主要介紹HTML5中W3C的標準&#xff0c;需要遵循的規則以及部分理論知識 &#x1f349;歡迎點贊 &#x1f44d; 收藏 ?留言評論 &#x1f4dd;私信必回喲&#x1f601; &#x1f349;博主收將持續更新學習記錄獲&#xff0c;友友們有任何問…

【AIGC】Midjourney高級進階版

Midjourney 真是越玩越上頭&#xff0c;真是給它的想象力跪了~ 研究了官方API&#xff0c;出一個進階版教程 命令 旨在介紹Midjourney在Discord頻道中的文本框中支持的指令。 1&#xff09;shorten 簡化Prompt 該指令可以將輸入的Prompt為模型可以理解的語言。模型理解語言…

Git初學入門指令

git基本指令 初始化&#xff1a; git init查看狀態&#xff1a; git status新建文件&#xff1a; touch <filename>加入暫存區&#xff1a; git add . 或者 git add -A 表示全部加入暫存區 git add <filename>單個文件加入暫存區加入倉庫&#xff1a; …

PCIe中斷總結-各個中斷的區別

1.簡介&#xff1a; PCIe中斷支持三種傳輸方式&#xff1a; ? Legacy: 也稱傳統中斷&#xff0c;Legacy PCI中斷機制,每個PCI設備最多支持四個中斷信號(邊帶信號:INTA# INTB# INTC# INTD#) ? MSI(Message Signaled Interrupt): Post Memory Write,只支持32個中斷向量 ? MSI…

力扣labuladong一刷day35天

力扣labuladong一刷day35天 文章目錄 力扣labuladong一刷day35天一、98. 驗證二叉搜索樹二、700. 二叉搜索樹中的搜索三、701. 二叉搜索樹中的插入操作四、450. 刪除二叉搜索樹中的節點 一、98. 驗證二叉搜索樹 題目鏈接&#xff1a;https://leetcode.cn/problems/validate-bi…

【Linux】如何對文本文件進行有條件地劃分?——cut命令

cut 命令可以根據一個指定的標記&#xff08;默認是 tab&#xff09;來為文本劃分列&#xff0c;然后將此列顯示。 例如想要顯示 passwd 文件的第一列可以使用以下命令&#xff1a;cut –f 1 –d : /etc/passwd cut&#xff1a;用于從文件的每一行中提取部分內容的命令。-f 1&…

Sql server數據庫數據查詢

請查詢學生信息表的所有記錄。 答&#xff1a;查詢所需的代碼如下&#xff1a; USE 學生管理數據庫 GO SELECT * FROM 學生信息表 執行結果如下&#xff1a; 查詢學生的學號、姓名和性別。 答&#xff1a;查詢所需的代碼如下&#xff1a; USE 學生管理數據庫 GO SELE…