9得票2回答
任务门、中断门、调用门

我一直在尝试了解x86架构中不同的门。如果我理解正确,那么中断门和陷阱门分别用于硬件和软件中断处理。而CALL门可能已经不再使用,因为人们更喜欢使用SYSENTER和SYSEXIT。 我想知道任务门是如何使用的(我知道它们用于硬件任务切换)。这到底意味着什么?硬件任务是否指操作系统任务/进程...

9得票5回答
编写汇编器,需要帮助。

我正在为一项大学项目编写8086汇编程序。我已经通过互联网上的一些编译器设计资料,并阅读了《编译器龙书》。但问题是,我没有找到有关汇编(生成目标代码)部分的太多资料。是否有什么好的书籍或链接可以用于汇编设计?从哪里开始?我已经了解了词法分析、语法分析和中间代码生成。

12得票1回答
我的自旋锁有问题吗?

这是我的自旋锁实现,但它似乎无法保护关键代码。我的实现有什么问题吗?static __inline__ int xchg_asm(int* lock, int val) { int ret; __asm__ __volatile__( LOCK "movl (%1),%%e...

17得票5回答
在Mac OSX上使用x86汇编语言编写的“Hello World”程序

我想在我的Mac上进行一些x86汇编程序设计,但在生成可执行文件时遇到了问题。似乎问题出现在链接阶段。 helloWorld.s: .data HelloWorldString: .ascii "Hello World\n" .text .globl _start ...

52得票4回答
x86暂停指令在自旋锁中是如何工作的,它能在其他情况下使用吗?

pause指令通常用于测试自旋锁的循环中,当其他一些线程拥有自旋锁时,以减轻紧密循环的压力。据说它等效于一些NOP指令。请问有人能告诉我它如何确切地用于自旋锁优化吗?对我来说,即使是NOP指令也会浪费CPU时间。它们会降低CPU使用率吗? 另一个问题是,我是否可以将暂停指令用于其他类似目的。例...

17得票2回答
x86 NASM的'org'指令的含义是什么?

我正在按照这篇教程作为第一次尝试使用NASM在x86上进行引导程序/操作系统开发: http://joelgompert.com/OS/TableOfContents.htm 现在我在第4课,要求我的引导程序打印出“Hello, world”字符串。 我不理解org指令(伪指令)的含义。 ...

8得票4回答
在MSVC中将扩展精度浮点数(80位)转换为双精度浮点数(64位)

什么是将扩展精度浮点数(80位值,也被某些编译器称为long double)转换为双精度浮点数(64位)所需的最便携和“正确”的方法,在MSVC win32/win64中? MSVC目前(截至2010年)假定long double是double的同义词。我可能可以在内联汇编中编写fld/fst...

10得票1回答
为什么x86的CR1控制寄存器是保留的?

从i386 CPU开始,英特尔处理器就暴露了控制寄存器,以允许内核配置处理器并指定当前正在执行的任务/进程/线程的特性。根据英特尔系统编程手册(第2-13节)的说法,CR1控制寄存器为“保留”。也就是说,内核操纵控制寄存器CR1会导致未定义行为。正如这篇文章所指出的那样,还有CR2、CR3、C...

45得票7回答
最快的负数取反方法

今天早上我在思考,将一些正数变成负数,将一些负数变成正数的最快方法是什么,当然,最简单的方法可能是: int a = 10; a = a*(-1); 或者 int a = 10; a = -a; 但是,我想,我可以使用shift和指针命令来做到这一点......是否真的有可能使用s...

15得票3回答
为什么这个SIMD乘法没有比非SIMD乘法更快?

假设我们有一个函数,它可以将两个包含1000000个double元素的数组相乘。在C/C++中,该函数如下所示: void mul_c(double* a, double* b) { for (int i = 0; i != 1000000; ++i) { a...