在哪里可以找到用于此体系结构的新寄存器的名称?
我指的是X86中的寄存器,如EAX,ESP,EBX等.但我喜欢它们在64位.
我不认为它们与我拆解C代码时的情况相同,我得到r而不是e.
使用Visual Studio让cmake在Windows上构建x86的一种方法是这样的:
cmake -G "NMake Makefiles" \path_to_source\使用Visual Studio让cmake在Windows上构建x64的一种方法是这样的:
cmake -G "NMake Makefiles" \path_to_source\使用Cmake,我如何编译其中一个或两个架构?(就像Visual Studio在IDE中的表现一样)
我正在尝试创建一个自旋锁的哑版.浏览网页时,我在x86中遇到了一个名为"PAUSE"的汇编指令,该指令用于向处理器提供当前在此CPU上运行自旋锁的提示.英特尔手册和其他可用信息说明了这一点
在大多数情况下,处理器使用此提示来避免内存顺序违规,从而大大提高了处理器性能.因此,建议在所有自旋等待循环中放置PAUSE指令.文档还提到"等待(一些延迟)"是指令的伪实现.
上段的最后一行很直观.如果我没有成功抓住锁,我必须等待一段时间然后再抓住锁.
但是,在旋转锁定的情况下,内存顺序违规是什么意思?"内存顺序违规"是否意味着旋转锁定后指令的错误推测加载/存储?
关于堆栈溢出之前已经询问了自旋锁定问题但是内存顺序违规问题仍未得到解决(至少对于我的理解).
我真的很想学习装配.我非常擅长c/c ++,但希望更好地了解较低级别的内容.
我意识到之前已经提出了与装配相关的问题,但我只是在寻找一些特定于我的情况的方向:
我正在运行Windows 7,我对如何开始使用汇编感到困惑.我是否必须从x64开始,因为我正在运行Windows 7?有些人说"先从32位开始" - 我该如何做呢?我的操作系统与我为'32'或'64'位写入汇编的能力有什么关系.事实上,'n位'汇编意味着什么,其中n是一个数字?
编辑:
以下是一些帮助我开始组装的链接; 刚刚入门的其他人可能会发现它们很有帮助.随着我继续组装之旅,我将继续更新此列表:)
注意:正如我一直在学习的那样,我决定专注于使用masm32进行编程.因此,以下大多数资源都集中于此.
Agner Fog的软件优化资源,包括在不同平台(Windows与Linux/OS X)上调用约定的一些好东西,以及如何有效地执行特定事务的大量示例.不适合初学者,但对于中级到高级读者来说非常棒.
(他还为英特尔和AMD CPU的每条指令提供了详细的性能信息,非常适合严格的性能微优化.一些初学者可能想要了解其中的一些内容,开始考虑CPU的工作原理,以及为什么你可以做一些事情方式而不是另一种方式.)
我在微软的网站上注意到两个不同的安装程序,一个用于x64,另一个用于IA-64.参考:安装.NET Framework 4.5,4.5.1
我的理解是IA-64是x64的子类,所以我很好奇它为什么会有一个单独的安装程序.如果可能的话,我们将不胜感激.
典型的malloc(对于x86-64平台和Linux操作系统)是否在开始时天真地锁定互斥锁并在完成时释放它,或者是否以更精巧的方式更智能地锁定互斥锁,从而减少锁争用?如果它确实是第二种方式,它是如何做到的?
我用LD_PRELOADing一个特定的库来运行一个程序.像这样.
LD_PRELOAD=./my.so ./my_program
Run Code Online (Sandbox Code Playgroud)
如何使用gdb运行此程序?
所以我正在尝试学习一点装配,因为我需要它用于计算机体系结构类.我写了一些程序,比如打印Fibonacci序列.
我认识到每当我编写程序时,我都会使用这3行(正如我从比较生成的汇编代码中学gcc到的那样C):
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
Run Code Online (Sandbox Code Playgroud)
我有2个问题:
%rbp?使用起来不是很简单%rsp,因为它的内容被移到%rbp了第二行吗?%rsp?我的意思是并非总是16(当我在printf第7行或第8行变量时,我会减去24或减去28我在虚拟机(4 GB RAM),Intel 64位处理器上使用Manjaro 64位
我知道x64架构的一些显而易见的好处(更高的可寻址RAM地址等)......但是:
这是我的测试代码:
#include <chrono>
#include <iostream>
#include <cstdlib>
using namespace std;
using ll = long long;
int main()
{
__int128_t a, b;
ll x, y;
a = rand() + 10000000;
b = rand() % 50000;
auto t0 = chrono::steady_clock::now();
for (int i = 0; i < 100000000; i++)
{
a += b;
a /= b;
b *= a;
b -= a;
a %= b;
}
cout << chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - t0).count() << ' '
<< (ll)a % 100000 << '\n';
x = …Run Code Online (Sandbox Code Playgroud)