【汇编】指令系统的寻址方式

devtools/2024/9/23 2:32:13/

指令系统的寻址方式

指令系统的寻址方式是指计算机处理器在执行指令时,如何定位并访问指令中操作数所在的内存地址或寄存器(寻址方式:获取操作数所在地址的方法)

指令中的操作数

通常一条指令包含操作符和操作数,操作数是指令执行的参与者,也就是说操作数是参与某种功能操作的数据(操作符是加工的方式,操作数是被加工的东西)

提供操作数的三种方式

  1. 立即数

    (参考:什么是立即操作数?)

    立刻数是一个常量,可以写成十进制(D),十六进制(H),八进制(O),二进制(B)

    MOV AX,0FFFH
    ;其中的 0FFFH 就是立即数
    ;这条指令的意思是将十六进制值0FFFH加载到AX寄存器中
    

    立即操作数:操作数包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段,指令要操作的数据以常量的形式出现在指令中

    注意:立即数只能作为源操作数,不能放在目的操作数位置(指令中结果所存放的数据位)

  2. 寄存器操作数(寄存器存放的数据)

    MOV SI,AX
    ;这条指令的意思是将AX中的内容复制到SI中
    

    寄存器操作数:指令要操作的数据存放在CPU中的寄存器里,指令中给出寄存器名即可

  3. 存储器操作数(内存中的数据)

    存储器操作数:指令要操作的数据存放在内存某些单元中,指令中给出内存单元物理地址(实际上指令只给出了偏移地址,段地址采用隐含方式给出,也可以使用跨段方式指出当前段地址)

七种寻址方式

立即寻址方式

(对应上文中的立即数)

在立即寻址方式中,操作数的值直接嵌入到指令中,因此在执行指令时无需额外的内存访问或寄存器读取(操作数在指令中

立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储

MOV AH, 80H   ADD AX, 1234H   MOV ECX, 123456H
MOV B1, 12H   MOV W1, 3456H    ADD D1, 32123456H
;B1、W1 和 D1 分别是字节、字和双字单元

立即数寻址方式通常用于对通用寄存器或内存单元赋初值

寄存器寻址方式

(对应上文的寄存器操作数)

指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式(操作数在寄存器中

MOV EAX, EBX   MOV AX, BX   MOV DH, BL

由于指令所需的操作数已存储在寄存器中,在指令执行过程中,会减少读存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度

直接寻址方式

指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式(EA在指令中)
(EA:有效地址,是指操作数的实际存储地址,它是由指令中的地址计算得出的)

MOV BX, [1234H]
;1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出
;默认的访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址
;取物理地址的值,并按“高高低低”的原则存入寄存器BX中

由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来

MOV AX,ES:[1000H]

注意

  • 立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在“[]"内

    MOV AX, 1234H 
    MOV AX, [1234H] 
    ;前者是立即寻址,后者是直接寻址 
    
  • 直接地址通常用内存变量名来表示

    MOV AX, VARW
    MOV AX, [VARW]
    ;VARW是内存字变量
    ;两者是等效的,均为直接寻址
    

    MOV BX, VARW,其中,VARW是内存字变量

寄存器间接寻址

操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式(EA在BX/BP/SI/DI中
(只有这四个寄存器可以作为偏移量)

在不使用段超越前缀的情况下,有下列规定

  • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS

    MOV AX, [BX]
    

    在执行本例指令时,寄存器BX的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和BX的值形成: P A = ( D S ) ∗ 16 + B X PA=(DS)*16+BX PA=(DS)16+BX

  • 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)

寄存器相对寻址

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和(EA为BX/BP/SI/DI加上某个常数

在不使用段超越前缀的情况下,有下列规定

  • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS

    在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位,当所得的有效地址超过0FFFFH,则取其64K的模

    MOV BX, [SI+100H]
    

    在执行本例指令时,源操作数的有效地址EA为: E A = ( S I ) + 100 H EA=(SI)+100H EA=(SI)+100H

    该操作数的物理地址应由DS和EA的值形成: P A = ( D S ) ∗ 16 + E A PA=(DS)*16+EA PA=(DS)16+EA

  • 若有效地址用BP来指定,则其缺省的段寄存器为SS

基址变址寻址

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和(EA为基址寄存器和变址寄存器内容之和

在不使用段超越前缀的情况下规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS

MOV BX, [BX+SI]

在执行本例指令时,源操作数的有效地址EA为: E A = ( B X ) + ( S I ) EA=(BX)+(SI) EA=(BX)+(SI)

该操作数的物理地址应由DS和EA的值形成: P A = ( D S ) ∗ 16 + E A PA=(DS)*16+EA PA=(DS)16+EA

相对基址变址寻址

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和(EA为基址寄存器和变址寄存器和某个常数之和

在不使用段超越前缀的情况下规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS

MOV AX, [BX+SI+200H]
MOV AX, 200H[BX+SI]
MOV AX, 200H[BX][SI]    
MOV AX, 200H[SI][BX]
;以上几种书写格式都是正确的,并且其寻址含义也是一致
;但书写格式BX[1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[]”之外

在执行本例指令时,源操作数的有效地址EA为: E A = ( B X ) + ( S I ) + 200 H EA=(BX)+(SI)+200H EA=(BX)+(SI)+200H

该操作数的物理地址应由DS和EA的值形成: P A = ( D S ) ∗ 16 + E A PA=(DS)*16+EA PA=(DS)16+EA

参考文章

什么是立即操作数?

七种寻址方式(立即寻址、寄存器寻址)

指令系统与寻址方式


http://www.ppmy.cn/devtools/27366.html

相关文章

QSqlTableModel的canFetchMore、fetchMore效率太低,需替换

问题描述:SQLITE数据库,使用QSqlTableModel获取行数,调用函数rowCount(),仅能获取256行,故使用下面代码获取实际行数: while(m_model->canFetchMore()){m_model->fetchMore();} 但实际使用发现效率…

redis多用户管理

最近在学redis,由于笔者是学运维的,所以推荐学习运维的小伙伴参考,希望对大家有帮助! redis运维上篇:http://t.csdnimg.cn/MfPud redis运维下篇:http://t.csdnimg.cn/83sQ1 从redis6开始,默认用户名为default&#x…

c++容器与算法概述

容器与算法 每个标准库容器都提供了begin() end() 函数&#xff0c;分别返回容器的头部位置和尾部位置。 I/O 流 对于自定义的类型&#xff1a; struct Entry {std::string name;int number;};如果需要使用标准输出需要重载<< 运算符&#xff0c;特别注意&#xff1a…

云计算中的网络服务

网络服务是云计算平台不可或缺的一部分&#xff0c;为用户提供构建、管理、保护云环境中网络资源的能力。以下是对列举的七种网络服务——虚拟私有云&#xff08;VPC&#xff09;、负载均衡、内容分发网络&#xff08;CDN&#xff09;、云防火墙、专用网络连接&#xff08;专线…

Windows操作系统安全精讲视频课程

Windows操作系统安全精讲视频课程 1.1IT运维职位需要学习的技能.mp4 1-2利用缓存的网络凭据入侵服务器.mp4 1-3信息安全包括哪些方面.mp4 1-4管理本地用户账户和组.mp4 1-5创建检查删除计算机上隐藏的账户.mp4 1-6用户账户控制&#xff08;UAC&#xff09;详解.mp4 1-7使用win…

数据结构(八)——排序

八、排序 8.1 排序的基本概念 排序(Sort)&#xff0c;就是重新排列表中的元素&#xff0c;使表少的元素满足按关键字有序的过程。 输入∶n个记录R1,R2...., Rn&#xff0c;对应的关键字为k1, k2,... , kn 输出:输入序列的一个重排R1,R2....,Rn&#xff0c;使得有k1≤k2≤...≤…

新观点下的熊胆替代研究:探寻未来(鸡胆)发展的神酉异熊之路

熊胆作为中国四大传统珍贵动物药材&#xff08;熊胆、虎骨、牛黄、麝香&#xff09;之一&#xff0c;自古至今已使用数千年。从汉代到清代&#xff0c;有300多本中医经典记录了熊胆的功效应用&#xff0c;主要用于治疗肝经热、湿热黄疸和儿童惊厥。现代研究发现&#xff0c;熊胆…

websocket集成文档

1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>2.添加配置 Configuration public class WebSocketConfig {Beanpublic ServerEndpointExpo…