assembly 为什么使用EXTERNDEF MyByteArray:BYTE时MASM关键字SIZEOF MyByteArray始终返回1

hlswsv35  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(107)

使用这个externdef关键字创建了一个包含文件

包括的数量

EXTERNDEF MyByteArray:BYTE

创建了定义10字节数组并包含www.example.com的程序集文件num.inc

装配数量

option casemap:none

include num.inc

.data?
MyByteArray BYTE 10 DUP (?)

end

已创建打印MyByteArray大小的程序集文件

绝对值总成

option casemap:none

include num.inc

extrn printf:proc

.data
     szArray db 'MyByteArray = %d',0ah,0
     
.code

main proc
     mov     rax, SIZEOF MyByteArray
     mov     rdx,rax 
     mov     rcx,offset szArray
     sub     rsp,20h
     call    printf
     add     rsp,20h

     ret
main endp

end

上述文件通过以下命令进行组合和链接

**绝对 bat **

@echo on

if not defined DevEnvDir (
  call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat"
)

ml64.exe abs.asm num.asm /link /subsystem:console /defaultlib:kernel32.lib /defaultlib:libcmt.lib

一切都构建得很好,但是,当运行abs.exe时,它输出MyByteArray = 1

我希望输出为MyByteArray = 10
(旁白:如果数组是本地定义的,没有externdef,输出是10)
我使用的解决方法是简单地将SIZEOF替换为实际的数组大小

mov     rax, 10
...

这并不理想,因为如果数组大小发生变化,则需要在其他地方进行进一步的修改以保持同步。
此行为是否是MASM汇编程序看到SIZEOF MyByteArray但仅有权访问EXTERNDEF MyByteArray:BYTE的结果,因此它返回大小为1的BYTE,而不是稍后在链接期间引用实际的10字节数组?

igsr9ssn

igsr9ssn1#

按照注解中的建议,在定义数组的位置定义一个大小符号

option casemap:none
include num.inc
.data?
MyByteArray BYTE 10 DUP (?)
.const
MyByteArraySize EQU SIZEOF MyByteArray
end

然后将包含文件更新为

EXTERNDEF MyByteArray:BYTE
EXTERNDEF MyByteArraySize:ABS

最后,在main .asm文件中,将常量引用为

mov     rax, MyByteArraySize

谢谢!

相关问题