如何知道嵌入式汇编寄存器哪个被使用了

发布于 2022-09-18 00:42:42 字数 284 浏览 15 评论 0

经常看到嵌入式汇编直接使用寄存器, 并不保存原内容, 那万一原来内容是有用的怎么办?
这里面有什么约定吗?

比如 int a(){
    int b;
    asm{
        move %%eax, %%ebx;
    }
}

诸如此类, 那万一  ebx 原来内容有用, 岂不是被覆盖了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

相思故 2022-09-25 00:42:42

寄存器别名?

林空鹿饮溪 2022-09-25 00:42:42

使用汇编了,还需要考虑寄存器被其他地方占用吗?

胡大本事 2022-09-25 00:42:42

肯定存在这种情况 保守的方法 先压栈 完事后弹出来

哭了丶谁疼 2022-09-25 00:42:42

原帖由 zylthinking 于 2009-7-31 15:43 发表
经常看到嵌入式汇编直接使用寄存器, 并不保存原内容, 那万一原来内容是有用的怎么办?
这里面有什么约定吗?

比如 int a(){
    int b;
    asm{
        move %%eax, %%ebx;
    }
}

诸如此类, ...

这是clobber list的用场。

to proj: 寄存器别名完全是另外一回事, CPU自己做,编辑器完全不知道的事情。

逆蝶 2022-09-25 00:42:42

寄存器别名在SPARC里面的确是硬件做的,但是我记不清是在哪个编译器的文档里看到RA的时候也别名了,确定的是SSA的时候要别名。
我是想,汇编层面上是否可以... 是否... 算了,瞎想的。

倾城°AllureLove 2022-09-25 00:42:42

根据ABI的约定,有些寄存器是要调用者保存的,而有些有特定的含义,所以在足够简单时偶尔会直接使用;但这样比较危险的。

个人感觉GCC的嵌入式汇编其实很难用的,原来我在项目中用一个东西折腾了很长时间。后来切换Diab编译器时同事找到我,只是简单对了一下手册很快就搞懂了,现在太久记不清楚了,但类似于传参数一下。
另外我现在用的一个平台上,是编译器支持所谓的“指令函数”,如调用一个加法指令的话直接用__insn_add(val1, val2),直接用变量做参数,返回值一般是指令的目标寄存器,感觉还是蛮好用的。

回梦 2022-09-25 00:42:42

GCC的内联汇编的确是...

故乡的云 2022-09-25 00:42:42

原帖由 Cyberman.Wu 于 2009-8-3 20:54 发表
根据ABI的约定,有些寄存器是要调用者保存的,而有些有特定的含义,所以在足够简单时偶尔会直接使用;但这样比较危险的。

个人感觉GCC的嵌入式汇编其实很难用的,原来我在项目中用一个东西折腾了很长时间。后 ...

diab在inline asm上,要么全抄gcc,要么是语法模仿。 我曾经写过一个相当复杂的gcc inline asm程序,diab编译、运行都没问题。

◇流星雨 2022-09-25 00:42:42

原帖由 albcamus 于 2009-8-3 22:02 发表

diab在inline asm上,要么全抄gcc,要么是语法模仿。 我曾经写过一个相当复杂的gcc inline asm程序,diab编译、运行都没问题。

你真的确信?哪个版本?Diab编译器是风河买来的,如果你见过它编译生成的指令、C++的对象模型实现等,你就会确信,它和GCC没有任何血源关系;它的优化效果比原来风河采用的GCC 2.96好许多。除非现在风河把它扩展的兼容GCC(这个方便别人移植程序,就好比我现在用的一款编译器,具体实现和GCC没关系,但是兼容了GCC的扩展语法和编译选项),但据我所知的是后来风河在编译开发上投入不多,不应该出现这么大的动静吧。

下面是Diab嵌入汇编的语法:

asm [volatile] [return-type] macro-name ( [ parameter-list ] )
{
% storage-mode-list (must start in column 1)
! register-list     (`!' must be first non-whitespace)
   asm-code
}                   (must start in column 1)  

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文