assembly - TBYTE 可容纳的最大值(value)

标签 assembly 64-bit 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

最佳答案

根据 MA​​SM 版本 6.1 程序员指南,TBYTE 指令应该与所有其他数据定义指令不同,因为它将十进制整数初始值设定项转换为 FBLD 使用的 80 位打包 BCD(二进制编码的十进制)格式和 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.

关于assembly - TBYTE 可容纳的最大值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46451773/

相关文章:

c - 将 C 代码翻译成汇编

gcc - Gnu AS 似乎不预处理#defines,但 GCC 会

assembly - 使用 gdb 从内存位置读取?

assembly - IEEE 754 非规范化十进制转换为半点二进制

vb.net - 如何在 Visual Studio 2010 中构建 64 位 Visual Basic.NET?

c++ - 循环遍历一系列字符并在汇编中交换它们

c++ - 在 MS x64 调用约定中,是否需要为 WinAPI 调用创建影子空间?

c++ - 64 位土地中的堆碎片

java - 在java中的64位机器上运行32位dll

visual-studio-2010 - masm 中以字母开头的十六进制值