草庐IT

锁存器

全部标签

linux - 如何解释 x86-64 上的段寄存器访问?

有了这个功能:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq我如何解释第二条指令并找出添加到RAX中的内容? 最佳答案 这段代码:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq返回线程局部变量的地址。%fs:0x0是TCB(线程控制block)的地址,1069833(%rip)是从那里到变量的偏移量,这是已知的,因为变量驻留在程序中或在程序加载时加载的某些动态库中(在运行时通过dlopen()加载的库需要一

linux - 如何解释 x86-64 上的段寄存器访问?

有了这个功能:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq我如何解释第二条指令并找出添加到RAX中的内容? 最佳答案 这段代码:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq返回线程局部变量的地址。%fs:0x0是TCB(线程控制block)的地址,1069833(%rip)是从那里到变量的偏移量,这是已知的,因为变量驻留在程序中或在程序加载时加载的某些动态库中(在运行时通过dlopen()加载的库需要一

linux - 如何在 Linux 上使用 gcc 程序集在 x86-64 中设置控制寄存器 0 (cr0) 位

我正在使用以下代码设置cr0位以禁用缓存。当我编译这个时#includeintmain(){__asm__("pushl%eax\n\t""mov%cr0,%eax;\n\t""orl$(1我收到错误消息,指出操作数对mov无效。任何人都可以给我指一个好的gccx86-64指南来做这些事情吗?另外上面的代码到底有什么问题? 最佳答案 好吧,最后我写了下面的内核模块。我不确定它是否正确,因为我没有观察到禁用缓存时应该伴随的急剧减速。但这可以正确编译和插入。任何指示都会有所帮助。谢谢!#include#includeMODULE_LIC

linux - 如何在 Linux 上使用 gcc 程序集在 x86-64 中设置控制寄存器 0 (cr0) 位

我正在使用以下代码设置cr0位以禁用缓存。当我编译这个时#includeintmain(){__asm__("pushl%eax\n\t""mov%cr0,%eax;\n\t""orl$(1我收到错误消息,指出操作数对mov无效。任何人都可以给我指一个好的gccx86-64指南来做这些事情吗?另外上面的代码到底有什么问题? 最佳答案 好吧,最后我写了下面的内核模块。我不确定它是否正确,因为我没有观察到禁用缓存时应该伴随的急剧减速。但这可以正确编译和插入。任何指示都会有所帮助。谢谢!#include#includeMODULE_LIC

linux - 程序启动时的默认寄存器状态是什么(asm,linux)?

当程序启动时(LinuxELF可执行文件),eax、ebx等中是否有零,或者是否可以有任何内容?(我没有进行任何调用或使用外部库)。在我的机器上,寄存器被归零,但是我可以在编写asm程序时在新进程中依赖这种行为吗? 最佳答案 这完全取决于每个平台的ABI。既然你提到了eax和ebx让我们看看x86的情况(从Linuxv5.17.5开始)。在fs/binfmt_elf.c中,在load_elf_binary()中,内核检查ABI是否指定了任何requirements对于程序加载时的寄存器值:/**TheABImayspecifytha

linux - 程序启动时的默认寄存器状态是什么(asm,linux)?

当程序启动时(LinuxELF可执行文件),eax、ebx等中是否有零,或者是否可以有任何内容?(我没有进行任何调用或使用外部库)。在我的机器上,寄存器被归零,但是我可以在编写asm程序时在新进程中依赖这种行为吗? 最佳答案 这完全取决于每个平台的ABI。既然你提到了eax和ebx让我们看看x86的情况(从Linuxv5.17.5开始)。在fs/binfmt_elf.c中,在load_elf_binary()中,内核检查ABI是否指定了任何requirements对于程序加载时的寄存器值:/**TheABImayspecifytha

c - 强制编译器为某个变量使用某个寄存器

是否有可能强制编译器(在我的例子中是gcc或clang)使用特定的寄存器,比如R15x86_64用于某个变量,并且还禁止其将R15用于除该变量之外的任何其他目的。 最佳答案 gcc可以做到。已经引用gccdocs回答了您关于如何将变量强制放入特定寄存器的问题。要阻止编译器为其他目的使用此寄存器生成代码,请使用gcc开关-ffixed-reg(有关详细信息,请参阅gcc文档)。 关于c-强制编译器为某个变量使用某个寄存器,我们在StackOverflow上找到一个类似的问题:

c - 强制编译器为某个变量使用某个寄存器

是否有可能强制编译器(在我的例子中是gcc或clang)使用特定的寄存器,比如R15x86_64用于某个变量,并且还禁止其将R15用于除该变量之外的任何其他目的。 最佳答案 gcc可以做到。已经引用gccdocs回答了您关于如何将变量强制放入特定寄存器的问题。要阻止编译器为其他目的使用此寄存器生成代码,请使用gcc开关-ffixed-reg(有关详细信息,请参阅gcc文档)。 关于c-强制编译器为某个变量使用某个寄存器,我们在StackOverflow上找到一个类似的问题:

【STM32】 相关寄存器总结

前言一、GPIO端口模式寄存器(GPIOx_MODER) 二、GPIO端口输出类型寄存器(GPIOx_OTYPER) 三、GPIO端口输出速度寄存器(GPIOx_OSPEEDR)四、GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)五、 GPIO端口输入数据寄存器(GPIOx_IDR)六、GPIO端口输出数据寄存器(GPIOx_ODR)七、GPIO端口置位/复位寄存器(GPIOx_BSRR) 八、GPIO端口配置锁定寄存器(GPIOx_LCKR)九、GPIO复用功能低位寄存器(GPIOx_AFRL) 十、GPIO复用功能高位寄存器(GPIOx_AFRH) 前言 我们通过了解GPIO口的工作

android - 在 Dalvik 字节码上添加新寄存器

每个人。我在Dalvik字节码上遇到了一个问题。原始字节码是:virtualmethods.methodpubliconClick(Landroid/view/View;)V.locals12.paramp1,"v"#Landroid/view/View;...return-void.endmethod要打印一些东西,我需要添加4个新寄存器。但是12(local)+2(arguments)+4(new)>16会导致某些指令出现问题。所以,我想到了一个自爆的想法:整个寄存器的数量是20个。v0-v11是本地的,v18-v19是参数。首先将v18-v19移动到v12-v13,参数寄存器在v