80X86寻址方式总结

x86架构学习之操作模式、内存寻址、特权级 本文以x86架构为例,讲解Linux的寻址技术,在讲解Linux前,先要理解清楚硬件层面的寻址原理。1~7节重点讲解硬件,与Linux没有关系,更多的是讲解x86硬件架构的寻址技术,也就是x86的MMU(memory manager unit)原理,8-9节则Linux如何使用硬件寻址单元。 阅读详情

                                                                  80X86寻址方式总结

write by starwing83(SW),I know him in bccn,in yzfy_OJ,but he may not know me,because i use different names in different place^_^..

原文:http://hi.baidu.com/starwing/blog/item/c2b2caea933d76d6d439c964.html

 

一:概论
    80x86汇编程序都是分段程序设计结构,每个程序段都有一个开始地址:段基址。在保护模式下段基址要由16位的段选择子得到,这些段选

择子存放在六个段寄存器(CS,SS,DS,ES,FS,GS)中:
    代码段 总是 由 CS 段寄存器来指示;
    堆栈段总是 由 SS 段寄存器来指示;
    字符处理指令总是 使用 ES 段寄存器作为目标操作数的段寄存器;
    一般的数据段可用 DS、ES、FS、GS来指示,但 DS 作为数据段的默认段寄存器,用它来寻址比其它几个段寄存器的效率高,因此最好安排 DS 寻址最常引用的数据段,而 ES、FS、GS去寻址一些不常用的数据段。

    段内偏移地址(某个字节相对段基址的偏移量)也被称为有效地址 EA(effective address),它由以下4个部分组成:

    EA = 基址 + (变址 * 比例因子) + 位移量

    基址、变址、位移量的值可正可负,比例因子只能为正。

    1:基址
    (32位寻址):
        1):如果基址寄存器是 ESP或EBP,则段寄存器为 SS;
        2):如果基址寄存器是其它通用寄存器,则段寄存器为 DS;
    (16位寻址):
        基址寄存器可以是 BX 或 BP

    2:变址
    (32位寻址):
        变址寄存器可以为除 ESP 之外的32位通用寄存器
    (16位寻址):
        变址寄存器可以是 SI 或 DI
    3:比例因子
        一个常数,可取 1、2、4、8。
    4:位移量
        一个8位、16位、32位的常数。

二:详解
    默认情况下,存储器寻址使用DS数据段,可以使用段寄存器来显式指出选择的段。


   1:立即寻址
       对多字节立即数,高字节放在寄存器高位,低字节放在寄存器低位。
       例:
           MOV BL,43                ;把十进制数43放入BL中
           MOV AX,98H            ;把十六进制数98H放入AX中
           MOV AL,'A'                 ;把字符'A'的ASCII码放入AL中
           MOV CX,'AB'            ;把字符'AB'的ASCII码放入CX中

    2:寄存器寻址
       指令中必须是同长的寄存器

    3:直接寻址
       指令中直接提供源操作数的偏移地址,它作为代码的一部分存放在代码段中。
       例:
           MOV BL,DS:[00300H]              ;把DS数据段中偏移地址为300H的字节复制到BL
           MOV CX,ES:[00300H]              ;把ES数据段中偏移地址为300H的字复制到CX
           MOV EAX,DwordVar               ;把DS数据段中DwordVar单元复制到EAX
           MOV CL,ByteVar                      ;把DS数据段中ByteVar单元复制到CL


    4: 寄存器间接寻址
       操作数的有效地址存放在指令指明的寄存器中,能够用作间接寻址的寄存器有:
       EAX,EBX,ECX,EDX,ESI,EDI --> 使用 DS 作为段寄存器
       ESP,EBP                 --> 使用 SS 作为段寄存器
       例:
           LEA EBX, ARRAY                  ;把数组开始地址送EBX
           MOV AL, [EBX]                   ;访问数组的第0个元素,若要访问其它元素,只需增加数组索引EBX的值

           MOV AX, [EBP]                    ;把SS段中EBP指向的字单元复制到 AX
           MOV [EBP], AX                    ;把AX的值复制到SS段中EBP指向的单元
           MOV [EDI], AL                     ;把AL的值复制到DS段中EDI指向的单元
           MOV AL, [EDX]                    ;把DS段中EDX指向的字节单元复制到 AL

    5:寄存器相对寻址
       有效地址EA等于寄存器R中的内容与位移量X的和,即 EA = X + [R],该方式适用于数组、表格处理。
       EAX,EBX,ECX,EDX,ESI,EDI     -->    使用 DS 作为段寄存器
       ESP,EBP                                      -->     使用 SS 作为段寄存器
       例:
           MOV AX, Table[ESI]                ;Table中存放表的首地址,ESI存放要访问的表项的索引
           MOV AX, [Table + ESI]            ;(MOV AX, [Table + ESI]) == (MOV AX, Table[ESI])


           MOV AX, 100H[ESI]                      ;把DS段中ESI加100H的字存储单元的内容复制到 AX
           MOV ARRAY[EDI], AL                   ;把AL的值复制到DS段中ARRAY中的第EDI字节单元中
           MOV LIST[EDI+3], AX                 ;把AX的值复制到DS段中EDI+LIST+3的字单元中
           MOV ARRAY[EBX],EAX               ;把EAX的值复制到DS段中ARRAY+EBX的双字单元中

    6:基址变址寻址
       ESP不能作为变址寄存器。汇编器按如下规则区分基址寄存器和变址寄存器:指令的第二操作数中的第一个寄存器为基址寄存器,第二

个寄存器为变址寄存器。比如 MOV EAX, [EDX][ESI](或MOV EAX, [EDX+ESI])中,EDX 为基址寄存器,ESI 为变址寄存器。该方式适用

于数组、表格的处理。
       例:
           MOV AX, [EBX+ESI]                 ;DS段中地址为EBX+ESI的存储单元的字数据送AX
           MOV AX, [EBP+ESI]                ;SS段中地址为EBP+ESI的存储单元的字数据送AX
           MOV AX, ES:[EBX+ESI]           ;ES段中地址为EBX+ESI的存储单元的字数据送AX

   7:相对基址变址寻址
       该方式适用于二维数组的寻址。
       EA = X + [BP] + [IR]
       例:
           MOV AX, Disp[EBX][EDI] 或
           MOV AX, Disp[EBX+EDI] 或
           MOV AX, [Disp+EBX+EDI]

    以下三种方式中,任何32位通用寄存器都能用作基址寄存器,除ESP之外的32位通用寄存器均可作为变址寄存器;
    若比例因子为1,指令的第二操作数中的第一个寄存器为基址寄存器 ,第二个寄存器为变址寄存器。若基址寄存器为EBP或ESP,则默认的段
寄存器是SS;若基址寄存是其它的寄存器,则默认的段寄存器是DS。
    若比例因子为2、4、8,则与比例因子相乘的那个寄存器是变址寄存器。

    8:比例变址寻址方式
       EA = X + [IR * K]
       和寄存器相对寻址相比增加了比例因子,优点在于:对元素大小为2、4、8字节的数组,可在变址寄存器中给出数组元素的下标。
       例:
           MOV EAX, ARRAY[ESI*4]           ;将ARRAY数组中第 (ESI) 个元素送EAX,其中ARRAY数组中元素大 小为4

    9:基址比例变址寻址
       EA = [BR] + [IR * K]
       例:
           LEA EBP, ARRAY                         ;把数组开始地址送EBX
           MOV EAX, [EBP][ESI*4]           ;将ARRAY数组中第 (ESI) 个元素送EAX,其中ARRAY数组中元素大小为4

   10:相对基址比例变址寻址
       EA = X + [BR] + [IR * K]
       例:
           MOV AL, 0040400H[EBX][ESI*2]          

           MOV [EAX+EDI*2+15H], DX              ; 把DX寄存器的内容复制到数据段的一存储单元,
                                                                                   ; 该存储单元EA = EAX+EDI*2+15H

           MOV AL, [EBP+ESI*2-30H]                    ; 把堆栈中的一字节单元的内容复制到AL中,
                                                                                   ; 该存储单元EA = EBP+ESI*2-30H

x86编译语言入门(史上最全面,一学就会) 预习教材P222-237程序设计的三种结构:顺序,分支,循坏结构。要求:1、掌握X86汇编语言程序设计的基本框架:数据段、堆栈段、代码段2、了解三种结构的程序设计方法,熟练掌握常用指令的功能(参考教材P162-P182)及寻址方式(参考教材P154-161):MOV,LEA,ADD,SUB,TEST ,CMP,XLAT,DEC,INC,AND,XOR,OR,SHL,SAL,SHR,SAR;熟练掌握立即寻址、直接寻址、R寻址、R间接寻址、变址寻址、基址寻址、基址变址寻址、相对寻址方式。 阅读详情

相关推荐

80x86汇编系列(二):寻址方式

80x86汇编系列(二):寻址方式 概述 80x86汇编代码中,一条带有操作数的指令要确定寻找操作数存放地址的寻址方式。80x86 指令中的操作数可以存放在三种不同的部件中:第一种是 CPU 内的寄存器中,第二种是主存中,第三种是 I/O 设备的端口中。这里主要记录了前两种寻址方式。 文章目录80x86汇编系列(二):寻址方式概述寄存器寻址寄存器间接寻址变址寻址基址加变址寻址立即寻址直接寻址寻址方式的有关问题 寄存器寻址 在寄存器寻址方式中,指令所指明的寄存器就是操作数的存放地址。 使用格式:R 示例:

weixin_41551495的博客 962

X86主要的几种寻址方式

X86主要的几种寻址方式寻址方式各个寻址1. 与数据有关的寻址方式2.与转移地址有关的寻址方式 寻址方式 严格来说有三种寻址方式 1、与数据有关的寻址方式 2、与转移指令或过程调用指令有关的寻址方式 3、与IO指令有关的寻址方式 各个寻址 1. 与数据有关的寻址方式 寻址方式 详解 立即数寻址 指令所需的操作数直接包含在指令代码中,就是常说的立即数注意,立即数有8/16位两种,在使...

weixin_43647094的博客 2480

MRI图像切片(nii格式转2D)

代码参考:将一个MRI(nii格式)数据进行切片 想要批量抽取MRI数据的几个切片,借鉴了上述代码的Python版本,原始代码抽取了全部切片。本次实验主要是抽取sMRI的横断面(axial)方向的其中30张切片,数量根据自己需求可自行设置。 import scipy, numpy, shutil, os, nibabel import sys, getopt import imageio def niito2D(filepath): inputfiles = os.listdir(filep

chs_502的博客 7551

【第三节】x86汇编寻址方式与函数

指令通常由操作码和操作数两部分构成。操作码定义了计算机需要执行的具体操作类型,例如数据传送、算术运算、位移操作或条件跳转等,它是构成指令的核心要素。操作数则是参与指令执行的实体,即操作所针对的数据对象。并非所有指令都需要操作数;一些指令可能不需要任何操作数。常见的指令可能包含一个或两个操作数,而少数指令可能包含三个甚至四个操作数。

攻城狮7号的博客 2343

别再为采样窗口发愁了!手把手教你用STM32实现三电阻分扇区电流采样(附代码避坑)

本文详细介绍了STM32平台下三电阻分扇区电流采样的实现方法,重点解决采样窗口选择不当和扇区切换逻辑问题。通过PWM定时器与ADC协同工作的底层机制分析,提供可移植的代码示例和实战经验,帮助工程师在电机矢量控制(FOC)系统中实现高精度相电流采样。

weixin_42531516的博客 165

极空间NAS小白也能搞定的Gitea部署:Docker+MySQL避坑全记录

本文为极空间NAS用户提供了一份详尽的Gitea私有代码仓库部署指南。针对极空间ARM架构和图形化Docker管理的特殊性,文章重点讲解了如何通过Docker和MySQL容器进行部署,并提供了三种获取兼容镜像的实战策略,特别是利用第三方镜像站转录的方法,帮助小白用户成功搭建并初始化Gitea服务,实现私有Git托管。

weixin_28318011的博客 368

80x86——寻址方式

一、指令的概念 (一)、指令的概念 1.计算机指令的分类:机械指令、伪指令和宏指令。 2.机械指令:机械指令是指计算机完成某种操作是命令。 3.指令的组成:计算机中指令有操作码字段和操作数字段组成。 ...

m0_50708613的博客 2672

电商行业分析爬虫:抓取行业数据,进行行业分析

电商行业数据分析对于市场研究、竞争分析和商业决策至关重要。通过爬取电商平台的数据,我们可以深入了解市场动态、消费者行为和商品销售情况。本文将介绍如何构建一个电商行业分析爬虫,抓取商品信息、销售数据和用户评价等,并进行数据分析。

u014481728的博客 1628

80x86寻址方式

 80x86寻址方式计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集供给用户使用,这组指令集就称为计算机的指令系统计算机中的指令由操作码字段和操作数字段两部分组成。操作码字段指示计算机所要执行的操作,而操作数字段则指出在指令执行操作的过程中所需要的操作数指令的格式一般是:操作码,操作数…操作数操作数字段可以有一个、两个或三个,通常称为一地址、二地址或三地址

hbrqlpf的专栏 2444

【ComfyUI专栏】安装Triton组件

Triton是一款支持大模型推理的深度学习加速组件,最初仅支持Linux平台,现已通过开源社区适配Windows系统。针对SageAttention的安装,建议使用3.2.0Post10版本(该版本提供封装好的安装包,更高版本仅有源码)。用户可通过GitHub获取安装资源,或直接使用pip命令"pip install triton-windows"进行安装。安装时需注意:1)在虚拟环境中操作;2)使用管理员权限。相关资源链接已在文中提供。

技术与管理的平衡木- 1862

【案例讲解】LVGL关于旋转的配置

在实现项目中,因为横竖屏的关系,需要对其做90度的旋转。配置旋转时发现一些局部刷新控件,旋转后效果不对。异常图标正常图标。

Bigan(安)的博客 4284

80x86的7种寻址方式

80x86的7种寻址方式 所需知识点:一个寄存器可以储存16bit信息,即1个字,也可以分成2部分(高位字节和低位字节),每部分存储8bit即1字节 1.立即寻址 操作数在指令中,紧跟在操作码之后,这样的操作数成为立即数 例如: MOV AL,12H MOV AX,1234H 2. 直接寻址 操作数的地址中的偏移量直接跟在操作码之后,默认情况下基址存放在DS中,这个时候不需要加前缀,如果是加了别的...

qq_43748400的博客 4666

YOLOv11 快速入门指南 | 10分钟吃透网络结构与新特性

2024 年 9 月 30 日,Ultralytics 发布了 YOLOv11,这是继 YOLOv8、v9、v10 之后的最新一代实时目标检测模型。 与前几代相比,YOLOv11 在保持“单阶段、实时、端到端”三大基因的同时,带来了两大核心升级:一句话总结:YOLOv11 = 更快 + 更准 + 更少参数。 2.2 微观单元:C3k2 与 C2PSA 2.2.1 C3k2 模块 作用:替换 YOLOv8 的 C2f,做跨阶段局部特征融合。 核心代码(ultralytics/nn/modules/block

shrgegrb的博客 1407

80x86 汇编语言 第二章 复习 x86 寻址方式

80x86 指令中的操作数可以存放在三种不同的部件中:第一种是 CPU 内的寄存器中,第二种是主存中,第三种是 I/O 设备的端口中。寻址方式不仅指明了操作数存放的部件,而且指明了操作数在该部件内的存放地址。

weixin_45762157的博客 1804

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

80x86汇编语言寻址方式汇总

​ 段寄存器在不指明的情况下有缺省值,也可以通过显示说明来指出,下表中的做法选择段寄存器的优先级递增。寻址表达式中,未带比例因子的为基址寄存器,若比例因子为1省略,则前面的为基址寄存器。​ 上述6种寻址方式可以归位。之一,变址寄存器只能选用。当使用16位寄存器时,当使用16位寄存器时。

qq_51330798的博客 1224

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

80x86汇编语言寻址方式介绍

80x86汇编语言寻址方式介绍 立即数寻址 操作数直接包含在指令代码中,可以是8或者16位。立即数作为指令的一部分,直接从BIU指令队列取出,因此速度更快。唯一缺点:只能作为源操作数。 寄存器寻址 指令中所需的操作数在CPU某个寄存器中,可以是8位/16位段寄存器,这个操作完全在CPU内部,因此执行也很快。 以下指令需要CPU以外的东西参与 一个存储单元逻辑地址:段基址:偏移量 段基址由某个段寄存...

hitwh170700212的博客 867

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

80x86的寻址方式及Dosbox演示

在进入介绍之前首先给大家说一下简单介绍一下DOSBox及DOSBox的使用 DOSBox 是一个 DOS 模拟程序,由于它采用的是 SDL 库,所以可以很方便的移植到其他的平台。目前,DOSBox 已经支持在 Windows、Linux、Mac OS X、BeOS 、palmOS、Android 、webOS、os/2等系统中运行。 如需要DOSBox,可到一下链接获取 链接:https://pa...

chenxiyuehh的博客 2810

80x86的寻址方式

在80x86系列中,8086和80286的字是16位,一般处理8到16位,乘除里可能有32位,在386之后的字位32位,所以可处理8位16位32位64位(乘除)      寻址方式: 1.立即数寻址:常用于给寄存器赋值 MOV AL,4    执行后(al)=4。 2.寄存器寻址:操作数在寄存器中,指令指定寄存器号。 MOV BX,AX    执行后(bx)=(ax) 3.直接寻址

lakershero的博客 662

80x86寻址方式与子程序

指令: 控制计算机完成指定操作的命令机器指令:指令的二进制代码形式。例如:CD21H汇编指令:助记符形式的指令。例如:INT 21H指令系统:CPU所有指令及其使用规则的集合。

2201_75609739的博客 447

80x86寻址方式概括总结

书上总共讲了十种寻址方式,这十种寻址方式,从第一种到第十种,其有效地址的计算复杂度逐渐增加。首先我们要弄清楚几个概念,即什么是有效地址,什么是段地址,什么又是基址,什么又是变址。有效地址是偏移地址,它和段地址共同构成存储器中的物理地址。那么要求得这个有效地址,就有很多方法,不同的方法对应不同的寻址方式。段地址是分配给段的物理地址,是某一段地址的开始地址,存储在DS等段寄存器中,而基址和变址都是相对

Yelbosh的专栏 1311

第041课 80x86寻址方式与函数

第041课   80x86寻址方式与函数 ​1. 指令1 -- 组成                                                   操作码     操作数 指令由操作码和操作数两部分组成 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通

why99fun的专栏 478

汇编语言(二)——80x86指令系统和寻址方式

3.1 80x86的寻址方式 寻址的概念 汇编指令格式:操作码 [操作数1 [,操作数2 [,操作数3]]] [;注释 ] 寻址、寻址方式的概念:寻址——寻找操作数的地址;寻址方式——寻找操作数地址的方法 ...

Double___H的博客 1145
上一篇: I will never given up```Come on...
下一篇: 用VIM编写C/C++程序
Non_Recursive
博客等级 码龄18年 57粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值