Rust具有128位整数,这些整数用数据类型表示i128
(u128
对于无符号整数):
let a: i128 = 170141183460469231731687303715884105727;
Run Code Online (Sandbox Code Playgroud)
Rust如何使这些i128
值在64位系统上工作?例如,如何对这些进行算术运算?
据我所知,既然该值不能容纳在x86-64 CPU的一个寄存器中,那么编译器是否会以某种方式使用2个寄存器i128
?还是他们改用某种大整数结构来表示它们?
关于如何为多目标设置我的visual studio构建,我有点困惑.
背景:c#.NET v2.0,带有p /调用第三方32位DLL,SQL compact v3.5 SP1,带有安装项目.现在,平台目标设置为x86,因此可以在Windows x64上运行.
第三方公司刚刚发布了他们的DLL的64位版本,我想建立一个专用的64位程序.
这提出了一些我还没有得到答案的问题.我想拥有完全相同的代码库.我必须使用32位DLL或64位DLL的引用来构建.(第三方和SQL Server Compact)
这可以通过2组新配置(Debug64和Release64)来解决吗?
我必须创建2个单独的安装项目(标准视觉工作室项目,没有Wix或任何其他实用程序),还是可以在同一个.msi中解决?
任何想法和/或建议都会受到欢迎.
最近我一直在阅读一些SO档案,并遇到了针对x86架构的声明.
为什么我们需要不同的CPU架构用于服务器和迷你/大型机和混合核心?他说:
" PC架构一团糟,任何操作系统开发人员都会告诉你. "
学习汇编语言值得努力吗?(存档)说
"意识到x86架构充其量是可怕的 "
学习x86汇编程序的任何简单方法?他说:
" 大多数大学都教MIPS之类的装配,因为它更容易理解,x86装配非常难看 "
还有更多的评论
我试过搜索,但没有找到任何理由.我发现x86不好可能因为这是我熟悉的唯一架构.
有人可以给我一些考虑x86丑陋/坏/劣等的理由.
我正在尝试使用InstallUtil.exe安装Windows服务,并收到错误消息
System.BadImageFormatException:无法加载文件或程序集'
{xxx.exe}
'或其依赖项之一.尝试加载格式不正确的程序.
是什么赋予了?
编辑:(不是由OP)从dup获取的完整消息获得更多点击[对于googleability]:
C:\ Windows\Microsoft.NET\Framework64\v4.0.30319> InstallUtil.exe C:\ xxx.exe Microsoft(R).NET Framework安装实用程序版本4.0.30319.1版权所有(c)Microsoft Corporation.版权所有.
初始化安装时发生异常:System.BadImageFormatException:无法加载文件或程序集'file:/// C:\ xxx.exe'或其依赖项之一.尝试加载格式不正确的程序.
AMD has an ABI specification that describes the calling convention to use on x86-64. All OSes follow it, except for Windows which has it's own x86-64 calling convention. Why?
Does anyone know the technical, historical, or political reasons for this difference, or is it purely a matter of NIHsyndrome?
I understand that different OSes may have different needs for higher level things, but that doesn't explain why for example the register parameter passing order on Windows is rcx - rdx …
在x86-64 Tour of Intel Manuals中,我读到了
也许最令人惊讶的事实是,诸如
MOV EAX, EBX
自动将指令的高32位归零的指令RAX
.
同一来源引用的英特尔文档(3.4.1.1 64位手动基本架构中的通用寄存器)告诉我们:
- 64位操作数在目标通用寄存器中生成64位结果.
- 32位操作数生成32位结果,在目标通用寄存器中零扩展为64位结果.
- 8位和16位操作数生成8位或16位结果.目标通用寄存器的高56位或48位(分别)不会被操作修改.如果8位或16位操作的结果用于64位地址计算,则将寄存器显式符号扩展为完整的64位.
在x86-32和x86-64汇编中,16位指令如
mov ax, bx
Run Code Online (Sandbox Code Playgroud)
不要表现出这种"奇怪"的行为,即eax的上层词被归零.
因此:引入这种行为的原因是什么?乍一看似乎不合逻辑(但原因可能是我习惯了x86-32汇编的怪癖).
我正在用C++做一些性能关键的工作,我们目前正在使用整数计算来解决本质上浮点的问题,因为"它更快".这会导致很多令人烦恼的问题,并增加了许多烦人的代码.
现在,我记得在大约386天的时间里读到关于浮点计算如此缓慢的情况,我相信(IIRC)有一个可选的共同进程.但是现在肯定会有指数级更复杂和更强大的CPU,如果进行浮点或整数计算,它在"速度"上没有区别吗?特别是因为与导致管道停滞或从主存储器中取出某些东西相比,实际计算时间很短?
我知道正确的答案是在目标硬件上进行基准测试,测试它的好方法是什么?我编写了两个很小的C++程序,并将它们的运行时间与Linux上的"时间"进行了比较,但实际的运行时间变化太大(无法帮助我在虚拟服务器上运行).没有花一整天的时间来运行数百个基准测试,制作图表等等,我可以做些什么来合理地测试相对速度?任何想法或想法?我完全错了吗?
我使用的程序如下,它们不相同:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
int accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += rand( ) % 365;
}
std::cout << accum << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
计划2:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
float accum = 0;
srand( time( NULL …
Run Code Online (Sandbox Code Playgroud) 在一本书中,我读了以下内容:
32位处理器具有2 ^ 32个可能的地址,而当前的64位处理器具有48位地址空间
我的期望是,如果它是一个64位处理器,地址空间也应该是2 ^ 64.
所以我想知道这种限制的原因是什么?
x86-64 cpu-architecture virtual-memory processor-architecture
一位同事向我展示了我认为没有必要的代码,但果然,确实如此。我希望大多数编译器会将所有这三种相等性测试的尝试视为等效的:
#include <cstdint>
#include <cstring>
struct Point {
std::int32_t x, y;
};
[[nodiscard]]
bool naiveEqual(const Point &a, const Point &b) {
return a.x == b.x && a.y == b.y;
}
[[nodiscard]]
bool optimizedEqual(const Point &a, const Point &b) {
// Why can't the compiler produce the same assembly in naiveEqual as it does here?
std::uint64_t ai, bi;
static_assert(sizeof(Point) == sizeof(ai));
std::memcpy(&ai, &a, sizeof(Point));
std::memcpy(&bi, &b, sizeof(Point));
return ai == bi;
}
[[nodiscard]]
bool optimizedEqual2(const Point &a, const Point &b) { …
Run Code Online (Sandbox Code Playgroud) rep; nop
意思?pause
指令一样吗?rep nop
(没有分号)相同?nop
指令有什么区别?在另一个问题的评论中进行了一些讨论后,我意识到我不知道rep; nop;
x86(或x86-64)汇编中的含义.而且我也无法在网上找到一个好的解释.
我知道这rep
是一个前缀,意味着"重复下一个指令cx
时间"(或至少它是,在旧的16位x86汇编中).根据这一维基百科汇总表,似乎rep
只能与使用movs
,stos
,cmps
,lods
,scas
(但也许是对新的处理器去掉这个限制).因此,我认为rep nop
(没有分号)将重复nop
操作cx
时间.
然而,经过进一步搜索,我更加困惑.它似乎rep; nop
并pause
映射到完全相同的操作码,并且pause
有一些不同的行为nop
.2005年的一些旧邮件说不同的东西:
有了这些不同的意见,我无法理解正确的含义.