Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Nov 2001 11:59:12 +0100
From:      Bernd Walter <ticso@cicely8.cicely.de>
To:        Khaled Daham <khaled@w-arts.com>
Cc:        freebsd-alpha@FreeBSD.ORG
Subject:   Re: Alpha assembler programming.
Message-ID:  <20011114115912.A42331@cicely8.cicely.de>
In-Reply-To: <20011113231429.W97694-100000@fantasy.telia.net>
References:  <20011113231429.W97694-100000@fantasy.telia.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Nov 13, 2001 at 11:30:20PM +0100, Khaled Daham wrote:
> Hello!
> 
> I have convinced myself to do some assembly coding on alpha for some
> reason. I have almost managed to do a simple hello world involving
> write(2).
> 
> main:
>     lda $16, 1
>     lda $17, msg
>     lda $18, len
>     jsr write
>     lda $16, 0
>     jsr exit
> 
> which bombs out on
> 
>  45328 a.out    CALL  write(0x1,0x1200107a0,0xc)
>  45328 a.out    GIO   fd 1 wrote 12 bytes
>        "Hello World!"
>  45328 a.out    RET   write 12/0xc
>  45328 a.out    PSIG  SIGSEGV SIG_DFL
> 
> I am note sure why I get the SIGSEGV, anyone ?
> 
> Another thing I noted in /usr/src/sys/alpha/alpha/support.s
> is the line
> 
> lda     a0, longjmp_botchmsg
> 
> where longjmp_botchmsg is a string just like my
> lda $16, msg
> ( $16 == a0 ) but I cannot get gcc to compile if I use
> lda a0, msg
> gcc returns "Error: inappropriate arguments for opcode `lda'"
> I cannot really see why it does not accept it, except that in the
> alpha assembler guide's I have seen a0-a5 is used for passing integers,
> but howcome the mapping between $16-$21 to a0-a5.
> 
> Does anyone know a good site with some alpha assembly examples using C
> calling convention ?
> 
> 680x0 was alot easier :)

I did this "Hello World!" a long time ago.
IIRC it was based on the hello world in the FreeBSD programmers guide
for i386.

cc -c -g -x assembler-with-cpp -ffixed-8 hello-world2.s
ld -o hello-world2 hello-world2.o


#include <machine/asm.h>
        .text
        .globl _start                           /* must be declared for linker (ld) */

textseq:
msg:    .ascii          "Hello, world!\n"       /* our dear string */
        .equ            t12diff, _start-textseq
        .equ            len, . - msg            /* length of our dear string */

_start:                                         /* tell linker entry point */
        subq            t12,t12diff,gp          /* get address of .text */
        addq            zero,1,a0               /* file descriptor (stdout) */
        addq            gp,textseq-msg,a1       /* message to write */
        addq            zero,len,a2             /* message length */
        addq            zero,0x4,v0             /* system call number (sys_write) */
        call_pal        PAL_OSF1_callsys        /* call kernel - errors returned in a3 */
        addq            zero,0x0,v0             /* system call number (sys_exit) */
        call_pal        PAL_OSF1_callsys        /* exit */



-- 
B.Walter              COSMO-Project         http://www.cosmo-project.de
ticso@cicely.de         Usergroup           info@cosmo-project.de


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011114115912.A42331>