x86,BYTE 和 BYTE PTR 之间的区别

2023-12-04

这两行有什么区别?这里 PTR 发生了什么变化?

;first
mov BYTE [ecx], 0  
;second
mov BYTE PTR [ecx], 0

概括:

  • NASM/YASM 要求word [ecx]当另一个操作数未隐含操作数大小时。 (否则[ecx] is ok).
  • MASM/TASM 要求word ptr [ecx]当另一个操作数未隐含操作数大小时。 (否则[ecx] is ok).

他们都被对方的语法所窒息。


警告:这是一个非常奇怪的领域,没有任何 ISO 标准或易于找到的 BNF 表;我并不是穿越专有 MASM 语法雷区的专家。

如果您的情况可能没有区别,但 PTR 运算符在其他情况下可能意味着:

http://www.c-jump.com/CIS77/ASM/Instructions/I77_0250_ptr_pointer.htm

一般来说,PTR 运算符强制表达式被视为指定类型的指针:

 .DATA
 num  DWORD   0

 .CODE
 mov     ax, WORD PTR [num] ; Load a word-size value from a DWORD

我认为,还有汇编程序的特定要求(nasm/tasm/其他 asm),并且使用“byte ptr”更便携。

另请检查第 4.2.16 节来自印度的书和部分8.12.3(和 8.11.3“类型冲突”)在“汇编语言编程的艺术".

更新:感谢 Frank Kotler,似乎 NASM“使用 Intel 汇编语法的变体”(wiki),其中不包括 PTR 操作。

UPDATE1:有原始的"ASM86 语言参考手册"来自 Intel,1981-1983,PTR 运算符在第 4-15 页定义:

PTR操作员

语法:键入 PTR 名称

说明: PTR 运算符用于定义某种类型的内存引用。汇编器根据指令操作数的类型确定要汇编的正确指令。在某些情况下,您可以指定没有类型的操作数。这些情况涉及数字或寄存器表达式的使用。这里PTR运算符用于指定操作数的类型。以下示例说明了这种用法:

MOV  WORD  PTR  [BX], 5        ;set word pointed to by BX = 5
INC  DS:BYTE  PTR  10          ;increment byte at offset 10
                               ;from DS

此形式还可用于覆盖变量或标签的类型属性。例如,如果您希望以两个字节的形式访问已定义的字变量,则可以编写以下代码:

MOV  CL, BYTE  PTR AWORD       ;get first byte
MOV  CL, BYTE  PTR AWORD + 1   ;get second byte

字段值:

类型 该字段可以具有以下值之一:BYTE、WORD、DWORD、QWORD、TBYTE、NEAR、FAR

name 该字段可以是: 1. 变量名。 2. 标签名称。 3. 地址或寄存器表达式。 4. 表示偏移量的整数。

UPDATE2:感谢斯图加特大学的bitsaver!有原版 MACRO-86 手册来自微软(1981)。第 3-7 页:

在使用前向引用时,可以使用 PTR 运算符的另一种方式来节省字节。如果将 FOO 定义为前向常量,则可以输入以下语句:

MOV [BX],FOO

您可能希望将 FOO 称为字节立即数。在这种情况下,您可以输入任一语句(它们是等效的):

MOV BYTE PTR [BX],FOO

MOV [BX],BYTE PTR FOO

这些语句告诉 MACRO-86 FOO 是一个字节立即数。生成更小的指令。

第 3-16 页:

覆盖运算符

这些运算符用于覆盖变量和标签的段、偏移、类型或距离。

指针(PTR)

<attribute>  PTR  <expression>

PTR 运算符会覆盖操作数的类型(BYTE、WORD、DWORD)或距离(NEAR、FAR)。

<attribute>是新属性;新类型或新距离。

<expression>是其属性要被覆盖的操作数。

PTR 最重要和最频繁的用途是确保 MACRO-86 理解表达式应该具有什么属性。对于 type 属性尤其如此。每当您在程序中放置前向引用时,PTR 都会明确表达式的距离或类型。这样您就可以避免相位错误。

PTR 的第二个用途是按变量定义中类型以外的类型访问数据。这种情况最常发生在结构中。如果结构定义为 WORD 但您想要以字节形式访问项目,则 PTR 是该操作的运算符。然而,更简单的方法是输入第二条语句,该语句也以字节为单位定义结构。这消除了对结构的每次引用都使用 PTR 的需要。请参阅第 4.2.1 节“内存指令”中的 LABEL 指令。

例子:

 CALL WORD PTR [BX][SI]
 MOV BYTE PTR ARRAY, (something)

 ADD BYTE PTR FOO,9

阅读本文并查看这些文档中的一些语法定义后,我认为编写 PTR 是强制性的。的用法mov BYTE [ecx], 0根据 MA​​CRO-86 手册,这是不正确的。

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

x86,BYTE 和 BYTE PTR 之间的区别 的相关文章

  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • 按字节数对向量进行混洗

    有什么办法可以左移 v 0 gt v 1 a m128i by n字节 其中n仅在运行时才知道 我目前仅限于 AVX1 但如果 AVX2 512 使这变得更容易 我非常感兴趣 I found mm bslli si128 m128i imm
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • Visual Studio 2012 本机 C++ DLL x86 编译

    我最近将我的工具集从 Win 7 x86 Visual Studio 2010 升级到 Win 8 x64 Visual Studio 2012 但是 现在我的本机 C dll 编译为 x64 而不是 x86 除了将代码移至新操作系统并将其
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • SIMD 和 VLIW 指令是一样的吗?

    SIMD 单指令多数据 和 VLIW 超长指令字 到底有什么区别 其中一个是另一个的子集吗 或者它们是两个完全不同的东西 完全不相关且正交 一台机器可以有一个或两个 或者两者都没有 SIMD 指令可以作为扩展添加到 VLIW ISA 但 V
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • 无法识别的仿真模式:MinGW32 上的 elf_i386

    我正在尝试制作内核 但无法链接C与程序集一起输出 这ld 我收到错误 无法识别的仿真模式 elf i386 我正在使用 Windows 10 专业版以及 MinGW32 和 MSYS 我正在使用的代码 link ld link ld OUT
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl

随机推荐

  • 如何将带有空格的路径存储到bash中的变量中

    我想存储 c users me dir name到一个变量中将其传递给cd系统调用 键入时有效 cd c users me dir name or cd c users me dir name 但如果我存储它则不起作用 dirname c
  • 延迟加载 FXProperties

    这是来自的后续here 我正在实现一个表 它将数据异步加载到表单元格中 问题是 表格单元格有时无法正确更新 有时它会以某种方式 挂起 并且永远显示 正在加载 仅当我在表格中滚动一点时 实际值才会更新 重现 运行应用程序并在表中快速向下滚动
  • Javascript:显示大数字时如何避免科学记数法

    基于 为了可读性 JavaScript使用科学记数法来显示非常大的数字 大于或等于1021的绝对值 例如 写入语句 document write 1000000000000000000000000 会产生输出 1e24 我可以避免显示科学记
  • 如何使用text strip()函数?

    我可以删除数字 但不能删除字母字符 gt gt gt text 132abcd13232111 gt gt gt text strip 123 abcd 为什么以下不起作用 gt gt gt text strip abcd 132abcd1
  • PDFBox - 直线/矩形提取

    我正在尝试从 PDF 中提取文本坐标和行 或矩形 坐标 The TextPosition班级有getXDirAdj and getYDirAdj 根据相应 TextPosition 对象表示的文本片段的方向转换坐标的方法 根据 mkl 的评
  • 使用和不使用 pytest-mock 来模拟标准库函数

    出于测试目的 我想模拟 Shutil which Python 3 5 1 它在简化方法 find foo 中调用 def find foo self gt Path foo exe which foo path None if foo e
  • 在python中循环遍历json数组

    我在一个数组中有 JSON 我正在将其导入到我的脚本中 ip address 192 168 0 1 192 168 0 2 192 168 0 3 我正在加载 JSON 并声明一个名为 ip address 的变量 data yaml l
  • 获取每天的总浏览次数,包括没有记录的一天留下“0 浏览次数”

    我正在创建一个图表 我可以在其中获得特定范围内每天的总观看次数 或者只要它可以返回 我遇到的问题是填写默认数量0当某一天没有浏览量时 有些日子可能一天中绝对没有浏览量 所以我需要MySQL返回默认值0当没有找到时 我不知道该怎么做 这是我用
  • 如何替换视图控制器(或从导航堆栈中删除)而不是推送segue?

    I have 一个小的 iPhone 应用程序 它使用导航控制器显示 3 个视图 此处全屏 首先 它显示社交网络列表 Facebook Google 等 然后它会显示一个 OAuth 对话框 要求提供凭据 并且 之后 在同样的UIWebVi
  • Angular HttpClient 错误处理困难

    有关新 HttpClient 的 Angular 文档https angular io guide http有一个 获取错误详细信息 部分 其中显示了如下所示的示例 我已修改评论以记录我的观察结果 哪些基本错误类最终出现在哪里 http g
  • APC值随机消失

    我使用 APC 来存储类名到类文件路径的映射 我在自动加载函数中像这样构建地图 class paths apc fetch class paths If the class path is stored in application cac
  • 为什么我无法访问此类的成员? [复制]

    这个问题在这里已经有答案了 我有以下三个类定义 class String public String String const char class ClassA public ClassA const String class Class
  • 语法错误:“导入”和“导出”可能仅与“源类型:模块”一起出现 - Gulp

    考虑以下两个文件 app js import Game from game game import React from react import ReactDOM from react dom export default absPath
  • php函数返回null而不是字符串[重复]

    这个问题在这里已经有答案了 我有一个数组 其中存储了所有类别 allCatArray array departments outdoor 123123 gt stdClass Object i gt 1 id gt departments
  • jQuery UI 日期选择器显示无操作

    是否可以显示 jQuery UI 日期选择器而无需单击任何内容 我希望日期选择器在窗口加载时可见 或者这是不可能的 如果没有 是否还有其他插件 或者最好自己创建一个新插件 您可以做的一件事是将焦点放在输入上 以便日期选择器显示 datepi
  • 将 String 或 Char 转换为 Keys 对象

    如果我使用以下代码 for int i 0 i lt text Length i char c text i Keys k Keys byte c MessageBox Show c ToString k ToString 我只能对大写字母
  • 模板化 Maven 原型

    我正在创建自己的 Maven 原型 这是我使用的项目的通用模板 在该模板中 我有许多 exec maven plugin 块 实际上每个项目都有所不同 这意味着在一个项目中我可能有 2 个 exec maven plugin 块 而在另一个
  • 创建一个基于 libreoffice 文本的数据源并使用 java 设置设置

    我需要在 Java 中创建一个 LibreOffice 基于文本的数据源 我的需求是向用户提供一个包含标题行和 n 个值行的 csv 文件 此 csv 文件是执行邮件合并作业的数据源 如果我使用 LibreOffice 向导手动创建数据源来
  • 通过 Asmack 发送 Image 时创建消息

    我在通过 XMPP 发送图像时遇到一个问题 下面是我完成的代码片段 我不知道代码有什么问题 Message msg new Message emailId Message Type chat ImageTransferExtension t
  • x86,BYTE 和 BYTE PTR 之间的区别

    这两行有什么区别 这里 PTR 发生了什么变化 first mov BYTE ecx 0 second mov BYTE PTR ecx 0 概括 NASM YASM 要求word ecx 当另一个操作数未隐含操作数大小时 否则 ecx i