Assembly 如何通过装配获得建筑尺寸?

Assembly 如何通过装配获得建筑尺寸?,assembly,cpu-architecture,Assembly,Cpu Architecture,在32位机器上,它应该是4字节 在64位上,它应该是8字节 如何使用汇编获取数据?从内存中读取数据。读取的字节数就是您要查找的。不要问怎么做,因为您没有指定任何特定的CPU。 无论如何,如果您为32位计算机编写代码,它也将在64位计算机上运行,而事实并非如此。 而且,由于您是在asm中编程的,您应该为32位和64位机器使用不同的编码,以利用CPU的能力。想想strlen()函数,64位版本的速度是32位版本的两倍;它们都基于相同的算法,但编码稍有不同。这个问题基于一个错误的前提——有很多CPU的

在32位机器上,它应该是4字节

在64位上,它应该是8字节


如何使用汇编获取数据?

从内存中读取数据。读取的字节数就是您要查找的。不要问怎么做,因为您没有指定任何特定的CPU。
无论如何,如果您为32位计算机编写代码,它也将在64位计算机上运行,而事实并非如此。

而且,由于您是在asm中编程的,您应该为32位和64位机器使用不同的编码,以利用CPU的能力。想想strlen()函数,64位版本的速度是32位版本的两倍;它们都基于相同的算法,但编码稍有不同。

这个问题基于一个错误的前提——有很多CPU的寄存器大小与概念架构大小不一样。还有一些体系结构具有不同大小的地址寄存器和通用寄存器。@Paul R,我意识到了这一点,并重新表述了我的问题:)@compile fan:您在编译时/汇编时就已经知道了体系结构的大小-在任何情况下都不需要在运行时确定它。@compile fan:是的,您只需要使用预处理器宏,就可以有条件地对32位和64位进行汇编。顺便说一下,如果问题是特定于x86和x86—64,那么你应该可能会这样做——在英特尔X86之外还有一个更大更复杂的世界。@编译FAN:预处理器定义通常在汇编源中可用,就像C、C++和其他语言一样——你实际上并没有说你使用的操作系统或工具,所以很难说得更具体。这是胡说八道。你的意思是将寄存器归零,然后从一个包含所有1的块中加载,然后看看寄存器中有多少位都是1?即使这样做有效,这也是一个糟糕的答案。机器的尺寸在装配时总是已知的,所以进行任何类型的运行时检查都是愚蠢的。(除了在某些x86与x86-64代码注入场景中,相同的机器代码片段可能被精心编制以在i386和amd64上工作之外)。