MASM32 中令人困惑的括号

2023-12-12

我正在尝试掌握 MASM32,但对以下内容感到困惑:

我认为括号用于间接寻址,所以如果我有预定义的变量

 .data
   item dd 42

then

 mov ebx, item

会将“item”的内容(即数字 42)放入 ebx 中并

 mov ebx, [item]

会将“item”的地址(即存储 42 的位置)放入 ebx 中。

但是控制台应用程序中的以下代码:

 mov ebx, item
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr
 mov ebx, [item]
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr

打印 42 两次。要获取我似乎需要的“项目”的地址

 mov ebx, [OFFSET item]
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr

谁能解释一下 MASM 中方括号的用途,或者给我指出一个很好的参考。


MASM 对于汇编语言来说是不寻常的,因为它有类型。 MASM 知道是因为你如何定义符号item这是一个类型的内存位置DWORD。当您将它用作操作数时,您(可能)意味着您想要存储在该地址处的值,而不是该地址的值。所以如果你使用也没关系item or [item]MASM 假设您指的是后者。如果您确实想要项目的地址,则需要使用OFFSET item.

另一方面,如果你定义了item作为常数使用item = 42 then mov ebx, item将加载立即值。由于这种模糊性,您需要知道如何item被定义来确定它是立即操作数还是内存操作数,最好避免使用裸符号作为操作数。

我应该补充一点,方括号[]当您只使用符号或数字时,对于 MASM 来说几乎没有任何意义。仅当您将它们与寄存器一起使用时,它们才有意义。以下是一些示例:

item    DD  42
const   =   43

    mov eax, item             ; memory operand (the value stored at item)
    mov eax, [item]           ; memory operand
    mov eax, OFFSET item      ; immediate operand (the address of item)
    mov eax, [OFFSET item]    ; immediate operand

    mov eax, const            ; immediate operand (43)
    mov eax, [const]          ; immediate operand
    mov eax, ds:[const]       ; memory operand (the value at address 43)
    mov eax, fs:30h           ; memory operand (the value at address 30h + fs base)
    mov eax, OFFSET const     ; immediate operand
    mov eax, [OFFSET const]   ; immediate operand

    mov eax, 42               ; immediate operand
    mov eax, ebx              ; register operand (the value of EBX)
    mov eax, [ebx]            ; indirect operand (the value pointed to by EBX)

因此,如果没有寄存器,方括号只能显示您的意图。如果您打算将符号用作内存操作数,则应该将它们放在方括号中,并使用OFFSET以及您打算用作立即值的符号。

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

MASM32 中令人困惑的括号 的相关文章

随机推荐

  • 使用xpath和java解析xml

    现在我想解析来自 webservice 的 xml 为了解析 我使用了xpath和java 我有以下代码 package test client import com sun org apache xpath internal NodeSe
  • 如何使用“api”或“implementation”指令从 gradle 插件获取依赖项

    背景 运行 Android Studio 3 0 beta7 并尝试获取一个适用于 Android 库的 javadoc 任务 事实上 这首先不能作为现成的任务提供 这真的很奇怪 我设法调整了一个根据我的需要回答不同的问题 最后得到这个代码
  • Pygame-创建更多 USEREVENT 类型事件的方法?

    这个问题是由于需要创建大量 USEREVENT 类型事件而产生的 由于我找不到有关如何创建超出限制的用户事件的信息 因此我来这里寻求帮助 目前我知道USEREVENT类型事件的值为24 最大允许的id为31 我还发现一些id s被保留 至少
  • 如何更改 Android Things 设备上的日期?

    我正在 Raspberry Pi 3 Model B 上使用 Android Things Developer Preview 有什么方法可以设置正确的日期 时间 时区 最简单的方法可能是使用date通过 ADB 执行 shell 命令 它
  • 检测何时按下标签栏项目

    我有一个根视图控制器 它没有设置为故事板上任何视图控制器的自定义类 相反 我的所有视图控制器都像这样子类化此类 RootViewController class RootViewController UIViewController UIT
  • Java中字符串结束符

    我正在解决一个简单的问题 在Java中删除字符数组中的某些字符 想法很简单 static void remove char char arr char c int r 0 for int i 0 i lt arr length i if a
  • 实时音频队列录音回放

    嘿伙计们 我正在尝试构建一个用于实时变声的应用程序 第一步 我设法将音频数据录制到指定文件并在录制后播放 现在我尝试更改在循环录制音频缓冲区后立即播放音频缓冲区的代码 我的问题是 如何直接从录音音频队列中读取音频数据 而不是 如文档中所示
  • 从 adb 获取包的可启动活动名称

    有没有办法从使用中获取包的可启动活动adb 对于未root的手机 即无需从中拉出apk data app目录并检查appt 我尝试了 dumpsys 但它不包含有关默认可启动活动的信息 Thanks 您不需要 root 即可从中提取 apk
  • 100% CPU 使用率下的 Java 线程优化

    我有一个应用程序 它接受队列上的工作 然后旋转该工作以在独立线程上完成 线程数量并不多 比如最多 100 个 但这些都是密集型任务 可以快速将 CPU 提升到 100 为了以最快的速度完成最多的工作 当我需要做更多的工作时 我最好只启动更多
  • 杀死在 Matlab 中创建的 Excel 进程

    鉴于我写入工作簿 目前我会终止所有 Excel 进程 以便我的代码在循环调用时可以正常工作 xlswrite path values system taskkill F IM EXCEL EXE 这使得我在处理另一个 Excel 文件时无法
  • Chrome Webstore 内联安装与 AngularJS

    我是 AngularJS 的新手 并尝试按照以下步骤安装 Chrome 扩展网上商店内联安装指南 在我的 html 文件中
  • 使用 Google Sheets API 和服务帐户时收到 403 禁止

    我有一个使用服务帐户的应用程序 因为它从 cron 作业运行 所以我无法让它通过浏览器中的用户进行授权 以下是我创建床单服务的方法 private static final String APPLICATION NAME my app pr
  • XStream 中的单元素数组错误

    如果你有这样的函数 List
  • 动态添加 Django 表单集实例并使用 HTMX POST 的正确方法是什么?

    我正在制作一个表格嵌套动态表单集 using htmx我 想逃避使用JS 但如果没有选择 实例更多表单集字段为了使动态嵌套形式 但是当我POST 仅数据来自1 个实例 of the Chlid formset 最后一个 已发布 表单的其余部
  • jQuery 事件处理程序的 JavaScript 闭包

    我有一个对象列表 每个对象都有一个 bullet 它是一个 SPAN 我想将跨度上的单击绑定到处理程序 而不是使用 jQuery 在跨度上执行特定操作 我看到一些我不理解的行为 所以我希望有人可以解释发生了什么 基本上 第一个代码示例有效
  • 使用鼠标中键滚动按钮禁用浏览器滚动

    我的页面上有一个 Flash 元素 您可以使用鼠标中滚轮与其进行交互 页面很长 因此 当使用鼠标滚轮滚动时 它会与 Flash 元素交互并滚动浏览器窗口 有没有办法在 Flash 元素处于活动状态时禁用浏览器滚动
  • 如何使用 PyQt 在按钮单击时调用 python 脚本

    我使用 PyQt4 创建了一个带有按钮的表单 在此按钮上 我想调用另一个 python 脚本 如下所示 文件1 py import sys from PyQt4 import QtCore QtGui from file1 ui impor
  • Google App Script URLFetch 配额不清楚

    我有兴趣构建一个依赖外部服务的电子表格插件 并且 URLFetch 似乎是使用应用程序脚本执行远程 HTTP S 调用的唯一方法 我已经达到了应用脚本配额页面检查限制 我可以看到它们是 GSuite 计划每天 100 000 个呼叫 Gma
  • 使用正则表达式检测以带重音的大写字母开头的单词

    我想使用 Java 中的正则表达式提取以大写字母开头的单词 包括重音大写字母 这是我对以大写 A 到 Z 开头的单词的条件 if link text matches A Z true 但我也想要以 a 开头的单词accented也是大写字符
  • MASM32 中令人困惑的括号

    我正在尝试掌握 MASM32 但对以下内容感到困惑 我认为括号用于间接寻址 所以如果我有预定义的变量 data item dd 42 then mov ebx item 会将 item 的内容 即数字 42 放入 ebx 中并 mov eb