使用这个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字节数组?
1条答案
按热度按时间igsr9ssn1#
按照注解中的建议,在定义数组的位置定义一个大小符号
然后将包含文件更新为
最后,在main .asm文件中,将常量引用为
谢谢!