x86

CMP+JE 是否比单个 MUL 消耗更多时钟周期?

我正在运行 x86 处理器,但我相信我的问题很笼统。我很好奇 CMP + JE 序列与单个 MUL 操作所消耗的时钟周期的理论差异。 在 C 伪代码中: unsigned foo = 1; /* must be 0 or 1 */ unsigned num = 0; /* Method 1: CMP + JE*/ if(foo == 1){ num = 5; } /* Met... »

c

x86汇编,堆栈推送指令

我刚刚发现 push 指令可以有一个立即数 byte 、 word 、 dword 参数,并且每个参数都有不同的操作码。我正在阅读的书中没有示例,所以我不明白汇编程序如何区分这三种类型。例如,如果我写push 12h,汇编器将如何解释它,堆栈上实际会发生什么? ... »

为什么 x86 汇编中的第一个参数从偏移量 8 开始?

我正在努力加深对汇编语言的理解。我知道当函数创建堆栈帧时,它会推送当前的EBP,而不是将堆栈指针值复制到EBP。第一个(也是唯一的)函数参数由EBP + 8 访问。但是为什么是8?推送EBP后的下一个值逻辑上偏移4。我看了很多网页,但似乎我不明白这部分。... »

GCC -msse2 不生成 SIMD 代码

我想弄清楚为什么 g++ 不生成 SIMD 代码。 信息 GCC/操作系统/CPU: $ gcc -v gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) $ cat /proc/cpuinfo ... model name : Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz ... 这是我的 C++... »

c++

什么在 x86 中调用 _start?

有一个 c 运行时库,根据 https://en.wikipedia.org/wiki/Crt0 在文件 ctr0.o 中调用以在调用 main 之前初始化变量。我在这里复制了它: .text .globl _start str : .asciz "abcd\n" _start: xor %ebp, %ebp #basePointer == 0 mov (%rsp), %e... »

为什么 db 可以接受超过 1 个字节?

如果db代表Define Byte并且可以容纳8位(1个字节),为什么我们可以在db中使用6个字节的字符串?我知道一个字符只有1个字节,而db拥有1个字节。 section .data text db "Yellow" db 在更高级的语言(与 asm 相比)中就像 char 一样,我们可以只增加缓冲区,但汇编会自动吗? #include <stdio.h> int mai... »

c

x86_64 执行 Shellcode 失败:

我在 64 位 Linux 上使用 Python 2.7。我有以下 Python 脚本,女巫应该执行一个简单的 Hello World shellcode。 import urllib2 import ctypes shellcode = "\xb8\x01\x00\x00\x00\xbf\x01\x00\x00\x00\x48\xbe\xd8\x00\x60\x00\x00\x00\x00\... »

这个 x86-64 代码中的 lea 有什么作用? [复制]

这些是函数的前四行。我知道前两行在堆栈中创建了一个新框架,基本上是“设置”行。 lea 指令有什么作用? 40148e: 48 83 ec 18 sub $0x18,%rsp 401492: 48 89 f2 mov %rsi,%rdx 401495: 48 8d 4e 04 lea 0x4(%rsi),%rcx 401499: 48 8d 46 14 ... »

如何同时使用 omp parallel for 和 omp simd?

我想测试#pragma omp parallel for 和#pragma omp simd 的简单矩阵加法程序。当我分别使用它们时,我没有收到任何错误,而且看起来很好。但是,我想测试使用它们两者可以获得多少性能。如果我在外循环之前使用#pragma omp parallel for,在内循环之前使用#pragma omp simd,我也不会出错。当我在外循环之前同时使用它们时会发生错误。我在运行... »

c

音频在 Virtualbox 上运行的 Android 上不起作用?

我在 Virtualbox 上安装了 Android,我使用的是从 http://www.android-x86.org/download 下载的 Android x86 我选择了 2.3 版本的 eeepc 版本 (android-x86-2.3-RC1-eeepc.iso)。 问题是声音不起作用,我在 Virtualbox 设置中尝试了所有 3 个选项。 我当前的设置: Host driv... »

为什么我的代码会在 x86-64 上导致三重错误?

我有一个使用 UEFI 引导的小型 x86-64 内核。起初,我直接在 0x400000 处加载内核,但后来我想要一个更高的一半内核,因为我觉得这是做事的正确方法。我决定采用将内核分成两部分的策略。一个称为 startup.elf(启动代码),一个称为 kernel.elf(主内核)。启动代码应该为前 4MB 设置标识分页,并为高半内核设置分页结构。我计划将 0x8000_0000_0000 映射... »

c++

默认使用哪个段寄存器?

我正在学习英特尔手册中的计算机体系结构。我的理解是,我们给出的指令是逻辑地址,由段选择器和偏移量组成。 基本上是CS register<<4 + offset。 Segment Selector 映射到 GDT 或 LDT,如段选择器的 TI 位中所给。 GDT 由Segment Descriptors 组成,其中有BASE、LIMIT 和RPL,输出是基地址。这个base addre... »

执行 uop 计数不是处理器宽度倍数的循环时性能会降低吗?

我想知道各种大小的循环如何在最近的 x86 处理器上执行,作为 uop 数量的函数。 这是 Peter Cordes 在another question 中提出非 4 计数问题的引述: 我还发现循环缓冲区外的 uop 带宽不是 如果循环不是 4 uop 的倍数,则每个循环恒定 4。 (IE。 它是 abc, abc, ...;不是 abca,bcab,...)。 Agner Fo... »

什么时候需要 x86 LFENCE、SFENCE 和 MFENCE 指令?

好的,我一直在阅读 SO 关于 x86 CPU 围栏的以下问题(LFENCE、SFENCE 和 MFENCE): Does it make any sense instruction LFENCE in processors x86/x86_64? What is the impact SFENCE and LFENCE to caches of neighboring cores? Is t... »

GNU Assembler 无法比较两个变量字符串

我无法在 gnu 汇编器中比较两个变量字符串 mov $[name], %eax # move name into eax mov $[constname], %ebx # move constname into ebx cmp %eax, %ebx # compare two operands je if ... »

x86_64 程序集中写入节 .data 的分段错误:

为什么会出现分段错误? 我使用nasm -f elf64 t.asm -o t.old t.o -o t在linux上编译。 我已经做了所有我能想到的。 section .data: variable_int db 1 variable_string db "yaaaa", 10 section .text: global _start _start: mov rax, 1 m... »