Tag: 汇编

x86_64汇编程序中RBP寄存器的用途是什么?

所以我正在尝试学习一点assembly,因为我需要它用于计算机体系结构类。 我写了一些程序,比如打印Fibonacci序列。 我认识到每当我编写程序时,我都会使用这3行(正如我从gcc生成的汇编代码与它的C等价物进行比较所学到的): pushq %rbp movq %rsp, %rbp subq $16, %rsp 我有2个问题: 首先,为什么我使用%rbp ? 使用%rsp是不是更简单,因为它的内容在第二行被移动到%rbp ? 为什么我要从%rsp减去任何东西? 我的意思是它并不总是16 (当我printf 7行或8行变量时,我会减去24或28 我在虚拟机(4 GB RAM),Intel 64位处理器上使用Manjaro 64位

为什么x86的INC指令不是primefaces的?

我已经读过x86的INC指令不是primefaces的。 我的问题是怎么来的? 假设我们在x86-64上递增64位整数,我们可以用一条指令来完成,因为INC指令适用于内存变量和寄存器。 那么为什么它不是primefaces的呢?

x86指令缓存是如何同步的?

我喜欢这个例子,所以我在c中写了一些自修改代码… #include #include // linux int main(void) { unsigned char *c = mmap(NULL, 7, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE| MAP_ANONYMOUS, -1, 0); // get executable memory c[0] = 0b11000111; // mov (x86_64), immediate mode, full-sized (32 bits) c[1] = 0b11000000; // to register rax (000) which holds the return value // according to linux x86_64 calling convention c[6] […]

使用SSE获取__m128i向量中的最大值?

我刚开始使用SSE,我很困惑如何获得__m128i的最大整数值( max )。 例如: __m128i t = _mm_setr_ps(0,1,2,3); // max(t) = 3; 搜索引导我到MAXPS指令,但我似乎无法找到如何使用”xmmintrin.h” 。 另外,您是否会建议使用”xmmintrin.h”文档,而不是查看头文件本身?

CPU TSC提取操作,尤其是在多核多处理器环境中

在Linux世界中,要获得纳秒精度定时器/时钟提示,可以使用: #include int foo() { timespec ts; clock_gettime(CLOCK_REALTIME, &ts); //–snip– } 这个答案提出了一种使用RDTSC指令直接查询cpu时钟的asm方法。 在多核,多处理器架构中,如何在多个内核/处理器之间同步此时钟滴答/定时器值? 我的理解是,在固有的围栏中完成了。 这种理解是否正确? 你能否提出一些可以详细解释这个问题的文件? 我对Intel Nehalem和Sandy Bridge微体系结构感兴趣。 编辑 将进程限制为单个核心或cpu不是一种选择,因为该进程非常庞大(就消耗的资源而言)并且希望最佳地利用包含所有核心和处理器的机器中的所有资源。 编辑 感谢您确认TSC在核心和处理器之间同步。 但我最初的问题是这种同步是如何完成的? 它是否带有某种围栏? 你知道任何公共文件吗? 结论 感谢所有输入:以下是此讨论的结论:TSC在初始化时使用在多处理器/多核系统中的核心和处理器之间发生的RESET进行同步。 之后,每个Core都是独立的。 TSC保持不变,具有锁相环,可以规范频率变化,从而规范给定内核中的时钟变化,这就是TSC在内核和处理器之间保持同步的方式。

如何将64位操作数相乘并获得128位结果?

对于x64,我可以使用这个: { uint64_t hi, lo; // hi,lo = 64bit x 64bit multiply of c[0] and b[0] __asm__(“mulq %3\n\t” : “=d” (hi), “=a” (lo) : “%a” (c[0]), “rm” (b[0]) : “cc” ); a[0] += hi; a[1] += lo; } 但我想以可移植的方式执行相同的计算。 例如,在x86上工作。