x86-64SysVABI指定了如何在寄存器中传递函数参数(在rdi中的第一个参数,然后是rsi等),以及如何将整数返回值传回(在rax和然后rdx对于非常大的值)。然而,我找不到的是,当传递小于64位的类型时,参数或返回值寄存器的高位应该是什么。例如,对于以下函数:voidfoo(unsignedx,unsignedy);...x将在rdi中通过和y在rsi,但它们只有32位。做rdi的高32位和rsi必须为零?直觉上,我会假设是的,但是codegenerated所有gcc、clang和icc都有特定的mov开始时的指令将高位清零,因此编译器似乎另有假设。同样,编译器似乎假定返回值的
x86-64SysVABI指定了如何在寄存器中传递函数参数(在rdi中的第一个参数,然后是rsi等),以及如何将整数返回值传回(在rax和然后rdx对于非常大的值)。然而,我找不到的是,当传递小于64位的类型时,参数或返回值寄存器的高位应该是什么。例如,对于以下函数:voidfoo(unsignedx,unsignedy);...x将在rdi中通过和y在rsi,但它们只有32位。做rdi的高32位和rsi必须为零?直觉上,我会假设是的,但是codegenerated所有gcc、clang和icc都有特定的mov开始时的指令将高位清零,因此编译器似乎另有假设。同样,编译器似乎假定返回值的
有了这个功能:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq我如何解释第二条指令并找出添加到RAX中的内容? 最佳答案 这段代码:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq返回线程局部变量的地址。%fs:0x0是TCB(线程控制block)的地址,1069833(%rip)是从那里到变量的偏移量,这是已知的,因为变量驻留在程序中或在程序加载时加载的某些动态库中(在运行时通过dlopen()加载的库需要一
有了这个功能:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq我如何解释第二条指令并找出添加到RAX中的内容? 最佳答案 这段代码:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq返回线程局部变量的地址。%fs:0x0是TCB(线程控制block)的地址,1069833(%rip)是从那里到变量的偏移量,这是已知的,因为变量驻留在程序中或在程序加载时加载的某些动态库中(在运行时通过dlopen()加载的库需要一
我正在使用以下代码设置cr0位以禁用缓存。当我编译这个时#includeintmain(){__asm__("pushl%eax\n\t""mov%cr0,%eax;\n\t""orl$(1我收到错误消息,指出操作数对mov无效。任何人都可以给我指一个好的gccx86-64指南来做这些事情吗?另外上面的代码到底有什么问题? 最佳答案 好吧,最后我写了下面的内核模块。我不确定它是否正确,因为我没有观察到禁用缓存时应该伴随的急剧减速。但这可以正确编译和插入。任何指示都会有所帮助。谢谢!#include#includeMODULE_LIC
我正在使用以下代码设置cr0位以禁用缓存。当我编译这个时#includeintmain(){__asm__("pushl%eax\n\t""mov%cr0,%eax;\n\t""orl$(1我收到错误消息,指出操作数对mov无效。任何人都可以给我指一个好的gccx86-64指南来做这些事情吗?另外上面的代码到底有什么问题? 最佳答案 好吧,最后我写了下面的内核模块。我不确定它是否正确,因为我没有观察到禁用缓存时应该伴随的急剧减速。但这可以正确编译和插入。任何指示都会有所帮助。谢谢!#include#includeMODULE_LIC
当程序启动时(LinuxELF可执行文件),eax、ebx等中是否有零,或者是否可以有任何内容?(我没有进行任何调用或使用外部库)。在我的机器上,寄存器被归零,但是我可以在编写asm程序时在新进程中依赖这种行为吗? 最佳答案 这完全取决于每个平台的ABI。既然你提到了eax和ebx让我们看看x86的情况(从Linuxv5.17.5开始)。在fs/binfmt_elf.c中,在load_elf_binary()中,内核检查ABI是否指定了任何requirements对于程序加载时的寄存器值:/**TheABImayspecifytha
当程序启动时(LinuxELF可执行文件),eax、ebx等中是否有零,或者是否可以有任何内容?(我没有进行任何调用或使用外部库)。在我的机器上,寄存器被归零,但是我可以在编写asm程序时在新进程中依赖这种行为吗? 最佳答案 这完全取决于每个平台的ABI。既然你提到了eax和ebx让我们看看x86的情况(从Linuxv5.17.5开始)。在fs/binfmt_elf.c中,在load_elf_binary()中,内核检查ABI是否指定了任何requirements对于程序加载时的寄存器值:/**TheABImayspecifytha
是否有可能强制编译器(在我的例子中是gcc或clang)使用特定的寄存器,比如R15x86_64用于某个变量,并且还禁止其将R15用于除该变量之外的任何其他目的。 最佳答案 gcc可以做到。已经引用gccdocs回答了您关于如何将变量强制放入特定寄存器的问题。要阻止编译器为其他目的使用此寄存器生成代码,请使用gcc开关-ffixed-reg(有关详细信息,请参阅gcc文档)。 关于c-强制编译器为某个变量使用某个寄存器,我们在StackOverflow上找到一个类似的问题:
是否有可能强制编译器(在我的例子中是gcc或clang)使用特定的寄存器,比如R15x86_64用于某个变量,并且还禁止其将R15用于除该变量之外的任何其他目的。 最佳答案 gcc可以做到。已经引用gccdocs回答了您关于如何将变量强制放入特定寄存器的问题。要阻止编译器为其他目的使用此寄存器生成代码,请使用gcc开关-ffixed-reg(有关详细信息,请参阅gcc文档)。 关于c-强制编译器为某个变量使用某个寄存器,我们在StackOverflow上找到一个类似的问题: