如果您尝试声明一个长度超过 512 个字符的数组,MASM 会发出错误:
error A2039:line too long
如何为MASM声明大数组?需要一个大数组,而不是几个小数组。
分成几行,插入字符“\”并不能解决问题。
在本例中,它是一个结构体数组:
.data
sysmet struc
iIndex DB 0
szLabel DB 22 DUP (0)
zero1 DB 0
szDesc DB 40 DUP (0)
zero2 DB 0
sysmet ends
sysm sysmet <SM_CXSCREEN, "SM_CXSCREEN", 0, "Screen width in pixels", 0>,
<SM_CYSCREEN, "SM_CYSCREEN", 0, "Screen height in pixels", 0>,
<SM_CXVSCROLL, "SM_CXVSCROLL", 0, "Vertical scroll width", 0>,
<SM_CYHSCROLL, "SM_CYHSCROLL", 0, "Horizontal scroll height", 0>,
<SM_CYCAPTION, "SM_CYCAPTION", 0, "Caption bar height", 0>,
<SM_CXBORDER, "SM_CXBORDER", 0, "Window border width", 0>,
<SM_CYBORDER, "SM_CYBORDER", 0, "Window border height", 0>,
<SM_CXFIXEDFRAME, "SM_CXFIXEDFRAME", 0, "Dialog window frame width", 0>
数组声明的字符数达到552。 如果删除最后一行,则不会出现错误。
如果添加了“系统”,则
lengthof sysm
运算符将元素数量返回到第一个系统。这不适合我。我需要声明一个大尺寸的数组,其元素数量和整个结构的大小都将被正确计算。
目前我找到的唯一解决方案是通过 DUP 初始化一个空数组。然后在处理WM_CREATE消息时填写数组的元素。
sysm sysmet 74 DUP (<0, ' ', 0, ' ', 0>)
sysmetrics LABEL BYTE
DB SM_CXSCREEN, "SM_CXSCREEN", 0, "Screen width in pixels", 0
DB SM_CYSCREEN, "SM_CYSCREEN", 0, "Screen height in pixels", 0
DB SM_CXVSCROLL, "SM_CXVSCROLL", 0, "Vertical scroll width", 0
...
但这是一个错误的决定。我不喜欢。
LENGTHOF 运算符计算单个数据声明中的元素数量。不要与 SIZEOF 运算符混淆。
回复:“要计算元素数量,请将所有元素的字节大小(两个标签之间的差异)除以一个元素的字节大小。”
谢谢你。这是一个更好的解决方案。
.data
sysmet struc
iIndex DB 0
szLabel DB 22 DUP (0)
zero1 DB 0
szDesc DB 40 DUP (0)
zero2 DB 0
sysmet ends
sysm sysmet <SM_CXSCREEN, "SM_CXSCREEN", 0, "Screen width in pixels", 0>,
<SM_CYSCREEN, "SM_CYSCREEN", 0, "Screen height in pixels", 0>,
…
sysmet <SM_CMONITORS, "SM_CMONITORS", 0, "Number of monitors", 0>,
<SM_SAMEDISPLAYFORMAT, "SM_SAMEDISPLAYFORMAT", 0, "Same color format flag", 0>
lenOfSysm = $-sysm
.code
;cLineNumbers = lenOfSysm / sizeof sysmet
xor EDX, EDX
mov EAX, lenOfSysm
mov EBX, sizeof sysmet
div EBX
mov cLineNumbers, EAX
但这仍然是绕过 MASM 限制。 Microsoft 似乎已停止正确支持 MASM。
您可以在多个系统行中进行初始化,并在它们后面放置一个标签,然后根据结束标签和系统起始标签之间的差异计算大小。 要计算元素数量,请将所有元素的字节大小(两个标签之间的差值)除以一个元素的字节大小。 埃里克·波斯特皮斯基尔
.data
sysmet struc
iIndex DB 0
szLabel DB 22 DUP (0)
zero1 DB 0
szDesc DB 40 DUP (0)
zero2 DB 0
sysmet ends
sysm sysmet <SM_CXSCREEN, "SM_CXSCREEN", 0, "Screen width in pixels", 0>,
<SM_CYSCREEN, "SM_CYSCREEN", 0, "Screen height in pixels", 0>,
…
sysmet <SM_CMONITORS, "SM_CMONITORS", 0, "Number of monitors", 0>,
<SM_SAMEDISPLAYFORMAT, "SM_SAMEDISPLAYFORMAT", 0, "Same color format flag", 0>
lenOfSysm = $-sysm
.code
;cLineNumbers = lenOfSysm / sizeof sysmet
xor EDX, EDX
mov EAX, lenOfSysm
mov EBX, sizeof sysmet
div EBX
mov cLineNumbers, EAX