特别是对于SPARC Assembly,如何废除分支与常规分支不同?
我一直认为当需要填充分支指令的nop延迟槽时,需要取消分支指令.但是,我不认为我在这方面是正确的,因为你可以填补nop而不取消分支.
使用crosstool脚本我在Cygwin下构建了Sparc架构的以下编译器gcc-4.1.1和4.2.0 20061024(预发布):
$ ./sparc-unknown-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-unknown-linux-gnu
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.1.1-glibc-2.3.6/gcc-4.1.1/configure --target=sparc-unknown-linux-gnu --host=i686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu --with-headers=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.1.1
Run Code Online (Sandbox Code Playgroud)
和
$ ./sparc-unknown-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-unknown-linux-gnu
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.2-20061024- glibc-2.3.6/gcc-4.2-20061024/configure --target=sparc-unknown-linux-gnu --host=i 686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc-un known-linux-gnu --with-headers=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc -unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/cros stool/gcc-4.2-20061024-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-g nu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atex it --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.2.0 20061024 (prerelease)
Run Code Online (Sandbox Code Playgroud)
对我来说,我可以在我的程序中使用__sync_val_compare_and_swap与Atomic-Builtins …
我知道当你在SPARC CPU(和MIPS)中读取%r0时,总是返回0,但我想知道为什么?
这背后有什么设计决定?为什么?
我目前正在学习计算机科学,我所需要的课程之一涵盖"计算机组织和架构" - 换句话说,就是汇编语言的介绍.这个特定的课程使用SPARC语言,因为部门机器只与SPARC兼容(或者我听说过).
我听说过汇编语言,我知道有不同的类型,如x86,ARM和MIPS.我的问题是:什么类型的汇编语言是SPARC?(或者SPARC是它自己的汇编语言类型吗?)是什么让SPARC与我在家用桌面计算机上使用的汇编语言不同,后者使用英特尔处理器运行Windows?最后,仅仅因为我很好奇,了解SPARC本身是否有价值,或者在了解基础知识后我是否应该考虑学习其他汇编语言?
一个C代码在"SPARC Solaris 5.9"和"Linux OpenSuse 12.1 i686(x86)"上带来了不同的结果.
#include <stdio.h>
int main(int argc, char* argv[])
{
char Cmd = '\x00';
char tmp[2];
char* TempBuff = &tmp;
*(short*)TempBuff = (Cmd << 8) | 0x5;
printf("Out: First byte:0x%02X, Second byte: 0x%02X\n", *(TempBuff), *(TempBuff+1) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译:gcc cshort.c -o cshort
在"Linux OpenSuse 12.1 i686(x86)"上:> Out:第一个字节:0x05,第二个字节:0x00
在"SPARC Solaris 5.9"上:> Out:第一个字节:0x00,第二个字节:0x05
为什么,为什么我们收到不同的结果
环境细节:
"SPARC Solaris 5.9":
uname -a:SunOS V245-1 5.9 Generic_118558-34 sun4u sparc SUNW,Sun-Fire-V245.
psrinfo -v:sparcv9处理器工作在1504 MHz,并有一个sparcv9浮点处理器.
gcc版本3.4.6
"Linux OpenSuse 12.1 i686(x86)":
uname -a:Linux linux-755z.site …
我正在使用 SPARC RTEMS C 编译器编译 C 程序。
使用 Xlinker -M 选项,我可以获得包含很多我不认识的东西的大内存映射。
我也尝试过使用 RCC nm 实用程序,它返回一个更易读的符号表。我假设此实用程序为 printf 给出的位置是 printf 在内存中的位置,并且每个调用 printf 的程序都将在执行期间到达该位置。这是一个有效的假设吗?
有没有办法获得所有库/系统功能的位置列表?另外,当链接完成时,它是只链接可执行文件调用的函数,还是链接库中的所有函数?考虑到我在符号表和内存映射中找到的东西的数量,在我看来似乎是后者。我可以让它只链接所需的功能吗?
谢谢你的帮助。
我已经看到了关于交叉编译器的回复我如何在Windows上交叉编译C代码,以便在Unix(Solaris/HPUX/Linux)上运行二进制文件?
我想知道如何在x86机器上为SPARC编译?我在哪里可以找到一个好的交叉编译器?我还需要为HP OS编译.
如果在Sparc机器上安装的JRE是64位,是否有一种清晰或简单的方法来检查命令行?
我习惯看到这个:
java -version
Run Code Online (Sandbox Code Playgroud)
但是,似乎Solaris只说明安装了哪个版本的java版本.
我很少有符合 SPARC V8 32 位架构的基准测试应用程序。我将它们用于 SPARC 32 位处理器的性能评估。然而,很少有应用程序在性能上达不到要求。我想用 64 位 SPARC V9 架构(如 OpenSPARC T1/T2)测试性能。我的问题是 32 位 SPARC V8 体系结构的编译二进制文件是否可以在 SPARC V9 体系结构中运行而无需任何修改?两种架构中的二进制文件是否兼容?
我遇到了一些我觉得很奇怪的东西.测试程序
int main(int argc, char* argv[])
{
cout<<"hello"<<endl;
long unsigned l = 0x12345678;
long long unsigned ll = 0x12345678;
cout<<sizeof(l)<<endl;
cout<<sizeof(ll)<<endl;
};
Run Code Online (Sandbox Code Playgroud)
输出是:
hello
4
8
Run Code Online (Sandbox Code Playgroud)
没有惊喜.的long int的大小为4个字节和long long的大小为8个字节.但是,当我更改它以便分配长long时
long long unsigned ll = 0x123456789;
Run Code Online (Sandbox Code Playgroud)
在编译时我得到
error: integer constant is too large for "long" type
Run Code Online (Sandbox Code Playgroud)
现在,这个相同的测试并编译,如果我使用选项强制的64位版本-m64.我做错了什么或者这是GCC中的错误?
sparc ×10
solaris ×4
assembly ×3
c ×3
gcc ×3
32bit-64bit ×2
c++ ×2
java ×1
linker ×1
linux ×1
long-long ×1
mips ×1
optimization ×1
performance ×1
rtems ×1