当前位置: 首页 > 知识库问答 >
问题:

__asm __volatile如何执行?

訾高明
2023-03-14
gcc_inline void
lcr0(uint32_t val)
{
    __asm __volatile("movl %0,%%cr0" : : "r" (val));
}

在上面的代码中,我不确定val插入到程序集字符串的哪个位置。val是否替换字符串中的%c?

如果可能的话,有人可以澄清什么::“r”也是做什么的?

共有1个答案

易星宇
2023-03-14

我站着纠正...

...如果函数不是内联的,< code>val将在< code > EDI /< code > rdi 中传递,但可能会在< code>asm之前被混洗,但< code >“r”会使编译器将它安排在< code>asm的某个寄存器中。(见下面-O0的效果)。

此外,未声明/定义为内联的函数也可以内联,处于更高的优化级别。

我注意到,只能将CR0读/写到/写到/从通用寄存器,然后只能在权限级别0。@PeterCordes指出,“记忆”破绽可能是一个好主意。显然,改变CR0会产生非常令人兴奋的副作用!

当我在< code>-O0上尝试时,我发现一个简单的< code>inline被忽略了,该函数针对x86_64编译为:

   lcr0:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    %edi, -4(%rbp)
        movl    -4(%rbp), %eax
        movl %eax,%cr0
        nop
        popq    %rbp
        ret

我猜< code>gcc_inline可能包含< code > _ _ attribute _ _(_ _ always _ inline _ _),在这种情况下,即使在< code >-O0 < code > LC r0 也是内联的,但是有很多可爱的堆栈业务。这一次对于x86:

  main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $16, %esp
        movl    12(%ebp), %eax
        movl    (%eax), %eax
        movl    (%eax), %eax
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        movl    %eax, -8(%ebp)
        movl    -8(%ebp), %eax
        movl %eax,%cr0
        nop
        movl    $0, %eax
        leave
        ret
 类似资料:
  • 我正在从C#转向java,这是我第一次尝试实际编写一些东西,我正在尝试设置我的数据层,但我想我错过了一些东西,比如LINQ中的DataContext到.NET中的SQL 我正在尝试使用Hibernate查询数据库,但似乎我缺少了什么,我下载了Hibernate4和QueryDSL来进行类型安全查询。 接下来,我连接到我的postgreSQL数据库,并使用Dali生成DAO对象(我想?在菜单中,我从

  • 问题内容: 我想从localhost上的PHP执行PhantomJS。 谁能解释如何从PHP执行PhantomJS,以及我应该从phantomjs.org下载哪个软件包? 问题答案: 下载PhantomJS二进制文件,将其上传到某个地方并使其可执行() 如果要制作屏幕截图,请设置fontconfig(这是我的配置所特有的,但目的是确保系统上至少有一些字体) 在PHP中运行以下命令:

  • 问题内容: 我有一个 同时 设置和属性的锚点。如果单击并启用了Javascript,我希望它 仅 执行和忽略。同样,如果禁用或不支持Javascript,我希望它遵循URL并忽略。以下是我正在执行的示例,该示例将执行JS并并发地执行链接(通常是执行JS,然后页面会更改): 最好的方法是什么? 我希望有一个Java脚本的答案,但是我会接受任何可以使用的方法,只要它可以工作,尤其是可以用PHP完成的方

  • 问题内容: 我想知道是否有任何可用资源描述浏览器的光标如何执行Javascript。 我知道它会在页面加载时加载并执行标签,并且您可以将函数附加到各种窗口事件,但是事情变得模糊的是,例如,当我通过AJAX检索远程页面并将其内容放入div中时。 如果该远程页面必须加载脚本库(例如),则何时加载“ anotherscript.js”并执行其内容? 如果我在当前页面上包含“ anotherscript.

  • 问题内容: 我目前正在尝试使用进行多个请求。 我用谷歌搜索了如何做到这一点,答案是使用。 至此,我得到了: 然后我尝试了一个请求,并且一切正常。 然后,我通过cmd创建了一个信任库,并导入了目标网站的证书,使用我的信任库设置并设置的of : 如果我尝试执行Https,则会出现异常。 如果我做同样的事情,但一切正常。 谁能告诉我如何使它起作用?(不用担心,我不会创建任何ddos工具) 提前致谢! P

  • 问题内容: 我想创建一个线程池,它将执行最新提交的任务。关于如何做到这一点的任何建议? 谢谢 问题答案: 您可能只需要实现自己的包装,即可将要约/投票映射到堆栈。然后将此作为您传递给的实现。我的建议是包装一个现有的实现,例如。 这是不同步的,因此您需要使用同步器包装每个方法(如果不是更奇特的东西)。 您还需要为阻止操作引入/ 条件。 最后,您需要将一组极性(“放”侧或“取”侧)映射到出队的另一端(