(我已经有了答案;我将回答我自己的问题,以便我可以分享我所学到的知识,并在将来为其他人省去这个麻烦)
当我尝试在 Solaris 10 Sparcv9 上构建 Erlang 时,构建中途失败:
cd lib && \
ERL_TOP=/var/tmp/pkgbuild-0/erlang/sparcv9/erlang-otp-73b4221 PATH=/var/tmp/pkgbuild-0/erlang/sparcv9/erlang-otp-73b4221/bootstrap/bin:${PATH} \
make opt SECONDARY_BOOTSTRAP=true
make[1]: Entering directory `/var/tmp/pkgbuild-0/erlang/sparcv9/erlang-otp-73b4221/lib'
make[2]: Entering directory `/var/tmp/pkgbuild-0/erlang/sparcv9/erlang-otp-73b4221/lib/hipe'
=== Entering application hipe
make[3]: Entering directory `/var/tmp/pkgbuild-0/erlang/sparcv9/erlang-otp-73b4221/lib/hipe/misc'
erlc -W +debug_info +warn_exported_vars +warn_missing_spec +warn_untyped_record -o../ebin hipe_consttab.erl
make[3]: *** [../ebin/hipe_consttab.beam] Bus Error (core dumped)
make[3]: Leaving directory `/var/tmp/pkgbuild-0/erlang/sparcv9/erlang-otp-73b4221/lib/hipe/misc'
Run Code Online (Sandbox Code Playgroud)
为什么会这样,我该怎么做才能完成我的 Erlang 构建?
我正在编写一个名为isOdd的小型汇编程序,顾名思义,如果传递的整数是奇数,则通过从%运算返回1来返回.
到目前为止这是我的代码:
Function prototype: int isOdd( long num )
isOdd:
save %sp, -96, %sp ! Save caller's window
mov %i0, %o0 ! Parameter num goes to %o0
mov 2, %l0 ! 2 goes to local register
call .rem ! Call modulus subroutine
nop
mov %o0, %l0 ! moves the result of the subroutine
! to output register o0
ret
restore
Run Code Online (Sandbox Code Playgroud)
但是,我没有得到好的输出; 事实上,它似乎只是返回我传递给num的任何值,而不是实际进行模数运算.
谷歌对这样一个基本问题没有任何帮助.这是我的第一个汇编代码,所以我对"寄存器"的概念非常不熟悉,我认为将它们混合在一起就是我的错误所在.
在此先感谢您的帮助!
我在互联网上找到了__sync_val_compare_and_swap的实现:
#define LOCK_PREFIX "lock ; "
struct __xchg_dummy { unsigned long a[100]; };
#define __xg(x) ((struct __xchg_dummy *)(x))
static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
unsigned long new, int size)
{
unsigned long prev;
switch (size) {
case 1:
__asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
: "=a"(prev)
: "q"(new), "m"(*__xg(ptr)), "0"(old)
: "memory");
return prev;
case 2:
__asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
: "=a"(prev)
: "q"(new), "m"(*__xg(ptr)), "0"(old)
: "memory");
return prev;
case 4:
__asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2" …Run Code Online (Sandbox Code Playgroud) 我在这里读到一条jmpl指令必须跟在 nop.
SPARC V8 手册告诉我一条rett指令必须总是在一条jmpl指令之前。
但是,我一直无法找到jmpl和restore指令之间的关系。我目前正在对SPARC V8架构和ELF的一个文件,我遇到有restore右后jmpl,而我希望的nop。我不知道这是正确的还是 ELF(以及扩展的 SPARC 代码)是错误的。
有restore正确的权利jmpl吗?