对汇编中的指针和值感到困惑

2024-01-09

我正在使用 MASM 汇编器。 让我们看一下这段简短的代码(来自我读过的一本书):

    .data
var1 BYTE 10h

.code
main proc
    mov esi,OFFSET byteVal
    mov al,[esi] ; AL = 10h

我不太明白 byteVal 是如何翻译成机器代码的 - 我知道它是一个标识符,一个符号名称。据我了解,在运行时 byteVal 是内存address值 10h,对吗? 但书上说这两个指令是相同的:

mov al var1
mov al,[var1]

我不明白他们为什么这样做。


var1 = 10h 的地址

[var1] = 10 小时


这不是真的吗? 书上说方括号“取消引用”变量,但它说这两个是相同的。

如果 var1 是内存中的位置,那么它和使用 OFFSET var1 有什么区别? 我的意思是,offset 是内存中的位置,不是吗? 书上说:“OFFSET 运算符返回变量与其封闭变量开头的距离 部分。” 为什么第一个变量的偏移量不为零,因为它是段中的第一个变量?我就是想不出来。或许我该换本书了……


在 MASM 中(而且只有那里!)mov al, var1content of var1。使用“裸”标签的名称称为“直接内存操作数”。看MS MASM 6.0 程序员指南(滚动到第 3.2.3 节“直接内存操作数”) https://www.pcjs.org/pubs/pc/reference/microsoft/mspl13/masm/mpguide/。如果您需要该标签的地址,则必须使用OFFSET-操作员 https://msdn.microsoft.com/library/009k3eeh.aspx.

运营商[] https://msdn.microsoft.com/de-de/library/7kxw03s9.aspx有特殊的意义。我将括号之间的表达式添加到括号之前的表达式中。

mov al, [var1]

相当于

mov al, 0[var1]

相当于

mov al, 0 + var1

相当于

mov al, var1 + 0

相当于

mov al, var1

如果您确实不需要它,则不应在 MASM 中使用 [] 运算符,因为它有一些副作用。

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

对汇编中的指针和值感到困惑 的相关文章

随机推荐

  • MySQL 连接器 NO_CIPHERS_AVAILABLE 错误

    我正在使用 MySQL 连接器为我的简单 python 应用程序创建连接 但是每次运行它时 它都会失败并返回以下错误 2055 Lost connection to MySQL server at databaseHost system e
  • ResourceManager 包 - 包未正确加载

    我在 VS2015 和 cordova 项目中遇到问题 当天早些时候 我的项目进展顺利 但是 我将一个项目移动到一个新文件夹 现在 VS2015 无法正常工作 它正在运行 但不知何故 webessentials 被卸载 我的 gulpfil
  • PowerShell :: Microsoft.Azure.Commands.Sql.Database.Model.AzureSqlDatabaseModel.DatabaseName [重复]

    这个问题在这里已经有答案了 我编写了一个脚本 允许我查询整个 Azure 数据库公园 ErrorActionPreference SilentlyContinue Connect to Azure azureAccount Connect
  • 为什么 runBlocking 不会阻塞调用线程

    我试图理解 kotlin 中的 runBlocking println before runBlocking Thread currentThread name runBlocking but this expression blocks
  • Avro在消费端通过kafka自定义解码UUID

    我编写了一个类来将 UUID 类型的对象自定义编码为要在 kafka 和 avro 之间传输的字节 为了使用这个类 我放了一个 AvroEncode using UUIDAsBytesEncoding class 在我的目标对象中的 uui
  • BLOC 状态更改后有状态小部件未重建

    我无法理解为什么我的 Stateful 小部件在重建后没有更新状态 我有一个有状态的小部件 负责每秒递减一个计数器 因此它收到一个初始值 我将此初始值传递给状态并开始递减它 它还具有一个按钮 当按下该按钮时 会向我的块发送一个事件 该块会使
  • NoClassDefFoundError(初始化失败) - Websphere 和 IBM MQ

    我在部署到 Websphere 并与 IBM MQ 交互的基于 Spring 的 Web 应用程序上遇到问题 一切都很好 直到我尝试一些故障测试 当 Web 应用程序启动并运行时 我停止 IBM MQ 然后 我调用 Web 应用程序发送 J
  • 如何使用 Java 获取 Linux 中的总磁盘空间?

    我能够获得可用磁盘空间 我如何获得总磁盘空间 我的代码是 import java io IOException import org apache commons io FileSystemUtils public class DiskSp
  • 此 linq 查询是否在 for-each 循环的每次迭代上运行?

    在关于 SO 的另一个问题中 我用如下代码回答 并得到一条评论 即 LINQ 查询可能在 for each 的每次迭代中进行评估 真的吗 我知道 LINQ 查询在其项目被评估之前不会执行 因此这种迭代结果的方式似乎可以使其在每次迭代中运行
  • SQL / PHP PDO 选择随机行

    我希望能够随机选择一名未参加考试的学生 N 并回显姓名和主题 我怎样才能实现这个目标 query db gt prepare SELECT name FROM exams WHERE faced array array N query gt
  • 使用 GSON 解析 JSON

    我在使用 GSON 时遇到了一些问题 主要是从 JSON 反序列化为 POJO 我有以下 JSON events event id 628374485 title Developing for the Windows Phone event
  • 无法绑定 GridView 列中的项目列表

    我正在构建一个应用程序 向用户显示系列比赛的实时结果 我设置数据结构如下 Countries gt Leagues gt Matches特别是在 ViewModel 中 我创建了一个可观察的国家 地区集合 如下所示 private Obse
  • Silverlight - 在 XAML 中而不是在构造函数中设置 DataContext?

    如何在 XAML 中而不是在构造函数中设置 Grid 上的 DataContext 以下是我在构造函数中执行此操作的方法 LayoutRoot 是 XAML 中定义的 XAML 网格 this LayoutRoot DataContext
  • 使用共享静态 WCF 代理客户端有哪些陷阱?

    我正在考虑将共享 读取静态 WCF 代理客户端用于高吞吐量应用程序 我相信这样做可以提高性能 但我还没有对此进行基准测试 这个想法有一些严重的缺陷吗 从我的研究中 我可以看到存在处理故障状态的问题 目前尚不清楚该状态对其他待处理请求的影响流
  • Django/Python - 每秒更新数据库

    我正在努力用 Django 和 Python 创建一个基于浏览器的游戏 并且我正在尝试为我遇到的问题之一找到解决方案 本质上 每一秒都需要更新多个用户变量 例如 有一个货币变量应该每秒增加一定数量 随着你的升级和所有这些爵士乐而逐渐变大 我
  • 在 Kotlin 中编写 React Native Android 模块?

    React Native 文档提供了吐司模块 https facebook github io react native docs native modules android html用java编写的例子 同样的例子在 Kotlin 中是
  • JSON和Unity,在游戏上显示图像[重复]

    这个问题在这里已经有答案了 我有一个测验游戏应用程序 并且我有游戏上的图像 我想显示图像 文本显示得很好 但图像却不是 这是我的 JSON C 代码 点击这里图片 https i stack imgur com AEaFB png 调用我的
  • 为什么 Rails 不断发回 Set-Cookie 标头?

    我遇到了弹性负载均衡器和清漆缓存的问题 涉及 cookie 和会话在 Rails 和客户端之间混淆 问题的一部分是 rails 几乎在每个请求上都添加了一个带有会话 ID 的 Set Cookie 标头 如果客户端已经发送session i
  • 谜题:在四个反射墙内,激光束可以通过多少种方式击中目标

    你在一个长方形的房间里遇到敌人 你只有一把激光武器 房间里没有任何障碍物 墙壁可以完全反射激光束 然而 激光只能传播一定的距离 然后就变得毫无用处 如果它撞到角落 它会沿着它来的方向反射回来 这就是谜题的进行方式 您将获得自己所在位置和目标
  • 对汇编中的指针和值感到困惑

    我正在使用 MASM 汇编器 让我们看一下这段简短的代码 来自我读过的一本书 data var1 BYTE 10h code main proc mov esi OFFSET byteVal mov al esi AL 10h 我不太明白