MASM64汇编报initializer magnitude too large及invoke语法错误求助
MASM64 表达式计算代码编译问题修复
错误原因排查
- 头文件引用被注释:你代码第一行的
include语句前加了注释符;,等于没有引入MASM64运行时库。invoke是该库提供的调用宏,MessageBox、ExitProcess、MB_ICONINFORMATION等函数和常量也都定义在这个头文件中,注释后汇编器无法识别这些标识符,因此触发语法错误。 - 变量名笔误:调用
wsprintf时你写了ADDR res1,但代码中定义的结果变量名为res,不存在res1这个变量,属于拼写错误。 - 缓冲区定义不合理:你定义的
buf1空间过小,无法容纳格式化后的完整字符串。
buf1语句作用说明
buf1是wsprintf函数的输出缓冲区:wsprintf会将txt1里的%d、%ph等占位符替换为你传入的实际数值、地址,生成完整的展示文本,最后将完整文本写入buf1中供后续MessageBox读取展示。
原定义buf1 dq 3 dup(0),0仅申请了25字节空间,完全不足以存储格式化后的字符串,建议修改为buf1 db 256 dup(0),申请256字节的字节类型缓冲区即可满足需求。
修正后完整代码
include \masm64\include64\masm64rt.inc .data ; 数据段定义 a dq 1 ; 操作数a b dq 0 ; 操作数b c dq 21 ; 常量21 d dq 5 ; 操作数d q dq 2 ; 常量2 res dq 0 ; 存储计算结果 title1 db "表达式计算结果. masm64",0 ; 弹窗标题 txt1 db "表达式 2d/a-21bd",10, "计算结果: %d",10,"结果变量内存地址: %p",10,10, "作者:Тарадай Святослав",0 ; 弹窗文本 buf1 db 256 dup(0) ; 字符串格式化缓冲区 .code ; 代码段,计算2d/a-21bd entry_point proc mov rax ,b ; 计算21bd部分,先将b存入rax mul c ; 乘以21 mul d ; 乘以d mov rsi, rax ; 暂存21bd的结果到rsi mov rax,d ; 计算2d/a部分,先将d存入rax mul q ; 乘以2 xor rdx,rdx ; 清空rdx为除法做准备 div a ; 除以a sub rax,rsi ; 2d/a 减去 21bd得到最终结果 mov res,rax ; 保存结果到res变量 invoke wsprintf,ADDR buf1,ADDR txt1,res, ADDR res ; 格式化输出文本 invoke MessageBox,0,ADDR buf1,ADDR title1,MB_ICONINFORMATION ; 弹出展示窗口 invoke ExitProcess,0 entry_point endp end
补充说明
编译时除了引入正确的头文件,还需要链接masm64对应的导入库,否则链接阶段会报函数未定义错误。
内容的提问来源于stack exchange,提问作者user16087723
相关产品推荐
相关产品推荐

