一个 TBYTE 可以容纳的最大值
Largest value a TBYTE can hold
我知道这可能是一个很简单的问题,但是在masm中,一个TBYTE可以容纳的十六进制最大值是多少?我在 64 位系统上工作。我的教科书说它可以容纳的整数最大值是 999,999,999,999,999,999。我试着把它放在一个十六进制转换器中,它给了我 DE0B6B3A763FFFF。我知道这是不对的,因为当我尝试 运行 具有此值的小程序时,它会给我错误。
提前致谢!
Fuz,这是我正在处理的程序。我只需要根据数据类型用它可以容纳的最大值来初始化每个变量。
TITLE Initializing all data types to maximum value
INCLUDE Irvine32.inc
.data
bVar BYTE 255
sVar SBYTE 127
wVar WORD 65535
swVar SWORD 32767
dwVar DWORD 4294967295
sdwVar SDWORD 2147483647
fwVar FWORD 281474976710655
qwVar QWORD 18446744073709551615
tbVar TBYTE 1208925819614629174706175 ; This value works, but still not
clear why it works even though
it isn't in hex.
r4Var REAL4 3.40E+38
r8Var REAL8 1.79E+308
r10Var REAL10 1.18E+4932
.code
main PROC
exit
main ENDP
END main
8087浮点单元通过fbld
and fbstp
指令支持BCD数。这些 BCD 数字是 压缩的, 意思是,它们由每个字节的两位数字表示。一个 tbyte 包含十个字节。第一个字节用于符号位,存储 0x00 表示正数,0x80 表示负数。剩下的 9 个字节存储 18 个数字,产生最大的你观察到的 999,999,999,999,999,999。
请注意,此限制不适用于 fild
, fist
和 fistp
指令。在那里,极限由 215 − 1、232 − 1 或 264 给出− 1,取决于您选择的操作数大小。请注意,没有指令存储 1 t 字节的整数数据。
作为浮点数(fld
, fstp
),一个tbyte可以存储±3.65×10−4951和±1.18×10[=之间的有限数29=]4932。但是请注意,并非所有整数都可以精确表示。
我建议您重新阅读讨论 8087 FPU 理解的数据类型的章节。
根据 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 有一个错误,不能正确处理前一个数字。后来的版本修复了这个错误。)
请注意,虽然 x86 CPU 支持 80 位压缩 BCD 类型,但如果仅由 FBLD 和 FBSTP 指令支持,则没有任何指令可以处理 80 位整数值。因此,除非您愿意自己编写 80 位整数算术代码,否则将 TBYTE 与整数一起使用并不是很有用。
通常,您唯一会使用的 80 位类型是 80 位浮点类型。在这种情况下,虽然您可以使用 TBYTE 指令,但您应该改用 REAL10 指令,并且您需要将数字指定为带小数点的浮点常量。因此,要用 80 位浮点格式的数字 12345 初始化一个 80 位内存位置,您可以使用如下内容:
REAL10 12345.
我知道这可能是一个很简单的问题,但是在masm中,一个TBYTE可以容纳的十六进制最大值是多少?我在 64 位系统上工作。我的教科书说它可以容纳的整数最大值是 999,999,999,999,999,999。我试着把它放在一个十六进制转换器中,它给了我 DE0B6B3A763FFFF。我知道这是不对的,因为当我尝试 运行 具有此值的小程序时,它会给我错误。
提前致谢!
Fuz,这是我正在处理的程序。我只需要根据数据类型用它可以容纳的最大值来初始化每个变量。
TITLE Initializing all data types to maximum value
INCLUDE Irvine32.inc
.data
bVar BYTE 255
sVar SBYTE 127
wVar WORD 65535
swVar SWORD 32767
dwVar DWORD 4294967295
sdwVar SDWORD 2147483647
fwVar FWORD 281474976710655
qwVar QWORD 18446744073709551615
tbVar TBYTE 1208925819614629174706175 ; This value works, but still not
clear why it works even though
it isn't in hex.
r4Var REAL4 3.40E+38
r8Var REAL8 1.79E+308
r10Var REAL10 1.18E+4932
.code
main PROC
exit
main ENDP
END main
8087浮点单元通过fbld
and fbstp
指令支持BCD数。这些 BCD 数字是 压缩的, 意思是,它们由每个字节的两位数字表示。一个 tbyte 包含十个字节。第一个字节用于符号位,存储 0x00 表示正数,0x80 表示负数。剩下的 9 个字节存储 18 个数字,产生最大的你观察到的 999,999,999,999,999,999。
请注意,此限制不适用于 fild
, fist
和 fistp
指令。在那里,极限由 215 − 1、232 − 1 或 264 给出− 1,取决于您选择的操作数大小。请注意,没有指令存储 1 t 字节的整数数据。
作为浮点数(fld
, fstp
),一个tbyte可以存储±3.65×10−4951和±1.18×10[=之间的有限数29=]4932。但是请注意,并非所有整数都可以精确表示。
我建议您重新阅读讨论 8087 FPU 理解的数据类型的章节。
根据 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 有一个错误,不能正确处理前一个数字。后来的版本修复了这个错误。)
请注意,虽然 x86 CPU 支持 80 位压缩 BCD 类型,但如果仅由 FBLD 和 FBSTP 指令支持,则没有任何指令可以处理 80 位整数值。因此,除非您愿意自己编写 80 位整数算术代码,否则将 TBYTE 与整数一起使用并不是很有用。
通常,您唯一会使用的 80 位类型是 80 位浮点类型。在这种情况下,虽然您可以使用 TBYTE 指令,但您应该改用 REAL10 指令,并且您需要将数字指定为带小数点的浮点常量。因此,要用 80 位浮点格式的数字 12345 初始化一个 80 位内存位置,您可以使用如下内容:
REAL10 12345.