MASM:如何解决8086编程中的立即模式非法?

2023-12-05

我正在解决一个基本问题汇编语言编程添加 BCD 数字和两个 ASCII 数字,为此我必须使用DAA 和 AAA现在我尝试将 AX 寄存器中存储的结果存储到我想要的内存位置,但没有明白为什么以下代码给我错误立即模式 非法下面是我到目前为止编写的代码,请帮助我如何消除这个错误 PS:我只想将结果移动到所需的内存位置,而不是任何特殊用途寄存器

ASSUME CS:CODE,DS:DATA
DATA SEGMENT
DATA ENDS
CODE SEGMENT
START:
 MOV AX,0000H
 MOV DS,AX
 MOV AL,59
 MOV BL,35
 ADD AL,BL
 DAA
 MOV CX,0000
 MOV ES,CX
 MOV [0000],AX
 MOV AL,04
 MOV BL,05
 ADD AL,BL
 AAA
 MOV CX,0000
 MOV ES,CX
 MOV [0010],AX
 MOV AH,04CH
 INT 21H
CODE ENDS
END START

您遇到的是 MASM 语法中的一个怪癖。当你有一个内存操作数,里面只有一个立即值,而不是一个标签(即[0000] or [0010]),MASM将生成一个Immediate mode Illegal错误。这样的指令确实没有任何问题,但 MASM 有特定的语法。您必须显式指定段寄存器。许多汇编者会假设DS对于这种情况,但 MASM 没有。

要解决此问题,请使用以下语法:

MOV [DS:0000],AX
MOV [DS:0010],AX

MASM 还允许:

MOV DS:[0000],AX
MOV DS:[0010],AX

第一种是首选,因为 TASM(与 MASM 兼容的汇编器)不支持后一种形式。如果将段放入其中,它应该可以与 MASM 和 TASM 汇编器以及开源 JWASM 汇编器一起使用。

如果你的内存操作数包含一个寄存器和一个偏移量,那么 MASM 不会抱怨,所以这是有效的 MASM 语法:

MOV [BX+0000],AX
MOV [BX+0010],AX

如果您希望将立即值(源)移动到只是立即引用的内存地址,则语法如下所示:

MOV WORD PTR [DS:0000], 0100h
MOV BYTE PTR [DS:0000], 00h

应该注意的是,值 0010 是十进制的 10(不是十六进制)。目前尚不清楚您是否打算在代码中使用十进制或十六进制。十六进制值有一个H suffix.


注意:我发表了关于将现已删除的段寄存器清零的评论。虽然我的评论是正确的,但我看起来不够仔细,没有意识到您确实将 DS 设置为 0000,因此您的代码正在访问 0000:0000 和 0000:0010。在这方面,您的代码是正确的,尽管尚不清楚您为什么要修改那部分内存。在 IBM-PC 兼容系统上,中断向量表 (IVT) 位于存储器的前 1024 字节中。您可能使用的是非 IBM-PC 兼容系统,并且您所做的事情可能根本不是问题。我只是想提醒您一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MASM:如何解决8086编程中的立即模式非法? 的相关文章

  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • AVX512 掩码寄存器(k1...k7)的 GNU C 内联 asm 输入约束?

    AVX512 为其算术命令引入了 opmask 功能 一个简单的例子 上帝螺栓 org https godbolt org z P7xWD8 include
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 从 NASM 调用 C 函数 _printf 会导致分段错误

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli

随机推荐

  • 如何更改 Shiny 中的“超出最大上传大小”限制并保存用户文件输入?

    我最近了解到 R Shiny 程序默认对文件上传施加最大大小限制 我不知道具体大小是多少 但我猜是 5 000 KB 我想取消这个限制 我该如何做到这一点 对于用户上传的大小有什么一般的经验法则 此外 这是另一个注释 但相关的是 如何保存用
  • 比较两个表,查找缺失行和不匹配的数据

    我想比较两个表并获得一组结果 其中查找值不匹配以及另一个表中缺少键值 第一部分适用于以下查询 SELECT FROM SELECT mID mLookup FROM m t1 FULL OUTER JOIN SELECT aID aLook
  • Array() 的文档在哪里? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 正在浏览ruleby源代码 我注意到他们正在调用容器 和 这是我很少见到的 事实上 我唯一见过的地方就是制造宝石 快速浏览表明容器子类Array 然
  • 如何解决错误“java.net.ConnectException:无法连接到 localhost/127.0.0.1:8000”

    我目前正在开发一个应用程序android studio with Kotlin和一个API系统使用django rest framework 我想访问我的本地服务器127 0 0 1使用 android 模拟器从 API 方法中获取一些值
  • 使用 IO 在 C# 中读取十六进制

    我正在从 C 转向 Java 但似乎找不到任何相关信息 我正在尝试读取使用十六进制的文件 在Java中我使用 String s Integer toHexString hexIn if s length lt 2 s 0 Integer t
  • SVG 文件中的 JavaScript

    我有一个特殊请求 因为我想直接在 SVG 文件内生成 SVG 到目前为止 我已经使用生成 SVG 标签编写了以下代码 但屏幕上没有显示任何内容 我可能做错了什么 但我不知道在哪里 因为它不会引发任何错误
  • WPF中有没有类似Visual Studio工具箱的控件?

    我正在使用 WPF 编写一个应用程序 我需要制作一些看起来像 Visual Studio 工具箱的东西 请参见图片 我应该为此使用什么控件 我想你正在寻找类似的东西AvalonDock
  • ResultSet.getString(Date) 根据驱动程序而有所不同

    我正在使用 Oracle Database 11g 企业版版本 11 2 0 2 0 64 位生产 具有分区 OLAP 数据挖掘和实际应用程序测试选项 我有一个表 其架构是 COLUMN NAME DATA TYPE DATA TYPE M
  • R中带有if语句的线性回归[重复]

    这个问题在这里已经有答案了 我有一个虚拟变量black where black 0是白色的并且black 1是黑色的 我正在尝试拟合线性模型lm为了black 1仅类别 但是运行下面的代码给出了不正确的系数 R 有没有办法运行一个模型if语
  • 将图像/文本文件从 Android 发送到 Web 服务器(本地主机)

    我对 Android 编程非常陌生 我的任务是将图像和文本数据发送到 Web 服务器 本地主机 但是我已经尝试了很多代码来完成这项工作 它们都不起作用 每当我尝试执行代码时 我的应用程序就会崩溃 因此我决定调试代码并查看问题所在 然后我发现
  • Github Actions:关于 set-output 的警告,但不使用它

    我正在使用 GitHub 操作 构建 Python 应用程序 运行 linting 代码覆盖率和测试 在操作结束时 我收到以下警告 1 warning build The set output command is deprecated a
  • 添加边缘以散点图标记

    我正在用 python 制作 matplotlib 绘图 我有一个标记就是我 使用以下方法将其放在绘图上 plt scatter x position y position c z position cmap cm bwr marker x
  • 将多个列表框项目添加到数据库

    Is there any easy way to save the items in listbox to the database I am using access database for windows form where use
  • 如何使用 LINQ to Objects 安排作业而不重叠?

    这是另一个资源分配问题 我的目标是运行一个查询 将任何时隙的最高优先级作业分配给两个 CPU 核心之一 只是一个示例 所以我们假设没有中断或多任务处理 注意 这类似于我之前关于分区的文章 但重点关注重叠时间和分配多个项目 而不仅仅是最优先的
  • 删除 ng-bind-html-unsafe 后,如何注入 HTML?

    我正在尝试使用 sanitize提供者和ng bind htm unsafe指令允许我的控制器将 HTML 注入到 DIV 中 但是 我无法让它工作 div div 我发现这是因为它已从 AngularJS 中删除 谢谢 但没有ng bin
  • 紧密循环中虚拟函数的成本

    我所处的情况是 我的游戏对象具有虚拟函数 Update 有很多游戏对象 目前略多于 7000 个 并且循环调用所有这些对象的更新 除其他外 我的同事建议我们应该完全删除虚函数 正如您可以想象的那样 这将需要大量的重构 我见过这个答案但就我而
  • 有没有办法抑制 Firebase Functions Firestore 触发器?

    我在用聚合用于跟踪 Firestore 中聚合数据 例如文档总数等 的技术 每当article创建或删除文档时 我正在使用 Firebase 函数的触发器来更新单独文档中的聚合数据 exports onCreateArticle funct
  • Python Minidom XML 查询

    我正在尝试使用 lxml 查询此 XML
  • python: ctypes,在 python 中读取 POINTER(c_char)

    我有一个 ctypes 字段 它是POINTER c char 根据文档 c char p 必须对我的应用程序不起作用 https docs python org 3 7 library ctypes html ctypes c char
  • MASM:如何解决8086编程中的立即模式非法?

    我正在解决一个基本问题汇编语言编程添加 BCD 数字和两个 ASCII 数字 为此我必须使用DAA 和 AAA现在我尝试将 AX 寄存器中存储的结果存储到我想要的内存位置 但没有明白为什么以下代码给我错误立即模式 非法下面是我到目前为止编写