如何为MASM声明大数组?

问题描述 投票:0回答:1

如果您尝试声明一个长度超过 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。

arrays assembly masm
1个回答
0
投票

您可以在多个系统行中进行初始化,并在它们后面放置一个标签,然后根据结束标签和系统起始标签之间的差异计算大小。 要计算元素数量,请将所有元素的字节大小(两个标签之间的差值)除以一个元素的字节大小。 埃里克·波斯特皮斯基尔

.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
© www.soinside.com 2019 - 2024. All rights reserved.