使用 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 程序员指南:
SIZEOF
和 TYPE
运算符在应用于类型时返回该类型整数的大小。
与每种数据类型关联的 size 属性为:
Data Type Bytes
--------------------
BYTE, SBYTE 1
WORD, SWORD 2
DWORD, SDWORD 4
FWORD 6
QWORD 8
TBYTE 10
旁注:对于数组和字符串,SIZEOF
和 TYPE
不等效。 SIZEOF
将为您提供数组/字符串的总大小(以字节为单位),而 TYPE
将为您提供单个数组/字符串元素的大小。
【讨论】:
谢谢!最后,碰巧,您知道与使用显式数值相比是否有任何性能/速度改进?TYPE
表达式是在编译时评估的,因此没有运行时差异。在机器代码中,您将获得值 2。【参考方案2】:
您正在添加一个汇编时间常数整数2
。它组装成 add si,2
。MASM TYPE foo
与 C sizeof(typeof(foo))
的想法相同。1
请记住,在 asm 中,您必须自己从元素索引缩放到字节偏移量,例如将指针增加 2 个字节以转到下一个 word
,在 C 中您只需使用 p++
来增加 short *p
。
MASM 还有一个sizeof
,它可以为您提供整个数组的大小,而不仅仅是一个元素。
通常您会使用add si, type some_array_name
,因此如果您将数组更改为dw
与db
,您的增量代码可能会自动更改。
虽然在这种情况下,如果您在其他实际从/到[SI]
加载或存储的指令中也使用AX
而不是AL
,这有点毫无意义。
不过,您可以使用 type foo
作为其他表达式的一部分来计算大小或循环边界。
脚注 1:C/C++ 实际上没有 typeof
关键字;那是一个 GNU C 扩展。但是这个名字比标准的 C++11 关键字 decltype
更容易解释,它做同样的事情。
【讨论】:
以上是关于使用 TYPE 指令汇编 MASM x86的主要内容,如果未能解决你的问题,请参考以下文章
需要帮助使用 masm 以 80x86 汇编语言连接两个字符串