代码之家  ›  专栏  ›  技术社区  ›  mdave1701

TBYTE可以容纳的最大值

  •  3
  • mdave1701  · 技术社区  · 9 年前

    我知道这可能是一个非常简单的问题,但在masm中,一个TBYTE在十六进制中可以容纳的最大值是多少?我正在研究一个64位系统。我的教科书上说,它在整数中所能容纳的最大值是99999999。我试着把它放在一个十六进制转换器中,它给了我DE0B6B3A763FFFF。我知道这是不对的,因为当我试图用这个值运行一个小程序时,它会给我错误。

    傅,这是我正在做的程序。我只需要根据数据类型,用每个变量可以容纳的最大值初始化每个变量。

    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
    
    2 回复  |  直到 9 年前
        1
  •  6
  •   Ross Ridge    9 年前

    根据MASM 6.1版程序员指南,TBYTE指令应不同于所有其他数据定义指令,因为它将十进制整数初始值设定项转换为FBLD和FBSTP指令使用的80位压缩BCD(二进制编码十进制)格式。正如fuz的回答更详细地解释的那样,80位压缩BCD格式仅限于18位十进制整数。

    然而,我测试过的MASM的任何版本,包括MASM 6.1d,实际上都不是这样的。使用十进制整数,带有TBYTE指令的初始值设定项会导致分配的内存用80位整数值初始化。这就像与字节、字和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
    

    前两行使用16位和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
    

    十进制数与TBYTE一起使用这一事实没有什么不同,正常整数格式与其他指令一样使用。

    请注意,虽然x86 CPU支持80位压缩BCD类型,但如果仅由FBLD和FBSTP指令支持,则没有适用于80位整数值的指令。因此,除非您愿意自己编写80位整数算术代码,否则将TBYTE与整数结合使用并不完全有用。

    通常,您会使用的唯一80位类型是80位浮点类型。在这种情况下,虽然可以使用TBYTE指令,但应该使用REAL10指令,并且需要将数字指定为带小数点的浮点常量。因此,要以80位浮点格式初始化数字为12345的80位内存位置,您可以使用以下内容:

        REAL10  12345.
    
        2
  •  6
  •   fuz    9 年前

    8087浮点单元通过 fbld 和 fbstp 指示这些BCD数字是 也就是说,它们由每个字节两位数字表示。一个字节可以容纳十个字节。第一个字节用于符号位,存储0x00表示正数,0x80表示负数。剩下的9个字节存储18位数字,最大值为999999999。

    请注意,此限制不适用于 fild , fist 和 fistp 说明书其中,极限由2给出 15 1, 2 32 1或2 64 1,具体取决于您选择的操作数大小。请注意,没有任何指令存储相当于tbyte的整数数据。

    作为浮点数( fld fstp ),一个tbyte可以在和之间存储有限的数字;下午;3.6510 和(&A);下午;1.1810 4932 . 然而,请注意,并非所有整数都可以精确表示。

    我建议您重新阅读有关8087 FPU理解的数据类型的章节。

    推荐文章