URN Logo
UNIX Resources » Linux » China Linux Forum » CPU 与 编译器 » 3 » MIPS 嵌入式汇编代码问题,请各位大虾多多指教
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
MIPS 嵌入式汇编代码问题,请各位大虾多多指教
 
 
 
Subject: MIPS 嵌入式汇编代码问题,请各位大虾多多指教
Author: kanlinux    Posted: 2006-08-21 19:38    Length: 1,046 byte(s)
[Original] [Print] [Top]
问题:
1、mtc0 %z0, $0 这一行中的z0 表示什么意思, 前面的%又表示什么意思?
2、set_index函数参数 val 是怎么传递到 index register的。
3、"mfc0 %0, $0 " 中 %0 表示什么意思,如果是通用寄存器0 ,为什么不用$0
4、 : "=r" (val)); 是不是表示把val的值设为寄存器的值,对应的寄存器是当前最后使用的那个寄存器吗?




static inline void set_index(unsigned long val)
{
__asm__ __volatile__(
".set push "
".set reorder "
"mtc0 %z0, $0 "
".set pop"
: : "Jr" (val));
}

static inline unsigned long get_index(void)
{
unsigned long val;

__asm__ __volatile__(
".set push "
".set reorder "
"mfc0 %0, $0 "
".set pop"
: "=r" (val));
return val;
}
[Original] [Print] [Top]
Subject: Re: MIPS 嵌入式汇编代码问题,请各位大虾多多指教
Author: xhbdahai    Posted: 2006-09-12 11:23    Length: 505 byte(s)
[Original] [Print] [Top]
1,此格式是是mips C内嵌汇编的所独有的一种格式;需要专门说明一下。
2:内嵌汇编需要遵循一个格式的,val作为汇编代码的输入,将它传递给mtc0 %z0, $0指令中%z0所表示的寄存器。
3:"mfc0 %0, $0 " 中 %0 表示汇编的输入或者输出中的第一个本地变量(此变量在寄存器中),内嵌汇编模板要求寄存器名必须以%号开始,常数必须以$开始。
4:"=r" (val)); 告诉编译器在编译时给局部变量val分配寄存器,在这里他属于寄存器变量,在get_index中根据汇编模板,他所分配到的寄存器为%0所指定的那个。
----
路漫漫兮修远兮,吾将上下而求索!
[Original] [Print] [Top]
Subject: Re: MIPS 嵌入式汇编代码问题,请各位大虾多多指教
Author: xhbdahai    Posted: 2006-09-12 14:24    Length: 1,209 byte(s)
[Original] [Print] [Top]
第一个问题:
tatic inline void set_index(unsigned long val)
{
__asm__ __volatile__(
".set push "
".set reorder "
"mtc0 %z0, $0 "
".set pop"
: : "Jr" (val));
}
对于这个函数,编译时没有使用-Olevel优化时。其等价于函数:
tatic inline void set_index_NOR(unsigned long val)
{
__asm__ __volatile__(
".set push "
".set reorder "
"mtc0 %0, $0 "
".set pop"
: : "r" (val));

但是,在编译时如果使用了优化选项,那么根据val的取值情况,编译会有两种情况。如果val=0那么,起等价于set_index_NOR函数,否则不等价。
指令:"mtc0 %z0, $0 "的含义是如果占位寄存器%0所对应的值(就是val的取值)为0,gcc输出此行代码为"mtc0 $zero, $0 "。否则此行被输出为"mtc0 %0, $0 "。另外内联汇编部分的输入域“Jr”(val)h含义为:输入的值可能是一个常数或者一个寄存器变量。
此函数的目的主要是为了尽可能的优化,在val=0时,减少GPR的浪费。为了实现此目的,需要在编译时打开-O选项,通常编译kernel使用-O2或者-Os选项进行优化。
----
路漫漫兮修远兮,吾将上下而求索!
[Original] [Print] [Top]
« Previous thread
请问microinstruction和micro-ops这两个概念有什么联系和区别?
CPU 与 编译器
3
Next thread »
关于安装simplescalar的问题!!
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:47:13, cost 0.037439107894897 ms.