首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

8086-为什么我们不能将立即数据移入段寄存器?

在x86架构的实模式下,8086处理器不允许将立即数(immediate data)直接移入段寄存器(如CS、DS、ES、SS)。这是因为段寄存器用于存储内存段的基地址,而这些地址通常是通过组合段寄存器和偏移量来计算的。立即数是直接编码在指令中的常量值,它们通常用于算术运算、数据传输等操作。

原因分析

  1. 安全性:直接将立即数移入段寄存器可能会导致非法内存访问,破坏系统的稳定性。
  2. 设计限制:8086处理器的设计初衷是为了简化指令集,减少指令种类,因此限制了直接对段寄存器的操作。
  3. 内存管理:在实模式下,内存管理相对简单,段寄存器的值通常是通过加载特定的值到寄存器中来设置的,而不是通过立即数。

解决方法

如果需要将立即数加载到段寄存器中,可以通过以下几种方法:

  1. 使用通用寄存器作为中介: 先将立即数加载到一个通用寄存器中,然后再将该通用寄存器的值加载到段寄存器中。
  2. 使用通用寄存器作为中介: 先将立即数加载到一个通用寄存器中,然后再将该通用寄存器的值加载到段寄存器中。
  3. 使用MOV指令的特殊形式: 有些处理器支持将立即数加载到段寄存器的特殊形式,但这在8086中是不支持的。

应用场景

在实际编程中,段寄存器的值通常是通过加载特定的值来设置的,例如在初始化程序时设置数据段和代码段的基地址。

参考链接

通过上述方法,可以绕过8086处理器不允许直接将立即数移入段寄存器的限制,确保程序的正确性和稳定性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

汇编指令大全

图 3.11  传送指令数据流   由上图可知,数据允许流动方向为:通用寄存器之间、通用寄存器和存储器之间、通用寄存器寄存器之间、寄存器和存储器之间,另外还允许立即数传送至通用寄存器或存储器。...但在上述传送过程中,寄存器CS的值不能用传送指令改变。  例 3.12CPU内部寄存器之间的数据传送。   ...;   ·源和目的操作数不允许同时为寄存器;   ·目的操作数不允许为CS和立即数;   ·当源操作数为立即数时,目的操作数不允许为寄存器;   ·传送操作不影响标志位。   ...目的操作数允许为16或32位通用寄存器、存储器和16位寄存器。当操作数数据类型为字类型,出栈操作使SP加2;当操作数数据类型为双字类型,出栈操作使SP加4。...目的操作数为16位或32位通用寄存器或存储器操作数。源操作数为16位或32位通用寄存器、存储器或立即数。   源操作数和目的操作数数据类型要求一致。

1.4K10

【学员笔记分享】0基础学逆向笔记精整理(一)

EBX:(DS中的数据指针)基址寄存器。 ECX:(字符串和循环操作的)计数器,一些指令会用该寄存器来进行计数。 EDX:(I/O指针)数据寄存器。...EBP:(SS中栈内数据指针)扩展基址指针寄存器。 ESI:(字符串操作源指针)源变址寄存器。 EDI:(字符串操作目标指针)目的变址寄存器 ESP:(SS中栈指针)栈指针寄存器。...各段寄存器的名称如下: CS:code segment 代码寄存器 SS:stack segment 栈寄存器 DS:data segment 数据寄存器 ES:extra segment 附加(...数据寄存器 FS:data segment (附加)数据寄存器 GS:data segmet (附加)数据寄存器 这些寄存器就存放了对于的基址。...IMUL DEST SRC 立即数 ;DEST=SRC*立即数。 前两种的结果最高一半位数是无效数,则CF,OF是0,否则是1。ZF,SF,PF受影响。

96430
  • 汇编语言期末复习不挂科——知识点总结

    ,对它们有特定的要求,且具有特殊的功能 2个指针寄存器:SP和BP (1)BP为基指针寄存器,用它可直接存取堆栈中的数据 (2)SP为堆栈指针寄存器,用它只可访问栈顶 4个寄存器:ES,DS,CS...数据传送指令 传送指令MOV 格式如下:MOV Reg/Mem,Reg/Mem/Imm 寄存器Reg 存储器Mem 立即数Imm ---- 注意:①两个操作数的数据类型要相同,要同为8位、16位...②两个操作数不能同时为寄存器, ③代码寄存器CS不能为目的操作数,但可作为源操作数 ④立即数不能直接传给寄存器立即数不能作为目的操作数 ⑥指令指针IP,不能作为MOV指令的操作数 ⑦...每执行一次,CF的值循环移入目的操作数的低位,而目的操作数的最高位移入CF。...该指令涉及目标串,故DI的值保持不变。一般使用LODS指令不加重复前缀。

    84810

    快速学习-汇编指令大全

    OPRD2为立即数,也可以是任意一个通用寄存器操作数.立即数只能用于源操作数. OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的,但不允许两个都是存储器操作数....OPRD2为立即数,也可以是任意一个通用寄存器操作数.立即数只能用于源操作数. OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的, 但不允许两个都是存储器操作数....说明: 目的操作数OPRD1为任一通用寄存器或存储器操作数.源操作数OPRD2为立即数,任一通用寄存器或存储器操作数....说明: OPRD1为任意通用寄存器或存储器操作数. OPRD2为任意通用寄存器或存储器操作数,立即数也可用作源操作数OPRD2....MOV 指令以分为以下四种情况: 寄存器寄存器之间的数据传送指令 立即数到通用寄存器数据传送指令 寄存器与存储器之间的数据传送指令 立即数到存储器的数据传送 本指令不影响状态标志位

    1.1K20

    操做系统-线程与进程

    进程上下文 除进程实体之外,进程的运行还需要其他硬件环境的支持,如程序状态字 PSW、表、页表等数据结构。一个进程运行时,CPU 所有寄存器中的内容、进程的状态以及运行栈中的内容被称为进程的上下文。...操作系统内核进程使用的进程上下文信息集合,主要包括 PCB 与逻辑地址到物理地址转换的核心数据结构,如表、页表及核心栈等。 (2)寄存器上下文。...用户进程访问和修改的进程上下文信息集合,主要包括进程的程序数据、用户栈和共享存储区。...(3)将被中断的当前运行进程的 PCB 移入适当的队列(因时间片到则移入进程就绪队列,因某事件发生则移入相应的进程阻塞队列)。...用户态实现也有两个缺点:一个缺点是:需要修改操作系统,使其在进程切换时立即切换到其他进程,而是调用受阻进程中的执行系统线程,但这个缺点因改动范围较小而并不严重;另一个严重的缺点是:操作系统在用户态下,

    62450

    计算机组成原理 指令

    MAR(地址寄存器)=0   PC把地址0交给了地址寄存器MARMDR(数据寄存器)=000001 0000001000   MAR根据地址在0的存储单元中取出指令,交给了数据寄存器MDRIR(指令寄存器...LOAD 作用:把存储器中的数据放到寄存器中STORE 作用: 把寄存器中的数据放到存储器中运算类算术逻辑操作算术:加、减、乘、除、增1、减1、求补、浮点运算、十进制运算逻辑: 与、或、非、异或、位操作...,指令执行时间最短缺点: A的位数限制了立即数的范围立即数寻址形式地址A就是操作数本身,又称为立即数,一般采用补码形式寻址方式EA1OPACPU执行:取指令访存1次执行指令访存0次不考虑存放结果共访存1...次优点: 指令执行阶段访问主存,指令执行时间最短缺点: A的位数限制了立即数的范围直接寻址形式地址A就是操作数的真实地址,即EA1=A||寻址方式|EA1||--------|--------|---...|完成一次加法: 记栈顶单元Msp(Msp)-->ACC   数据移入累加寄存器ACC(SP)+1-->SP   栈指针加一(Msp)-->X   数据移入通用寄存器(SP)+1-->SP   栈指针加一

    24210

    CPU保护模式

    Hi~朋友,点点关注迷路 摘要 为什么需要保护模式 寄存器扩展 寻址扩展 运行模式反转 指令扩展 1....16位CPU时的寄存器只有16位的宽度,为了可以访问到20位地址总线的寻址空间(1MB),我们需要借助基址:内偏移地址的方式来突破16位寄存器的访问限制,这种方式在当时只是一种妥协。...第2行代码的含义是将0x1234写入bx寄存器指向的内存地址处(写入的数据宽度为2字节),符合是16位模式,因此包含任何反转前缀。...比如我们常用的push指令: 5.1 push压入立即数 当运行在实模式下时: 如果立即数是8位,会将其扩展为16位,然后再将sp-2 如果立即数是16位,则将sp-2 如果立即数是32位,则将sp-...4 当运行在保护模式下时: 如果立即数是8位,会将其扩展为32位,然后再将sp-4 如果立即数是16位,则将sp-2 如果立即数是32位,则将sp-4 5.2 push压入寄存器 当运行在实模式下时,

    83960

    16位汇编第第四讲常用的7种寻址方式

    操作数, 例如 mov ax,1234 那么操作数就是 ax,和 1234 其中 1234成为源操作数,ax成为目标操作数 为什么这样说,因为我们要把源操作数 通过 mov 传送指令, 传送给 目标操作数...ax 对于操作数而言   1.操作数可以是一个具体的值(也就是 立即数,其中立即数是后面翻译过来的,叫做(imm缩写))   2.操作数可以是存放数据寄存器(上面也说了, ax目的地操作数)   3....,暂时就先把这些认定为mov即可.后面会一一讲解指令   操作数, 例如 mov ax,1234 那么操作数就是 ax,和 1234 其中 1234成为源操作数,ax成为目标操作数 为什么这样说,因为我们要把源操作数...通过 mov 传送指令, 传送给 目标操作数ax 对于操作数而言   1.操作数可以是一个具体的值(也就是 立即数,其中立即数是后面翻译过来的,叫做(imm缩写))   2.操作数可以是存放数据寄存器...: 机器代码格式       操作码 立即数       A1         0020 寄存器间接寻址方式 有效地址存放在基址寄存器BX或变址寄存器SI、DI中 默认的地址在DS寄存器,可使用超越前缀改变

    79950

    汇编基础

    第一章,汇编语言产生 1,机器语言与汇编语言一一对应 2,汇编指令:Mov AX,BX 将寄存器BX,移入AX 3,寄存器:CUP中的存储器,注意不是CUP的缓存, 4,汇编--》编译器---》机器码...2,mov al,[0] 将ds:0 内存单元中的数据移入al 3,但不能直接把值移入ds ,mov ds 1000H:错误的 8086cpu不支持放入寄存器,硬件问题。...只能数据 --》通用寄存器--》寄存器 ?...,无法转化为机器指令,程序无法执行 # end的作用:通知编译器程序结束,告诉编译器程序入口在哪里,当指定入口时,会按照上到下执行,因此若现定义数据,会把数据当做指令执行 代码中使用栈 问题:将上面程序中的数据逆序存放...立即数:直接包含在机器指令中的数据,存在于指令缓冲区:mov ax,1 :b80100 B8表示移动立即数到ax 指令寄存器: 就是cpu读取一条指令 经过数据总线条指令存出入指令缓冲器 读取该指令要操作的数据

    1.4K41

    16位汇编第三讲 分段存储管理思想

    因为分段是为了更好的管理数据和代码,就好比C语言为什么会有内存4区一样,否则汇编代码都写在一起了,执行的话虽然能执行,但是代码多了,数据多了,搞不清什么是代码 什么是数据了....,下面要分段了,所以需要给ax赋值 5 mov ds,ax 开始分段(分配数据),把ax的值给寄存器ds,可能有人会说,ds也是寄存器,为什么直接写 mov ds,1000,...就是这个栈初始化,(一般来说不会初始化的)   ;db 100 dup(0) 这里就是分配了100个字节,都初始化为0  org 64      这个意思就是当前的断寄存器分配64k,如果分配64k...,以及IP指令执行的位置(这也就是为什么通过exe文件格式,设计出来的入口函数,如果用Debug,你是没办法修改的) EXE文件格式后面细讲,主要现在有个概念,就是EXE记录了信息,各种寄存器的信息即可...主要常用的有三种寻址方式 1.立即数寻址方式 2.寄存器寻址方式 3.存储器寻址方式 先介绍第一种,(第二种第三种,第四讲细讲) 第一种 比如我们写了一汇编代码,反汇编的时候可以看出机器码 有的时候要通过机器码反汇编出来汇编代码

    1.5K60

    Android逆向开发之smali语言的学习

    v1,v2 将v2中的值移入到v1寄存器中(4位,支持int型) move/from16 v1,v2 将16位的v2寄存器中的值移入到8位的v1寄存器中 move/16 v1,v2 将16位的v2寄存器中的值移入到...,v2 将16位的v2寄存器对(一组)中的值移入到8位的v1寄存器中 move-wide/16 v1,v2 将16位的v2寄存器对(一组)中的值移入到16位的v1寄存器中 move-object v1,...v2 将v2中的对象指针移入到v1寄存器中 move-object/from16 v1,v2 将16位的v2寄存器中的对象指针移入到v1(8位)寄存器中 move-object/16 v1,v2 将16...位的v2寄存器中的对象指针移入到v1(16位)寄存器中 move-result v1 将这个指令的上一条指令计算结果,移入到v1寄存器中(需要配合invoke-static、invoke-virtual...等等 思考 为什么方法中包括参数在内需要3个寄存器,但是在定义的时候只写了两个却也不报错呢?

    1.9K30

    实模式下CPU如何获取数据

    Hi~朋友,点点关注迷路 摘要 寄存器 实模式下的CPU寻址方式 寄存器寻址 立即数寻址 内存寻址 栈 1....这里可以看出寄存器的主要用途: 为CPU存储数据 解决从其他硬件获取数据与CPU执行速度匹配的问题 CPU中的寄存器大致分为两类: 内部使用,对程序员不可见(不可使用):GDTR(全局描述符表寄存器)...在我们计算机加载我们的程序以后,会将我们的应用程序在内存大致分为三个部分: 代码:该内存区域存储了我们应用程序的指令 数据:该内存区域存储的是我们需要使用到的数据:CPU运行时的必须 寄存器主要由以下分类...: CS(代码寄存器):存储代码的起始地址 DS(数据寄存器):存储数据的起始地址 SS(栈寄存器):存储栈的起始地址 ES、CS、GS(附加寄存器) 可见寄存器CS:内部寄存器IP存储了...栈 栈是一种什么数据结构这里就不说了,我们这里讲的栈是一片内存区域,栈中的内存地址也是采用寄存器SS中的值*16 + 栈指针寄存器SP来访问。

    69250

    16位汇编第五讲各种指令详解第一讲

    Mod 寻址方式是哪一种 Mem 内存 Imm 立即数 Accum 累加寄存器(ax) Segreg 寄存器(ds ss es cs) M8 代表内存8位,一个字节 M16 代表内存16位,两个字节...请注意,立即数不能直接给寄存器,都是通过中转的 mov 注意事项 1.两个操作数的类型不一致       例如源操作数是字节,目的操作数是字,或者是相反 例如  mov al,050AH al是八位寄存器...当中,显然内存没有内置CPU,所以通过寄存器中转,所以不能直接这样     3.小心操作寄存器       1.立即数不能直接给寄存器                  例如 mov ds,100...,比如你的这条指令下面还有个mov ax,0 当你上面改了,那么mov ax,0 永远不会执行,而你熟悉的改了cs的值可以,如果不熟悉那么代码就被破坏,程序就会执行崩溃.       3.寄存器寄存器不能直接数据传送...是16位,比如使用关键字) SAHF   S可以理解为设置,或者保存的意思  意思就是 AH的高八位当做标志位给Flag寄存器的标志位赋值 表示我们通过AH的值,设置flag标志寄存器 如果我们要把标志位都清零怎么办

    1K50

    【现代操作系统-前三章理解】进程 线程 内存 执行程序 GPU 的理解

    decode, ID) 在fetch_decode_exec()函数中用这条指令的第一个字节0xb8来查找switch-case的分支, 发现这一指令的操作数宽度是4字节的mov指令, 形式是将立即移入寄存器...在x86中, 通用寄存器都有自己的编号,I2r形式的指令把寄存器编号也放在指令的第一个字节里面, 我们可以通过位运算将寄存器编号抽取出来; 立即数存放在指令的第二个字节, 可以很容易得到它....于是先驱为CPU创造了寄存器, 可以让CPU把正在处理中的数据暂时存放在其中....我们只要将一指令序列放置在存储器中, 然后让PC指向第一条指令, 计算机就会自动执行这一指令序列, 永不停止....存储器, 计数器, 寄存器, 加法器, 这些都是数字电路课上学习过的部件吗? 也许你会觉得难以置信, 但先驱说, 你正在面对着的那台无所不能的计算机, 就是由数字电路组成的!

    87320

    16汇编第十讲完结Call变为函数以及指令的最后讲解

    Call下一条指令执行的位置的地方 但是现在我们间Call,也就是不在一个中,这个时候栈不光会保存返回地址,还会保存当前CS寄存器的地址 这样返回的时候  CS:IP返回,但是现在有一个问题,就是我们自己根本就平不了栈...,我们把IP拿出来了,给IP,CS寄存器根本没办法改,这样我们必须同时修改CS:IP的值才能回到以前的地方,但是现在没办法了,因为你改IP回跳,改CS会跳,必须同时改,弄不了,所以弄一个retf的指令去帮我们去做...注意retf 你也需要平栈,比如我们压入了两个参数,就要 retf 4, retf会默认把栈顶4个字节的数据取出来分别给 ip和CS寄存器,但是剩下4个字节都是我们的参数,比如自己去释放,让SP的加...,让CPU功耗降低,执行,以前是无限循环NOP指令 但是NOP也是一个指令也会有功耗,所以现在改为HLT指令了,执行了这个指令HLT不进行任何操作,当我们发送了一条指令过去之后,就会脱离暂停状态 就好比电脑挂机了...F就会计算浮点数了 浮点数有7个寄存器 ST -> st7 按照标号来的 浮点处理器的st不能和通用寄存器一样去使用,它是吧ST寄存器压入栈中,让前两个栈中的数据相加返回的 关于浮点处理,后面再说,这个不是

    921100

    Lcd(一)显示原理

    显存:SoC在内存中选一内存,用来存放颜色数据,然后通过配置将LCD控制器和这一内存连接起来,构成一个映射关系,一旦这个关系建立以后,LCD控制器就会自动从显存中读取像素数据传给LCD驱动器,LCD...我们都买过显卡,知道买独立显卡的好,那么为什么独显好? 独显跟集显的区别又在哪里?...RGB接口信号: LCD_HSYNC: 行同步信号,表示一行数据的开始,LCD控制器在整个水平线(整行)数据移入LCD驱动器后, 插入一个LCD_HSYNC信号; LCD_VSYNC: 帧同步信号...,表示一帧数据的开始,LCD控制器在一个完整帧显示完成后立即插入一个LCD_VSYNC信号, 开始新一帧的显示;VSYNC信号出现的频率表示一秒钟内能显示多少帧图像,称为“显示器的频率” LCD_VCLK...用户只需要把要显示的图像数据写入帧内存中。 2、LCD液晶屏输入时序 ? ? ? 十、相关寄存器 寄存器:DISPLAY_CONTROL 设置为10或11;RGB模式可行即可; ?

    2.3K30

    3.3 语法规则

    为什么选择我的视频? 全程考点讲解:每一节视频都紧扣考试要点,拒绝冗余,专注于最关键的知识点。 系统且高效:我已经为你精心准备了系统的学习资料,让你不再迷茫。...修正: 指定操作数类型,如 MOV WORD PTR [0200H], 56H,表示将 16 位数据写入指定地址。 2....寄存器寻址与地址要对应 错误示例: MOV ES:AX, DX 问题: 寄存器和一般寄存器不能混用。 修正: 寄存器操作必须与相关。例如,用 MOV ES, AX 来加载寄存器 ES。...CS、IP、立即数不能作为目的操作数 错误示例: MOV CS, AX 问题: CS 和 IP 是特殊寄存器,不能直接作为目的操作数。...当 DS、ES、SS 作为目的操作数时,不能使用立即数作为源操作数 错误示例: MOV DS, [1500H] 问题: DS、ES、SS 不能直接从立即数加载。

    7610

    ivx动效按钮 基础按钮制作 02

    在行按钮中的绝对定位中,我们创建一个行,命名为移入,接下来我们做一个移入动效: 此时这个行会覆盖掉文本区域,我们将按钮文本移动至行之上: 此时这个行就不会盖掉之前的文本: 接着更改这个行为我们喜欢的颜色...: 接着我们先把行的坐标置于原点: 二、给动效块添加动画 此时我们需要将这个动效块行放置于这个按钮之外,那么此时可以给予指责格行的 x 值为负,并且由于该行还需要向上移动一距离,所以该行的...y 值也需要为负一距离: 接着,咱们需要给这个动效块添加动画,点击行,添加轨迹: 在轨迹中设置动画长度为 0.5: 随后我们在关键帧区平均打上 3 个关键帧,时间位置分别是...三、设置鼠标移入事件 接着咱们给自定义行设置鼠标移入事件,移入时播放这个轨迹动画到下一个关键帧: 如果选择播放动画将会播放完动画效果,这个效果并不是我们所需要的,所以在这里只需要选择播放至下一个关键帧即可...设置完毕后再设置一个鼠标移出事件,设置其轨迹播放至上一个关键帧,为什么直接设置播放至下一个关键帧是因为这样做会使动画无限生效,否则播放完了再调用关键帧播放则会无效,并且之前设置3个关键帧是为了使这个帧动画完备

    2.3K20
    领券