标签: x86-64

Rust的128位整数“ i128”如何在64位系统上工作?

Rust具有128位整数,这些整数用数据类型表示i128u128对于无符号整数):

let a: i128 = 170141183460469231731687303715884105727;
Run Code Online (Sandbox Code Playgroud)

Rust如何使这些i128值在64位系统上工作?例如,如何对这些进行算术运算?

据我所知,既然该值不能容纳在x86-64 CPU的一个寄存器中,那么编译器是否会以某种方式使用2个寄存器i128?还是他们改用某种大整数结构来表示它们?

x86-64 int128 bigint rust llvm-codegen

116
推荐指数
4
解决办法
1万
查看次数

在同一解决方案/项目中使用Visual Studio定位32位和64位

关于如何为多目标设置我的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中解决?

任何想法和/或建议都会受到欢迎.

.net 64-bit x86-64 visual-studio

110
推荐指数
2
解决办法
10万
查看次数

为什么x86难看?为什么与其他人相比,它被认为是劣等的?

最近我一直在阅读一些SO档案,并遇到了针对x86架构的声明.

还有更多的评论

我试过搜索,但没有找到任何理由.我发现x86不好可能因为这是我熟悉的唯一架构.

有人可以给我一些考虑x86丑陋/坏/劣等的理由.

x86 assembly x86-64 mips cpu-architecture

101
推荐指数
6
解决办法
3万
查看次数

System.BadImageFormatException:无法加载文件或程序集(来自installutil.exe)

我正在尝试使用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'或其依赖项之一.尝试加载格式不正确的程序.

.net 64-bit x86 windows-services x86-64

97
推荐指数
6
解决办法
12万
查看次数

Why does Windows64 use a different calling convention from all other OSes on x86-64?

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 …

windows x86-64 calling-convention

97
推荐指数
4
解决办法
2万
查看次数

为什么32位寄存器上的x86-64指令归零整个64位寄存器的上半部分?

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汇编的怪癖).

x86 assembly x86-64 cpu-registers zero-extension

97
推荐指数
3
解决办法
2万
查看次数

浮点与现代硬件上的整数计算

我正在用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)

c++ floating-point x86 x86-64

96
推荐指数
8
解决办法
9万
查看次数

为什么x86-64系统只有48位虚拟地址空间?

在一本书中,我读了以下内容:

32位处理器具有2 ^ 32个可能的地址,而当前的64位处理器具有48位地址空间

我的期望是,如果它是一个64位处理器,地址空间也应该是2 ^ 64.

所以我想知道这种限制的原因是什么?

x86-64 cpu-architecture virtual-memory processor-architecture

88
推荐指数
7
解决办法
4万
查看次数

为什么 GCC 不能为两个 int32s 的结构生成最佳 operator==?

一位同事向我展示了我认为没有必要的代码,但果然,确实如此。我希望大多数编译器会将所有这三种相等性测试的尝试视为等效的:

#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)

c++ gcc x86-64 micro-optimization compiler-optimization

86
推荐指数
3
解决办法
4658
查看次数

什么是"代表; nop;" 在x86汇编中意味着什么?它与"暂停"指令相同吗?

  • 什么rep; nop意思?
  • 它和pause指令一样吗?
  • 它是否与rep nop(没有分号)相同?
  • 这个简单的nop指令有什么区别?
  • 它在AMD和英特尔处理器上的表现是否不同?
  • (奖金)这些说明的官方文件在哪里?

这个问题的动机

另一个问题的评论中进行一些讨论后,我意识到我不知道rep; nop;x86(或x86-64)汇编中的含义.而且我也无法在网上找到一个好的解释.

我知道这rep是一个前缀,意味着"重复下一个指令cx时间"(或至少它是,在旧的16位x86汇编中).根据这一维基百科汇总表,似乎rep只能与使用movs,stos,cmps,lods,scas(但也许是对新的处理器去掉这个限制).因此,我认为rep nop(没有分号)将重复nop操作cx时间.

然而,经过进一步搜索,我更加困惑.它似乎rep; noppause 映射到完全相同的操作码,并且pause有一些不同的行为nop.2005年的一些旧邮件说不同的东西:

  • "尽量不要燃烧太多的力量"
  • "它只相当于'nop',仅使用2字节编码."
  • "这对英特尔来说是神奇的.它就像'nop但是让其他HT兄弟跑了'"
  • "这是暂停英特尔和Athlon的快速填充"

有了这些不同的意见,我无法理解正确的含义.

它正在Linux内核中使用(在i386x86_64上)以及此注释:/* REP …

cpu x86 assembly x86-64 machine-code

80
推荐指数
2
解决办法
2万
查看次数