30得票5回答
在x86架构中,哪种写屏障更好:lock+addl还是xchgl?

Linux内核使用lock; addl $0,0(%%esp)作为写障碍,而RE2库使用xchgl (%0),%0作为写障碍。它们有什么区别,哪一个更好? x86是否也需要读屏障指令? 在x86上,RE2将其读屏障函数定义为无操作,而Linux将其定义为lfence或无操作,具体取决于SSE...

9得票3回答
dw和dd指令与db指令在字符串方面有何不同?

假设我想在运行汇编程序之前定义一个已初始化的变量字符串(位于section .data中)。我选择创建的变量为Digits,它是一个包含所有十六进制符号的字符串。 Digits: db "0123456789ABCDEF" 我使用db来定义变量,这意味着它是一个字节(8位)长。但对我来说...

184得票12回答
MOV和LEA有何区别?

我想知道这些指令之间的区别:MOV AX, [TABLE-ADDR] 并且LEA AX, [TABLE-ADDR]

69得票2回答
VA(虚拟地址)和RVA(相对虚拟地址)

给链接器作为输入的文件称为目标文件。链接器生成一个映像文件,然后由加载器用作输入。 来自Microsoft Portable Executable and Common Object File Format Specification的简介 RVA(相对虚拟地址)。在映像文件中,加载到内存中...

8得票2回答
ARM上延迟循环中的每指令周期数

我正在尝试理解由arm-none-eabi-gcc为stm32f103芯片组生成的汇编代码,但其运行速度似乎只有我预期速度的一半。虽然我不太熟悉汇编语言,但是因为每个人都说如果你想了解编译器在做什么,就要阅读汇编代码,所以我正在尝试着去理解它。这是一个简单的函数: void delay(vo...

18得票1回答
GCC是否生成Canary?

我的gcc版本是4.8.2,操作系统是ubuntu 14.04(64位)。 我发现有时候gcc会自动生成canary以进行缓冲区溢出保护,有时却不会。为什么? 生成canary的情况:当SIZE是4的倍数时。#include<stdio.h> #define SIZE 4 int...

69得票1回答
x86指令是否需要它们自己的编码以及它们所有的参数同时存在于内存中?

我正在尝试弄清楚是否可能运行一个Linux虚拟机,其RAM仅由单个物理页面支持。 为了模拟这种情况,我修改了KVM中的嵌套页错误处理程序,以删除所有嵌套页表(NPT)条目中的存在位,除了与当前处理的页错误对应的那个。 在尝试启动Linux客户机时,我观察到使用内存操作数的汇编指令,例如ad...

8得票2回答
在AVR中断中保留SREG

AVR微控制器中用于保存状态寄存器sreg的机制是什么?RETI 暗示着这些位不在堆栈上。是否有一个通用寄存器也是sreg或类似的东西?

15得票4回答
软件能否永久性损坏硬件?

我刚刚阅读了这个问题:Could this code damage my processor?,这让我思考。 是否可能仅通过软件来损坏硬件?我听说在“好旧的日子”(TM)中,当硬盘执行器由软件控制时,它们可以撞击到中央主轴,从而永久性地损坏驱动器。 还有臭名昭著的Chernobyl病毒,它...

10得票1回答
gcc和clang为什么不使用sub / jnc来进行while(i--)的优化?

有些人在需要不带计数器或带有 n-1, ..., 0 计数器的循环时会编写这样的代码: while (i--) { ... } 一个具体的例子: volatile int sink; void countdown_i_used() { unsigned i = 1000; ...