Tag: 汇编

gcc,内联汇编 – pushad / popad缺失?

有什么方法可以避免将pushad / popad指令体复制粘贴到我的代码中? 因为gcc(当前标志: -Wall -m32 )抱怨这一点 __asm__(“pushad;”); 错误:没有这样的指令:`pushad’ __asm__(“popad;”); 错误:没有这样的指令:`popad’

有人可以解释exynos ARM中的电源控制寄存器吗?

在Linux内核中,更准确地说是3.9- rc6上的/arch/arm/mach-exynos/cpuidle.c ,这些行读取 static unsigned int g_pwr_ctrl, g_diag_reg; static void save_cpu_arch_register(void) { /*read power control register*/ asm(“mrc p15, 0, %0, c15, c0, 0” : “=r”(g_pwr_ctrl) : : “cc”); /*read diagnostic register*/ asm(“mrc p15, 0, %0, c15, c0, 1” : “=r”(g_diag_reg) : : “cc”); return; } 在研究了这个问题后,这似乎是gcc内联汇编。 考虑到它是一个关键组件, asm正在阅读它 更快,因此更有效率 不适用于C. 我检查了ARM手册中的MCR因为我正在学习汇编,但我可以告诉MCR是一个协处理器,因为它有三个字母长度。 内联asm似乎访问功率控制寄存器并将结果(从寄存器)保存到第一行中的无符号整数(我希望在某个时刻调用)。 关于电源控制寄存器,臂手册列出, 实现Cortex-A9处理器的时钟延迟 动态时钟门控。 […]

为什么gcc反汇编程序为局部变量分配额外的空间?

我用C编写了简单的函数, void GetInput() { char buffer[8]; gets(buffer); puts(buffer); } 当我在gdb的反汇编程序中对它进行反汇编时,它会进行以下反汇编。 0x08048464 : push %ebp 0x08048465 : mov %esp,%ebp 0x08048467 : sub $0x10,%esp 0x0804846a : mov %gs:0x14,%eax 0x08048470 : mov %eax,-0x4(%ebp) 0x08048473 : xor %eax,%eax => 0x08048475 : lea -0xc(%ebp),%eax 0x08048478 : mov %eax,(%esp) 0x0804847b : call 0x8048360 0x08048480 : lea -0xc(%ebp),%eax 0x08048483 : mov %eax,(%esp) […]

关于c中“非法”的优化?

在学习编译器优化时,我在Linux下使用GCC版本gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5.1)编写代码 为了理解C中not a statement (nop),我先写了两个代码,然后使用gcc -S选项generate their compiled assembly code 。 拳头代码yc desktop:~$ cat yc main() { int i=0; } desktop:~$ gcc -S yc desktop:~$ 第二个代码xc desktop:~$ cat xc main() { int i=0; /* Loops and if*/ while(0); for(;0;); if(0); /* Arithmetic Operations */ i * i; i / i; i […]

在主要C / C ++编译器生成的代码中注册分配规则

我记得一段时间以前的一些规则(32位以前的英特尔处理器),当时很频繁(至少对我而言)必须分析C / C ++编译器生成的汇编输出(在我看来,当时是Borland / Turbo)找到性能瓶颈,并安全地将程序集例程与C / C ++代码混合。 比如将SI寄存器用于this指针,AX用于返回值,当汇编例程返回时应保留哪些寄存器等。 现在我想知道是否有更多流行的C / C ++编译器(Visual C ++,GCC,Intel ……)和处理器(Intel,ARM,…)的参考,如果没有,在哪里找到要创建的部分一。 想法?

汇编,多个参数-m32 / linux(与C中的stdarg相同)

为了解决这个问题,我理解C,我仍然是大会的初学者,所以我在这里遇到了一个小问题。 我在使用多个参数时遇到了一些麻烦,如果我应该这样做,可能会计算它们,并在汇编代码中使用format参数。 尝试将一些字节添加到具有许多参数的字符串中。 我知道如何将两个第一个参数放在堆栈上,但是第一个参数之后的其他参数是格式(如%s,%d,%c等),第一个参数是应该是变量i的那个想写信给。 在C中,标准main具有参数计数器。 我可能想在这里算一下这些论点!? 我怎么能这样做,如果这是怎么做的? .globl minisprintf # Name: minisprintf # Synopsis: A simplified sprintf # C-signature: int minisprintf(unsigned char *res, unsigned char *format, …); # Registers: AL: for characters # %ECX: first argument, res # %EDX: second argument, args # minisprintf: # minisprintf pushl %ebp # start of movl %esp, %ebp # […]

如何访问c变量以进行内联汇编操作

鉴于此代码: #include int main(int argc, char **argv) { int x = 1; printf(“Hello x = %d\n”, x); } 我想在内联汇编中访问和操作变量x。 理想情况下,我想使用内联汇编更改其值。 GNU汇编程序,并使用AT&T语法。

在gcc内联asm中data32 data32 nopw%cs:0x0(%rax,%rax,1)指令是什么意思?

在为gcc编译器的-O2优化运行一些测试时,我在函数的反汇编代码中观察到以下指令: data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 这个指令做了什么? 为了更详细,我试图了解编译器如何使用O2优化优化无用的递归,如下所示: int foo(void) { return foo(); } int main (void) { return foo(); } 上面的代码在没有优化的情况下编译时导致堆栈溢出,但适用于O2优化代码。 我认为使用O2它完全删除了推送函数foo的堆栈,但为什么data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)需要? 0000000000400480 : foo(): 400480: eb fe jmp 400480 400482: 66 66 66 66 66 2e 0f data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 400489: 1f 84 00 […]

在保护模式下设置中断(x86)

为保护模式设置中断的过程是什么? 这个链接说应该: 为中断描述符表腾出空间 告诉CPU该空间在哪里(参见GDT教程:lidt的工作方式与lgdt完全相同) 告诉PIC您不再需要使用BIOS默认值(请参阅编程PIC芯片) 为IRQ和exception编写几个ISR处理程序(请参阅中断服务程序) 将ISR处理程序的地址放在适当的描述符中 启用IRQ掩码中所有支持的中断(PIC) 第三步对我没有任何意义(我查看了这个链接,但没有任何关于告诉PIC的事情)所以我忽略了它并完成了接下来的两个步骤,当我到达最后一步时再次无能为力。 但是,根据我对中断的理解,我不理解的两个步骤都与PIC控制器的硬件中断有关,不应该影响PIT在IRQ 0上引发的中断。因此我也忽略了这一步骤。 当我运行我的代码时,它编译得很好,甚至在虚拟机中运行,但中断似乎只发射一次。 然后我意识到我没有向EOI发送EOI,以防止它再引发任何中断。 但是,在iret指令使虚拟机崩溃之前,添加mov al, 0x20和out 0x20, al 。 这是我的IDT: ; idt idt_start : dw 0x00 ; The interrupt handler is located at absolute address 0x00 dw CODE_SEG ; CODE_SEG points to the GDT entry for code db 0x0 ; The unused byte db 0b11101001 […]

C / C ++ / Assembly以编程方式检测Windows,Mac和Linux上的超线程是否处于活动状态

我已经可以在所有这三个平台上正确检测逻辑处理器的数量。 为了能够正确检测物理处理器/核心的数量,我必须检测是否支持超线程并且是否激活(或者如果您愿意,则启用),如果是,则将逻辑处理器的数量除以2以确定物理处理器的数量。 Perphaps我应该提供一个例子: 启用了超线程的四核Intel CPU具有4个物理内核,8个逻辑处理器(超线程创建4个逻辑处理器)。 所以我的当前函数将检测到8而不是所需的4。 因此,我的问题是,是否有办法检测是否支持超线程并启用?