This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Assembly language exit() syscall does not return correct value


On 16/03/2010 17:08, Stephan Mueller wrote:
> Brandon Chase wrote:
> " DaveK wrote:

> " "   Brandon, Cygwin isn't compatible with Linux at the assembler-code level, 

> " So I cannot compile assembly language with Cygwin? Do I need a linux shell?
> 
> No, that's not what anyone said.  You can use the assembler on Cygwin to generate
> binaries that run on Cygwin (which is I think what you're looking for), but your
> assembly source code won't work as is -- you will need to make changes of the
> sort that DaveK and cgf state in the paragraphs above.

  Exactly.  Like so, for example:

> $ cat max.s
>         .section .data
> 
> data_items: #These are the data items
>         .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
> 
> .section .text
> 
> .globl _main
> 
> _main: movl $0, %edi                    # move 0 into the index register
>         movl data_items(,%edi,4), %eax  # load the first byte of data
>         movl %eax, %ebx                 # since this is the first item, %eax is
>                                         # the biggest
> start_loop:                             # start loop
>         cmpl $0, %eax                   # check to see if we've hit the end
>         je loop_exit
>         incl %edi                       # load next value
>         movl data_items(,%edi,4), %eax
>         cmpl %ebx, %eax                 # compare values
>         jle start_loop                  # jump to loop beginning if the new
>                                         # one isn't bigger
>         movl %eax, %ebx                 # move the value as the largest 32
> 
>         jmp start_loop                  # jump to loop beginning
> loop_exit:
> # %ebx is the status code for the exit system call
> # and it already has the maximum number
> #       movl $1, %eax                   #1 is the exit() syscall
> # But we don't have linux syscalls!  Instead, we do
> # a c-style call to the exit() function by pushing it
> # onto the stack!
>         push %ebx
>         call    _exit
> # won't return.
> 
> $ gcc max.s -o max.exe
> 
> $ ./max.exe ; echo $?
> 222
> 
> $

  Note use of the gcc driver to compile it, rather than invoking the assembler
and linker directly, in order to let it get all the C runtime support linked
in correctly.

    cheers,
      DaveK


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]