首页
学习
活动
专区
工具
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为一个为AASCII码字节型变量 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 中检索数据。...没有不断升级复杂性。没有耗时数年、耗资数十亿美元项目来启动一个应用程序。 正是这种愿景改变对区块链看法。

9210
  • 汇编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.2K10

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

    任意时刻,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.1K20

    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

    汇编知识扫盲之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.8K20

    汇编基础

    修改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.4K41

    汇编笔记

    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。

    40740

    汇编语言 debug masm5.0使用

    第一步: 从网站上下载MASM5.0到本地盘,然后运行dosbox0.74-win32-installer.exe,此时桌面会有快捷方式 另一个步骤就是:将你masm文件全部复制到一个盘...随后 输入debug 就可以开始工作了 -R 查看、改变CPU寄存器内容 -D 查看内存中内容 -d 1000...:0 它会输出地址从1000:0到1000:70128个单元内容 -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文件前一个目录了) 然后输入文件名

    62010

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

    但如果有一天,你发现写了这样一个类: 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++:堆栈面面观

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

    52320

    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中执行

    63610

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

    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.8K10

    汇编语言--高级汇编技术

    REG寄存器 LDS和LES都是取出SRC代表内存空间开始四个字节取出,前两个字节放REG,后两个字节放入DS或者ES中 ---- 标志寄存器传送指令 LAHF,SAHF,PUSHF,POPF...,data mov ds,ax ;地址 寄存器 ... code ends end start 完整段定义操作 ASSUME 寄存器:段名[,其他声明] 段名 SEGMENT...,进行宏展开,即将程序中用到宏地方,全部替换为其本来宏代码,这样带来后果是,代码占用内存大,但是没有了保存现场和恢复现场带来开销,开销小 ---- 宏中局部标号 一子程序中不能出现两个重复标号...对于80x86来说,除了相关寄存器没有扩展到32位,其他寄存器都扩展到了32位,而扩展到32位后寄存器,如果要使用,只需要在原先寄存器名字前,加上一个E即可,E表示extend ---- 80x86...寻址方式 ---- 80x86指令系统 ---- 80x86新增指令 ---- 条件设置指令 设置是标志寄存器 ---- Intel系列微处理器3种工作模式 ----

    1.6K31

    汇编debug与masm命令

    汇编语言这块是之前写在网易博客上,不过那个账号基本已经作废了,所以现在抽个时间把当时博客搬到CSDN上。...汇编命令(编译器masm命令):找到masm所在文件夹,在d:\MASM中,用cmd打开dos界面,输入“d:”切换到D盘,再输入“d:\MASM\masm”打开编译器中masm程序得到如下结果...下面几个直接输入空格,不生成这几个文件,知道提示所有工作都完成(0 warning error) 再按照上述格式找到MASM文件中link程序,输入所需“.obj”文件相对路径 ?...进入程序, -u命令:查看汇编代码; -t命令:执行下一条语句 -g + 内存:跳转到该内存所对应语句(再用t命令执行该条命令) -r命令:查看寄存器内容(后可直接接寄存器名称,...就只查看该寄存器内容) -d命令:后接内存地址,查看改地址后面8 * 16个字节空间地址(每行16个字节,共8行)后面是对应字符‘.’表示没有该数字对应字符 ?

    1.5K40
    领券