免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4914 | 回复: 10
打印 上一主题 下一主题

如何知道嵌入式汇编寄存器哪个被使用了 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-31 15:43 |只看该作者 |倒序浏览
经常看到嵌入式汇编直接使用寄存器, 并不保存原内容, 那万一原来内容是有用的怎么办?
这里面有什么约定吗?

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

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

论坛徽章:
0
2 [报告]
发表于 2009-07-31 21:36 |只看该作者
寄存器别名?

论坛徽章:
0
3 [报告]
发表于 2009-07-31 21:42 |只看该作者
使用汇编了,还需要考虑寄存器被其他地方占用吗?

论坛徽章:
0
4 [报告]
发表于 2009-07-31 21:57 |只看该作者
肯定存在这种情况 保守的方法 先压栈 完事后弹出来

论坛徽章:
0
5 [报告]
发表于 2009-08-03 15:06 |只看该作者
原帖由 zylthinking 于 2009-7-31 15:43 发表
经常看到嵌入式汇编直接使用寄存器, 并不保存原内容, 那万一原来内容是有用的怎么办?
这里面有什么约定吗?

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

诸如此类, ...


这是clobber list的用场。

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

论坛徽章:
0
6 [报告]
发表于 2009-08-03 19:24 |只看该作者
寄存器别名在SPARC里面的确是硬件做的,但是我记不清是在哪个编译器的文档里看到RA的时候也别名了,确定的是SSA的时候要别名。
我是想,汇编层面上是否可以... 是否... 算了,瞎想的。

论坛徽章:
0
7 [报告]
发表于 2009-08-03 20:54 |只看该作者
根据ABI的约定,有些寄存器是要调用者保存的,而有些有特定的含义,所以在足够简单时偶尔会直接使用;但这样比较危险的。

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

论坛徽章:
0
8 [报告]
发表于 2009-08-03 20:59 |只看该作者
GCC的内联汇编的确是...

论坛徽章:
0
9 [报告]
发表于 2009-08-03 22:02 |只看该作者
原帖由 Cyberman.Wu 于 2009-8-3 20:54 发表
根据ABI的约定,有些寄存器是要调用者保存的,而有些有特定的含义,所以在足够简单时偶尔会直接使用;但这样比较危险的。

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


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

论坛徽章:
0
10 [报告]
发表于 2009-08-04 10:36 |只看该作者
原帖由 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)  

好像和GCC不同吧?下面是手册中的一段示例代码:
asm void semaphore_seize (volatile int *semaphore_p)
{
% reg semaphore_p; lab loop
! "r4", "r5"                    /* scratch registers used */


    addi    r4,r0,1             # token for semaphore
loop:                           # label replaced by compiler
    lwarx   r5,r0,semaphore_p   # semaphore will be in register
    cmpi    cr0,0,r5,0          # semaphore free?
    bne     loop                # branch if no
    stwcx.  r4,r0,semaphore_p   # store token in semaphore
    bne     loop                # in case interrupted before stwcz.
}


#pragma section CONTROL far-absolute RW address=0xf0000
#pragma use_section CONTROL mem_semaphore
    volatile int mem_semaphore;


void seize (volatile int *reg_semaphore_p)

{
    semaphore_seize (reg_semaphore_p);
    semaphore_seize (& mem_semaphore);
}


它比较方便的就是这种宏块机制,参数类似传参数的方式和C变量结合,个人感觉比GCC的方式要直观一些。

当然它也有asm string方式:

asm[ volatile] ("string"[ ! register-list]);

不过和GCC还是有区别的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP