tags:

views:

238

answers:

3

hello~ I'm about to learn x86 assembly language on mac os x... I'm using as instruction to compile assembly file in commend window. but I have several errors.. and I don't know how I can get through..

here is the errors and my assembly code.. which is quite simple.

**ung-mi-lims-macbook-pro:pa2 ungmi$ as swap.s
swap.s:16:Unknown pseudo-op: .type
swap.s:16:Rest of line ignored. 1st junk character valued 115 (s).
swap.s:19:suffix or operands invalid for `push'
swap.s:46:suffix or operands invalid for `pop'
ung-mi-lims-macbook-pro:pa2 ungmi$** 

and the source is

.text
        .align 4
.globl  swap
        .type swap,@function

swap:
        pushl   %ebp
        movl    %esp, %ebp

        movl    %ebp, %esp
        popl    %ebp
        ret

and I searched some solution which is I have to put -arch i386 than

**ung-mi-lims-macbook-pro:pa2 ungmi$ as -arch i386 swap.s
swap.s:16:Unknown pseudo-op: .type
swap.s:16:Rest of line ignored. 1st junk character valued 115 (s).
ung-mi-lims-macbook-pro:pa2 ungmi$** 

could you help me out.. just let me know what I need to compile assembly file.. I have xcode already.. and I'd rather to do this with commend window..and vi editor..

I will be waiting for your answer... plz help me.

+1  A: 

Use GCC, it'll compile and link for you: cc swap.s

Nikolai N Fetissov
sorry.. it's not working.. same error...
kevin
+2  A: 

Your code is 32-bit assembly. Compilation on Snow Leopard is 64-bit by default, but you can use gcc -m32 for compiling 32-bit code. There are of course also options that you can pass to as and ld but I found that remembering only the option for gcc was enough, since it is a front-end to all these things.

Use gcc to show you an example of assembly code that works: type a minimal C function in file test.c and use gcc -S test.c to produce the assembly in file test.s.

Example:

int x;

void f(void)
{
  int i;
  for (i = 0; i < 5; i++)  x = x + 1;
}

is compiled in assembly on this Leopard Mac:

    .text
.globl _f
_f:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    call    L6
"L00000000001$pb":
L6:
    popl    %ecx
    movl    $0, -12(%ebp)
    jmp L2
L3:
    leal    L_x$non_lazy_ptr-"L00000000001$pb"(%ecx), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    leal    1(%eax), %edx
    leal    L_x$non_lazy_ptr-"L00000000001$pb"(%ecx), %eax
    movl    (%eax), %eax
    movl    %edx, (%eax)
    leal    -12(%ebp), %eax
    incl    (%eax)
L2:
    cmpl    $4, -12(%ebp)
    jle L3
    leave
    ret
.comm _x,4,2
    .section __IMPORT,__pointers,non_lazy_symbol_pointers
L_x$non_lazy_ptr:
    .indirect_symbol _x
    .long   0
    .subsections_via_symbols

You can make it simpler by using gcc option -fno-PIC:

    .text
.globl _f
_f:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $0, -12(%ebp)
    jmp L2
L3:
    movl    _x, %eax
    incl    %eax
    movl    %eax, _x
    leal    -12(%ebp), %eax
    incl    (%eax)
L2:
    cmpl    $4, -12(%ebp)
    jle L3
    leave
    ret
.comm _x,4,2
    .subsections_via_symbols

On Snow Leopard you will get 64-bit assembly (amd64). You could get the same thing on Leopard by using the -m64 gcc option, and you can get on Snow Leopard the same thing you'd get running gcc on Leopard with the -m32 option.

Pascal Cuoq
`as -arch i386 test.s`
Stephen Canon
A: 

Apple's as is forked from binutils 1.38, while the current version is 2.20, so there may be many new directives not available. I can't find the manual for 1.38, but the oldest one (2.10) I could find states that .type is associated only with COFF format output. The object format on Mac is Mach-O, so the .type directive is meaningless. Just remove it.

KennyTM
thank you so much.. but they have other errors.. actually professor ask us to install linux.. but I thought..mac os is similar to linux because both are based on unix.. :( errors are ung-mi-lims-macbook-pro:pa2 ungmi$ gcc -m32 swap.sUndefined symbols: "_main", referenced from: start in crt1.10.6.old: symbol(s) not foundcollect2: ld returned 1 exit status
kevin
@kevin: You need to have a `main` to start the program. You'd better install Linux.
KennyTM
ya.. thank you so much~~ but finally I've just installed ubuntu on my laptop.. thank you so much
kevin