Tag: cpu registers

什么时候在C中使用寄存器?

我有类似的东西 register unsigned int a, b, c; int n; for (n = 0; n < 10; ++n){ c = a + b b = a a = c array[n] = c; } 它做什么,没关系。 代码以现在的方式快速运行,如果删除了register关键字,代码会更慢。 但是,当我在int n之前添加寄存器时,它实际上比现在运行得慢,但比没有使用寄存器时更快。 谁可以给我解释一下这个? 谢谢。

这段代码会损坏我的处理器吗?

一位朋友发给我该密码并声称它可能会损坏处理器。 真的吗? void damage_processor() { while (true) { // Assembly code that sets the five control registers bits to ones which causes a bunch of exceptions in the system and then damages the processor Asm( “mov cr0, 0xffffffff \n\t” “mov cr1, 0xffffffff \n\t” “mov cr2, 0xffffffff \n\t” “mov cr3, 0xffffffff \n\t” “mov cr4, 0xffffffff \n\t” […]

如何在c中打印寄存器的内容

我正在尝试调试我正在为UART编写的驱动程序,该驱动程序从串行控制台读取一串chars ,直到用户按下’l’。 该函数在下面称为’getstring()’。 我想检查状态寄存器的内容,以查看设置了哪些位。 状态寄存器偏移2.我需要在调用’getstring()’时打印它。 我可以使用printf() 。 这是UART的寄存器映射。 当我打电话给我怎么能打印出c中寄存器的内容? #define UART 0x00080000 void getchar(char *str) { volatile uint32_t *uart = (volatile uint32_t*) UART; char c = 0; do { while ((uart[2] & (1<<7)) == 0); c = uart[0]; *str++ = c; } while (c!='l'); } `

什么是CPUID标准function01H?

我需要检查ECX的第30位,这是RDRAND所需的CPUfunction。 来自RDRAND Wiki , 如果支持,则在调用CPUID标准function01H后设置ECX寄存器的第30位。 我不知道这意味着什么。 “标准function01H ”? 这是否意味着EAX = 80000001h ? 我不确定该怎么办。

为什么静态变量的地址相对于指令指针?

我正在按照本教程关于assembly。 根据教程(我也在本地尝试,并得到类似的结果),以下源代码: int natural_generator() { int a = 1; static int b = -1; b += 1; /* (1, 2) */ return a + b; } 编译到这些汇编指令: $ gdb static (gdb) break natural_generator (gdb) run (gdb) disassemble Dump of assembler code for function natural_generator: push %rbp mov %rsp,%rbp movl $0x1,-0x4(%rbp) mov 0x177(%rip),%eax # (1) add […]

C和C ++中寄存器变量的地址

我知道寄存器变量的概念和它的用例,但根据我的尝试,我脑子里几乎没有问题。 我无法访问C中的寄存器变量的地址,虽然我可以做C ++! 为什么? 访问寄存器变量的寻址有什么问题吗? 假设我在C ++中声明一个字符串变量作为寄存器,那么该变量将存储在哪里? 将C ++中的’string’等非数字数据类型的存储类声明为寄存器有什么意义? 更新:我认为C ++允许我们获取寄存器变量的地址,因为我的程序中没有出现任何错误,如下所示: #include #include using namespace std; clock_t beg, en; int main(){ int j, k=0; beg=clock(); for(register int i=0;i<10000000;i++){ /*if(k==0){ cout<<&i<<endl; // if this code is uncommented, then C++ rejects the recommendation to make 'i' as register k++; }*/ } en=clock(); cout<<en-beg<<endl; cout<<&j<<endl<<&k; return 0; } […]

从C / C ++代码执行RDMSR和WRMSR指令

我需要控制C-State配置。 具体来说,我可能想执行以下asm代码: __asm { rdmsr and eax, 0x00 or eax, 0x01 wrmsr } 目前,我在rdmsr行上rdmsr了这个exception: MessWithCStates.exe中0x00e3139e处的未处理exception:0xC0000096:特权指令。 我如何(永久)提升我的应用程序的权限,以便它可以执行上面的代码? 我使用VS 2010。 注意:无需编写内核模式驱动程序即可。 见R / W Everything 。

是否可以在C中访问32位寄存器?

是否可以在C中访问32位寄存器? 如果是,怎么样? 如果没有,那么有没有办法在C中嵌入汇编代码? 顺便说一下,我正在使用MinGW编译器。 提前致谢!

x86的MOV真的可以“免费”吗? 为什么我不能重现这个呢?

我一直看到人们声称MOV指令可以在x86中免费,因为寄存器重命名。 对于我的生活,我无法在一个测试用例中validation这一点。 每个测试用例我尝试揭穿它。 例如,这是我用Visual C ++编译的代码: #include #include #include int main(void) { unsigned int k, l, j; clock_t tstart = clock(); for (k = 0, j = 0, l = 0; j < UINT_MAX; ++j) { ++k; k = j; // <– comment out this line to remove the MOV instruction l += j; } […]