MASM32多数据类型输出到MessageBox显示异常问题排查
分析MessageBox中数据类型显示错乱的原因及修复方案
我仔细扒了你的汇编代码,发现几个关键问题直接导致了显示内容错乱,咱们一个个拆解:
核心问题:格式符与数据类型完全不匹配
这是最致命的点,crt_sprintf是严格按照格式符的要求从栈上读取对应大小的数据,你用错格式符的瞬间,后面所有参数的读取位置都会错位,结果自然全乱了:
- 你用
%d(对应32位有符号整数)输出8位的byte、16位的word类型:%d会一次性读取4字节,但byte只占1字节、word占2字节,这就会把后面相邻的参数数据也当成当前值的一部分,直接打乱整个参数序列。 - 浮点数部分,
real10(对应C的long double)不能用%g,MSVC的sprintf要求用%Lf(注意是大写的L)来解析这种80位扩展浮点数,用%g会直接解析错误。
次要问题:数据类型命名与定义混淆
你代码里的命名有点混乱,比如:
Ashort dd 6:dd是32位双字,对应C的int(也就是你注释的LongInt),但你却叫它ShortInt;真正的16位ShortInt应该用dw定义。这种命名混淆会让你自己对类型的判断出错,格式符自然也用不对。- 另外
Cshort dw 6032000这类值已经超过了16位有符号整数的范围(-32768~32767),会直接溢出,这也会导致显示异常。
修复方案
1. 严格匹配格式符和数据类型
给你整理好对应关系,直接用就行:
- 8位有符号整数(byte):
%hhd - 16位有符号整数(word/ShortInt):
%hd - 32位有符号整数(dd/LongInt):
%d - 64位有符号整数(dq/LongLong):
%lld - 32位浮点数(real4/Single):
%g或%f - 64位浮点数(real8/Double):
%g或%f - 80位扩展浮点数(real10/Extended):
%Lf
2. 修正数据类型的命名和定义
把命名和实际定义对应上,同时避免数值溢出:
; 16位ShortInt用dw定义(注意数值范围) Ashort dw 6 Bshort dw 603 nAshort dw -6 nBshort dw -603 ; 32位LongInt用dd定义 Along dd 6 Blong dd 603 Clong dd 6032000 nAlong dd -6 nBlong dd -603 nClong dd -6032000 ; 64位LongLong用dq定义 Aulong dq 6 Bulong dq 603 Culong dq 6032000 nAulong dq -6 nBulong dq -603 nCulong dq -6032000
3. 修改格式字符串
调整后的格式字符串示例,完全匹配对应的数据类型:
frmt db 'A (Byte) = %hhd',10 db '-A (Byte) = %hhd',10 db 'A (Word) = %hd',10 db 'B (Word) = %hd',10 db '-A (Word) = %hd',10 db '-B (Word) = %hd',10 db 'A (ShortInt) = %hd',10 db 'B (ShortInt) = %hd',10 db '-A (ShortInt) = %hd',10 db '-B (ShortInt) = %hd',10 db 'A (LongInt) = %d',10 db 'B (LongInt) = %d',10 db 'C (LongInt) = %d',10 db '-A (LongInt) = %d',10 db '-B (LongInt) = %d',10 db '-C (LongInt) = %d',10 db 'A (LongLong) = %lld',10 db 'B (LongLong) = %lld',10 db 'C (LongLong) = %lld',10 db '-A (LongLong) = %lld',10 db '-B (LongLong) = %lld',10 db '-C (LongLong) = %lld',10 db 'D (Single) = %g',10 db '-D (Single) = %g',10 db 'E (Double) = %g',10 db '-E (Double) = %g',10 db 'F (Extended) = %Lf',10 db '-F (Extended) = %Lf',0
说白了,只要把格式符和对应的数据类型严格对应上,参数序列就不会错位,显示内容自然就正常了。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

