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

为什么我不能改变段寄存器的值?(MASM)

在计算机中,段寄存器是一种特殊的寄存器,用于存储内存段的基地址。在 x86 架构中,有 4 个段寄存器,分别是代码段寄存器(CS)、数据段寄存器(DS)、堆栈段寄存器(SS)和附加段寄存器(ES)。

在汇编语言中,可以使用 MOV 指令来修改段寄存器的值。例如,下面的指令将数据段寄存器的值设置为 0x1000:

代码语言:txt
复制
MOV DS, 0x1000

然而,在现代操作系统中,段寄存器的值是由操作系统来管理的,因此在用户程序中直接修改段寄存器的值是不被允许的。这是因为操作系统需要使用段寄存器来管理内存,如果用户程序随意修改段寄存器的值,就可能会导致操作系统的内存管理出现问题,从而导致系统崩溃。

因此,如果你在使用 MASM 汇编语言时遇到了无法修改段寄存器的值的问题,那么可能是因为操作系统限制了这种操作。如果你需要修改内存段的基地址,可以尝试使用其他方法,例如使用基址寄存器(BP、SP、BX、SI、DI)或者使用偏移量来访问内存。

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

相关·内容

Mac下写8086汇编

前期准备 我们课上讲的是8086下的16位汇编,如此远古的操作系统导致我在配置环境时遇到了很多问题。...: data segment;定义数据段 x db 'A'; define byte定义x为一个值为A的ASCII码的字节型变量 y dw 30h; define word定义y为一个值为30h...(48)的字型变量 z dd 40h; define double word定义z为一个值为40h(64)的双字型变量 a dw ?...assume cs:code,ds:data; assume伪指令用于确定段与段寄存器的关系,assume不会翻译成机器指令,但会存在于exe的文件头中,这会方便DOS重新分配内存时改变对应地址指针寄存器的值...start:mov ax,data;汇编后段名变成立即数,立即数不能直接赋值给段寄存器 mov ds,ax;段寄存器将指向data数据段 mov dl,x;显示字符前将字符移动到dl mov

2.6K30

为什么我改变了对区块链的看法

我大学时学习密码学,而比特币作为一个新颖且非常规的概念出现。在我的一门课程中,我们分析了与比特币非常类似的加密货币的密码学构建模块。尽管我钦佩算法和协议的精妙,但我对 区块链技术 并不特别感兴趣。...我的主要保留意见是,尽管其设计创新,但它并没有解决我个人认为重要的任何问题。 我对区块链的怀疑一直持续到几个月前,当时我与 Aerospike 的一位新客户合作, BSV 协会。...我选择使用“核心银行系统”而不是“加密货币”是为了避免与后一个术语相关的各种含义。...在 前一篇文章 中,我详细阐述了为什么这种方法非常低效。 通常,这些解决方案采用可扩展数据库,通过复杂的数据提取、转换、加载 (ETL) 流程从不可扩展的 RDBMS 中检索数据。...没有不断升级的复杂性。没有耗时数年、耗资数十亿美元的项目来启动一个应用程序。 正是这种愿景改变了我对区块链的看法。

9810
  • 汇编DOS与Windows Masm编译运行代码步骤详解

    实现虚拟DOS环境下masm5的编译和运行 【两种调试代码的方式】 【DOS环境下masm5的编译和运行】 ---- 1、源代码: STACKS SEGMENT STACK ;定义一个栈段...,13,10,'$' ;13,10分别对应ascII值的代表回车和换行, $是串结束符 DATAS ENDS CODES SEGMENT;定义一个codes段 ASSUME...CS:CODES,DS:DATAS;段分配语句,将代码段codes与段寄存器cs联系起来,将数据段datas与数据寄存器ds联系起来 START: ;汇编开始部分,类似于main函数{ MOV...AX,DATAS;把数据段寄存器AX的值赋为DATAS,就是让数据段指向正确的位置 MOV DS,AX;将数据段地址通过ax寄存器装入ds寄存器 LEA DX,STRING;...理解每一步的意思,每一段代码的含义让我花了很大的功夫。

    1.3K10

    《汇编语言》——笔记(一)

    任意时刻,CS:IP所指向的指令就是下一条指令所在的段地址和偏移地址。 修改CS:IP的值 我们能够用指令读写的部件只有寄存器,通过实现改变寄存器中的内容实现对CPU的控制。...前面提到过 mov指令, mov ax,123将 ax中的值设为 123,8086CPU大部分寄存器的值,都可以用 mov指令来改变, mov指令被称为传送指令。...但是, mov指令不能用于设置CS、IP的值。8086CPU提供了另外的指令来改变它们的值。 若想同时修改CS、IP的内容,可用 jmp短地址:偏移地址的指令来完成。...sudo apt install dosbox mkdir MASM vim .dosbox/dosbox-0.74.conf #文件末添加如下指令 mount c: ~/MASM c: debug MASM...为什么呢?栈本质上也是一段内存空间,还记得数据在内存中的存放方式吗。字型数据有两个单元组成,高地址存放高8位,低地址存放低8位。

    1.2K20

    JS是如何计算 1+1=2 的?

    这一句是将寄存器eax设置为1 __ add(eax, 1) //这一句将寄存器的值加1 __ ret(eax) //这里返回寄存值的值 (以上只是示例,伪代码不要当真) 上面是C++代码,在内存里生成机器码大概长这个样子...像mov它只是诸如1010这种汇编指令的代名词,人类写的是mov,汇编编译器译完就是1010了。 eax是寄存器地址,'mov eax,1'这句指令就是将寄存器的值设为1。...浏览器反驳道:“虽然是解释型语言,为什么不能先编译再执行?在Java版JS解释器rhino中,js脚本不是被编译为Java字节码执行的吗?” 作者觉得讨论有点跑偏了,道:“言归正传。...看来v8并不知道1+1为什么等于2,v8为了执行js快一点,大量占用了内存空间,是用”空间换时间”的方法,博得了“v8引擎执行快”的美名。具体为什么1+1等于2,还需要问问CPU。...CPU不理会,继续说道:“首先,当我看到'mov eax 1',就知道这是叫我将值1移动到寄存器eax处。我有一个助理,叫指令指挥官,他负责指令的分类与调度。

    1.9K20

    第 1 课:计算机是如何计算 1+1=2 的?

    当然了电磁理论不会轻易改变,除非我们生存依赖的物质空间生存发生了改变,例如进到了另一个空间,当然这不属于本书讲述的内容,我们在此不必展开。...这一句是将寄存器 eax 设置为 1__ add eax 1 // 这一句将寄存器的值加 1__ ret eax // 这里返回寄存值的值// 注:以上仅是伪代码示例 上面是 C++ 代码,在内存里生成机器码大概长这个样子...V8 继续道,eax 是寄存器地址,「mov eax 1」这句指令就是将寄存器的值设为 1。同时,它下面那句代码 「add eax 1」是将寄存器的数值加 1。...浏览器不服气,虽然是解释型语言,为什么不能先编译再执行?在 Java 版 JS 解释器 rhino 中,JS 脚本不是被编译为 Java 字节码执行的吗?...CPU 继续道,首先,当我看到「mov eax 1」这条指令,就知道这是叫我将值 1 移动到寄存器 eax 处。 内存问道,你是怎么什么调度指令的?怎么知道什么指令应该怎么执行的呢?

    1.9K20

    【汇编语言】寄存器(CPU工作原理)(七)—— 查看CPU和内存,用机器指令和汇编指令编程

    不必尝试到底能不能运行,绝对不能 相似的,微软的masm也无法在64位版本的系统上运行。...此时会弹出两个窗口,我们只需要其中一个,另一个最小化即可 配置 如图所示,此时为盘符 Z (虚拟磁盘);首先需要对 debug.exe 文件所在的磁盘(我的 MASM.zip 的解压盘:完整的路径为...D:\DOSBox\MASM)做一次 mount(挂载)操作,比如我们将其挂载到 DOSbox 的 C 盘: 运行 1.4 R命令 在这里我们可以看到所有寄存器的里面的内容 如下图,在所有寄存器的下方...修改一个寄存器中的值:比如AX中的值,可用R命令后加寄存器名来进行,输入“r ax”后按 Enter 键,将出现“:”作为输入提示,在后面输入要写入的数据后按Enter 键,即完成了对 AX中内容的修改...当然,我们也可以改变内存、寄存器中的内容。 也可以指定D命令的查看范围,此时采用“d段地址:起始偏移地址 结尾偏移地址”的格式。

    27210

    【汇编语言】和loop指令(三)—— Debug与masm的指令处理差异与loop,的联合应用

    我们还是希望能够像在 Debug 中那样,在“[]”中直接给出内存单元的偏移地址。这样做,在汇编源程序中也是可以的,只不过,要在“[]”的前面显式地给出段地址所在的段寄存器。...“[]”的前面显式地给出段地址所在的段寄存器。...比如 mov al, ds:[0] 如果没有在“[]”的前面显式地给出段地址所在的段寄存器,比如 mov al, [0] 那么,编译器masm 将把指令中的“[idata]”解释为“idata” (2)...如果在“[]”里用寄存器,比如 bx,间接给出内存单元的偏移地址,则段地址默认在ds中。...(2)我们是否将 ffff:0~ffff:b中的数据直接累加到dx中? 当然不行,因为ffff:0~ffff:b中的数据是8位的,不能直接加到16位寄存器dx中。

    8510

    汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写

    .:        有20位地址总线     每个段的大小是64kb     16个不同的段.    CS DS寄存器中保存的是段的起始地址. 上面主要就是说. 我怎么寻找逻辑地址....引入了GDT LDT等段描述符表   CS DS不变. 因为32位地址总线可以存储地址了.所以段寄存器就都为0了.但是是保护模式.所以引入了段选择子. (涉及到内核知识了) 这些了解即可....mov ax,data ;将数据段给ax寄存器保存 mov ds,ax ;将ax给DS寄存器保存....的步骤 1.解压MASM5.0到你的盘符 2.安装DosBox0.74 3.打开DosBox0.74 4.在DosBox中使用指令切换到你的MASM盘符 例如: mount d: d:\MASM5.0...使用masm编译的时候.确保asm放在masm目录下面. 结果演示. 四丶32位汇编代码编写.   32位汇编代码编写.可以使用RadAsm编写.博客中已经写过.我们主要讲解一下在VC中的写法.

    1.9K20

    简单聊聊什么是段

    看下面这段汇编代码: 如果你想要通过 MASM 的方式来取得 ds:[0] 处内存地址的话,就需要显示指定段寄存器,如果没有显示指定的话,默认按照 01 数值来处理。...所以我们可以总结一下上面所探讨的内容(基于 MASM 汇编编译器下) mov al,[0] :将数值 0 送入 al 寄存器中,(al) = 0。...在汇编语言中,一般通过 [bx] 来给出偏移地址,它的段基础在 ds 中,ds 是默认的段寄存器。...不过,只有一个 ds 段显然是无法应对复杂程序的寻址方式的,所以还可能会有多个段,如下所示: 上面列举了四种不同的段寄存器和寻址方式。...并不是我不想执行了,而是系统不让我执行了,因为系统死机了。。。。。。大家可以试试。 所以,在不清楚这段内存空间是干什么的时候,最不好要随意向内存空间写入数据。

    8310

    汇编基础

    修改CS,IP 1,只能操作寄存器控制cpu,因此需要控制cs,ip 2,mov 传送指令,可修改ax,但不能cs,ip 3,jmp 2ae3:3 跳转的意思 此时cs 为2ae3,ip为3 代码段...2,mov al,[0] 将ds:0 内存单元中的数据移入al 3,但不能直接把值移入ds ,mov ds 1000H:错误的 8086cpu不支持放入段寄存器,硬件问题。...),cs(代码段),es(扩展段) bx,si,di,bp 8086可以用[...]表达内存地址的寄存器:bx bp si di,[ax]是错误的 这几种不能任意组合 bx,si bx,di bp,si...,放入地址加法器 数据放入目的地址 寄存器 mov ax,bx:89D8 段地址和偏移地址 mov ax,ds:[bp] 强制改变段地址 寻址方式 ?...1,debug就是改变了1号中断的程序,改为debug的程序 响应中断的特殊情况 有时候遇到中断信号CPU也不会响应, 例如: SS:SP的设置过程,ss,sp需要同时改变,因此不能被中断 mov设置

    1.5K41

    汇编笔记

    P 将循环执行完/执行到 int 21h 处 G 0016 执行到0016处 ----------------------- rf 修改标志寄存器的值 Q 退出debug 编译连接运行 edit...编写程序 masm 输入源程序路径 直接回车,按照默认目标文件名 直接回车,按照默认列表文件(源程序编译为目标文件的中间结果) 直接回车,不生成交叉引用文件(中间结果) link 输入目标文件名...输入可执行文件名/直接回车用默认名 直接回车,不生成映像文件 直接回车,忽略库文件名输入 会出现警告:no stack segment 不用理会 1.exe 运行程序 快速编译和链接 masm...地址寄存器 es 段地址 ds 存放要访问数据的段地址 ss 堆栈段,与sp配合使用 sp 堆栈偏移地址,与ss配合 cs:ip 指向要执行的指令地址 ds:si 源地址 es:di 目的地址 ----...负号标志位 symbol flag cld df=0 正向复制 std df=1 反向复制 数据定义 db 字节 dw 字 dd double字 常数/立即数 不能字母开头,需要加0。

    42140

    我为什么要创建一个不能被实例化的类

    但如果有一天,你发现我写了这样一个类: class People: def say(self): print(f'我叫做:{self.name}') def __new...__(self): raise Exception('不能实例化这个类') kingname = People() kingname.say() 一旦初始化就会报错,如下图所示:...一个不能被初始化的类,有什么用? 这就要引入我们今天讨论的一种设计模式——混入(Mixins)。 Python 由于多继承的原因,可能会出现钻石继承[1]又叫菱形继承。...显然,这样写会报错,因为两个类的实例是不能比较大小的: 但在现实生活中,当我们说 某人比另一个人大时,实际上是指的某人的年龄比另一人年龄大。...混入: 不能包含状态(实例变量)。 包含一个或多个非抽象方法。 参考资料 [1]钻石继承: https://en.wikipedia.org/wiki/Multiple_inheritance

    3.4K10

    CC++:堆栈面面观

    如果你是x64的CPU装了32位系统,那么也不会使用到x64的寄存器(比如r8d),或者不能完整使用x64CPU的寄存器,比如rax。...用于存放返回值 call printf leave ret 我删除一些不必要的信息,并且增加了注释。 可以看到,上面的代码中,函数参数并未使用到栈来传递参数,而是通过寄存器来传递参数。...当然这并不能说用栈来传递参数的说法是错的,因为寄存器的数量是有限的。...上面我使用的函数的参数类型都是整型int。而如果参数类型是浮点型,指针等等其他类型就不能使用寄存器来传递函数参数了。具体这些问题探究起来就太多了,我在这里也只是抛砖引玉。大家可以自己去试试。...推荐一篇文章《X86-64寄存器和栈帧》 说个题外话,上面我的代码如果开了优化会怎么样呢?用gcc -S -masm=intel -O 来编译一下看看。

    54720

    汇编语言 debug masm5.0的使用

    第一步: 从网站上下载MASM5.0到本地盘,然后运行dosbox0.74-win32-installer.exe,此时桌面会有快捷方式 另一个步骤就是:将你的masm下的文件全部复制到一个盘...随后 输入debug 就可以开始工作了 -R 查看、改变CPU寄存器的内容 -D 查看内存中的内容 -d 1000...:0 它会输出段地址从1000:0到1000:70的128个单元内容 -d 1000:0 9 输出从1000:0开始的9个单元内容 -E 改写内存中的内容...-e 1000:0 0 1 2 3 4 改变1000:0开始重写为0 1 2 3 4 -U 将内存中的机器指令翻译成汇编指令...要将你写的文件.asm放在.exe处 在c:\> 下输入masm 代表的是运行masm.exe (因为这里是虚拟目录,已经到达了.exe文件的前一个目录了) 然后输入文件名

    67510

    16位汇编中的伪指令

    ;开辟四个局部变量控件 push cx ;保存一起寄存器的环境,函数内部使用cx,但是函数完成之后需要把以前CX的值回复 ....你的核心代码 pop...所以都会翻译成等价的汇编代码了,我们看下反汇编,看下参数变为什么样子了 ?...我已经画出来了,大家看下会出现什么清空,这里给个提示 生成函数的步骤 我们发现了,我们应该先抬栈,在保存环境 以前的代码都是这样写的,但是伪指令生成的汇编代码我们没办法改,怎么办,也就意味着,如果开辟局部变量空间...MyData ends 使用:   使用的时候需要放在全局数据区的段里面 例如: MyData segment 结构体变量名称 结构体名称 的值> g_Data1...编译器会自动帮我们寻址去翻译 6.使用假设伪指令 访问全局变量 以前我们访问的时候 都是通过 lea 给基址寄存器,然后在通过内存访问直接修改里面的值,例如 lea bx,g_number mov word

    1.4K80

    汇编语言设计程序篇-03

    ,0456H add ax,bx add ax,ax mov ax,4c00H int 21H codesg ends end 将程序编译为obj对象文件 masm...test.asm; 将obj文件链接为可执行exe文件 link TEST; ---- 用Debug装载程序 DS寄存器存放的数据段的段地址,CS指向代码段的段地址 ---- 用Debug...,然后对应的IP寄存器值也会被改变,并且cs值会不断减去一,直到为0时,退出循环 ---- Loop指令使用再例 不能写成add dl al,因为会产生溢出,add dx al更不行 ----...es寄存器中的值为准 ---- 在代码段中使用数据 计算机中每一块地址应该用来做什么都是会提前由操作系统规定好的,如果我们随意乱放数据,例如: 我们将数据存放到存放着中断指令的内存位置处,那么不就出大问题了吗...CS寄存器不需要初始化之外,栈相关寄存器和数据段寄存器都需要手动初始化一下 ---- 在Debug中执行

    64710

    计算机是如何启动的?一文教你自制操作系统

    BIOS 中断 既然我们已经知道了计算机启动的上述过程,我们能不能编写自己的启动程序呢?答案当然是肯定的。...在中断触发后,BIOS 会去读取寄存器 AH 中的值,并根据这个字节的内容,来进行不同的操作,例如,如果 AH 中存储的是 13H,BIOS 就会在屏幕上显示一行字符串。 4.2....其他属性 下列寄存器中存储了显示所需的其他信息: ES:BP — 字符串在内存中的段地址与偏移地址 CX — 字符串长度 BH — 视频区页数 DH — 存储在第几行显示 DL — 存储在第几列显示 5...汇编器的选择 所以我们需要编写一段汇编代码,主流的汇编器主要有四个:微软家的 MASM、Borland 公司的 TASM、开源的 NASM 以及 GNU 汇编器。...编写我们自己的启动代码 ; author: techlog org 07c00h ; 将下列程序加载到内存地址 7c00h 处 ; 初始化段寄存器

    2.9K10
    领券