使用 TYPE 指令汇编 MASM x86

Posted

技术标签:

【中文标题】使用 TYPE 指令汇编 MASM x86【英文标题】:Using TYPE instruction assembly MASM x86 【发布时间】:2020-04-16 17:16:06 【问题描述】:

我还在学习汇编,当我到达这部分代码时我很困惑:

add SI, TYPE word

由于我不太明白 TYPE 指令在其中代表什么,我们究竟要向 SI 添加什么? 如果有人能说明在达到添加之前假设 SI 设置为 0 的情况下这是如何工作的,我将非常感激!

【问题讨论】:

【参考方案1】:

来自 MASM 6.1 程序员指南:

SIZEOFTYPE 运算符在应用于类型时返回该类型整数的大小。 与每种数据类型关联的 size 属性为:

Data Type      Bytes
--------------------
BYTE, SBYTE    1
WORD, SWORD    2
DWORD, SDWORD  4
FWORD          6
QWORD          8
TBYTE          10

旁注:对于数组和字符串,SIZEOFTYPE 不等效。 SIZEOF 将为您提供数组/字符串的总大小(以字节为单位),而 TYPE 将为您提供单个数组/字符串元素的大小。

【讨论】:

谢谢!最后,碰巧,您知道与使用显式数值相比是否有任何性能/速度改进? TYPE 表达式是在编译时评估的,因此没有运行时差异。在机器代码中,您将获得值 2。【参考方案2】:

您正在添加一个汇编时间常数整数2。它组装成 add si,2MASM TYPE foo 与 C sizeof(typeof(foo)) 的想法相同。1

请记住,在 asm 中,您必须自己从元素索引缩放到字节偏移量,例如将指针增加 2 个字节以转到下一个 word,在 C 中您只需使用 p++ 来增加 short *p

MASM 还有一个sizeof,它可以为您提供整个数组的大小,而不仅仅是一个元素。


通常您会使用add si, type some_array_name,因此如果您将数组更改为dwdb,您的增量代码可能会自动更改。

虽然在这种情况下,如果您在其他实际从/到[SI] 加载或存储的指令中也使用AX 而不是AL,这有点毫无意义。

不过,您可以使用 type foo 作为其他表达式的一部分来计算大小或循环边界。


脚注 1:C/C++ 实际上没有 typeof 关键字;那是一个 GNU C 扩展。但是这个名字比标准的 C++11 关键字 decltype 更容易解释,它做同样的事情。

【讨论】:

以上是关于使用 TYPE 指令汇编 MASM x86的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助使用 masm 以 80x86 汇编语言连接两个字符串

masm x86汇编 资源混合编译

masm x86汇编 资源混合编译

x86 指令集的声明式表示

为啥在 MASM 汇编中使用 FPU x87 指令集执行操作时得到无意义的数字?

MASM汇编 - REAL4浮点指令