mda*_*701 2 64-bit assembly masm
我知道这可能是一个非常简单的问题,但在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
Run Code Online (Sandbox Code Playgroud)
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理解的数据类型的章节.
根据MASM版本6.1程序员指南,应该将TBYTE指令与所有其他数据定义指令不同,该指令将十进制整数初始化程序转换为FBLD和FBSTP指令使用的80位打包BCD(二进制编码的十进制)格式。 。正如fuz的答案更详细地解释了,80位压缩的BCD格式限制为18位十进制整数。
但是,我测试过的任何版本的MASM(包括MASM 6.1d)实际上都没有这种行为。使用带有TBYTE指令的初始化程序使用十进制整数会导致分配的内存使用80位整数值进行初始化。这就像与BYTE,WORD和DWORD一起使用的十进制整数如何分别导致将8位,16位和32位整数值用于初始化内存一样。
因此,请考虑以下代码:
WORD 12345
DWORD 12345
TBYTE 12345
Run Code Online (Sandbox Code Playgroud)
根据文档,此代码应导致使用以下字节(以十六进制显示)初始化内存:
39 30
39 30 00 00
45 23 01 00 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)
前两行使用16345和32位整数表示形式12345,而最后一行使用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
Run Code Online (Sandbox Code Playgroud)
与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.
Run Code Online (Sandbox Code Playgroud)