我知道这可能是一个非常简单的问题,但在masm中,TBYTE在十六进制中可以容纳的最大值是多少?我正在研究64位系统。我的教科书说它可以容纳整数的最大值是999,999,999,999,999,999。我试过把它放在一个十六进制转换器中,它给了我DE0B6B3A763FFFF。我知道这是不对的,因为当我尝试使用此值运行一个小程序时,它会给我错误。
提前致谢!
Fuz,这是我正在制作的节目。我只需要根据数据类型初始化每个变量的最大值。
PreAuthorizationSecurityService
答案 0 :(得分:6)
8087浮点单元通过fbld
和fbstp
指令支持BCD编号。这些BCD编号是打包的,意味着它们由每个字节两位数表示。一个tbyte保存十个字节。第一个字节用于符号位,存储0x00表示正数,0x80表示负数。剩余的9个字节存储18位数,产生的最大值为999,999,999,999,999,999。
请注意,此限制不适用于fild
,fist
和fistp
说明。在那里,限制由2 15 - 1,2 32 - 1或2 64 - 1给出,具体取决于您的操作数大小选择。请注意,没有指令存储tbyte值的整数数据。
作为浮点数(fld
,fstp
),tbyte可以存储±3.65×10 -4951 和±1.18×10 之间的有限数4932 。但请注意,并非所有整数都可以准确表示。
我建议您重新阅读有关8087 FPU理解的数据类型的章节。
答案 1 :(得分:5)
根据MASM版本6.1程序员指南,TBYTE指令应该与所有其他数据定义指令不同,它将十进制整数初始化器转换为80位打包BCD(二进制编码十进制)格式由FBLD和FBSTP指令使用。由于fuz的答案更详细地解释了80位压缩BCD格式限制为18位十进制整数。
然而,我没有测试过的MASM版本,包括MASM 6.1d,实际上就是这样。使用十进制整数,具有TBYTE指令的初始化程序将导致分配的内存使用80位整数值进行初始化。这与使用BYTE,WORD和DWORD的十进制整数的结果类似,分别用于初始化内存的8位,16位和32位整数值。
例如,请考虑以下代码:
WORD 12345
DWORD 12345
TBYTE 12345
根据文档,此代码应导致使用以下字节初始化内存,以十六进制显示:
39 30
39 30 00 00
45 23 01 00 00 00 00 00 00 00
前两行使用12345的16位和32位整数表示,而最后一行使用80位压缩BCD格式的数字。
然而,MASM 6.1d以及每个版本的MASM我都尝试过Visual Studio 2017附带的最新版本,将上面的代码组装成以下字节:
39 30
39 30 00 00
39 30 00 00 00 00 00 00 00 00
与TBYTE一起使用十进制数的事实没有区别,正常的整数格式与其他指令一样使用。
这意味着TBYTE指令的实际范围不是80位打包BCD表示的实际范围,而是80位二进制补码整数的实际范围。所以你可以使用-604462909807314587353088到1208925819614629174706175的值。(或者至少在理论上,MASM 6.1d有一个错误,并且没有正确处理前一个数字。后来的版本修复了这个错误。)
请注意,虽然80位打包BCD类型支持x86 CPU,但如果仅通过FBLD和FBSTP指令,则没有指令可用于80位整数值。因此,除非您愿意自己编写80位整数算术代码,否则将TBYTE与整数一起使用并不是很有用。
通常,您使用的唯一80位类型是80位浮点类型。在这种情况下,虽然您可以使用TBYTE指令,但您应该使用REAL10指令,并且需要将数字指定为带小数点的浮点常量。因此,要使用80位浮点格式的数字12345初始化80位内存位置,您可以使用以下内容:
REAL10 12345.