Assembly language exit() syscall does not return correct value

Christopher Faylor cgf-use-the-mailinglist-please@cygwin.com
Mon Mar 15 17:23:00 GMT 2010


On Mon, Mar 15, 2010 at 04:23:39PM +0000, Brandon Chase wrote:
>>The following program is supposed to return a value of 222 when echo $? 
>run, but I get 127 every time, no matter what I change. I have looked 
>around but cannot seem to find out if this is an error or a 
>cygwin-specific value.
>>----------------------------------------------------------
>#PURPOSE:
> This program finds the maximum number of a
># set of data items.
>#
>#VARIABLES:
> The registers have the following uses:
>#
># %edi - Holds the index
> of the data item being examined
># %ebx - Largest data item found
>#
> %eax - Current data item
>#
># The following memory locations are 
>used:
>#
># data_items - contains the item data. A 0 is used
># to
> terminate the data
>#
>.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 _start
>>_start:
>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

I cleaned this up to remove the odd wrapping and strange
characters:
	.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 _start
_start: 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
If, in theory, I got this right then, on linux it SEGVs. I would
not expect anything different on Cygwin. It seems like you need
to actually call exit() if you want this to exit.
cgf
--
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


More information about the Cygwin mailing list

AltStyle によって変換されたページ (->オリジナル) /