Sat 10 Jan 2009 05:38:03 PM UTC, original submission:
Hi there,
I'm really new to native programming, being a web developer, so I may just be missing something obvious. I'm trying to compile the maximum program in your book. I'm using Ubuntu 8.10, and I go to the terminal and assemble and link the program, and when I try to execute the program, I get "Segmentation Fault". Googling on the web, segmentation fault refers to trying to access protected memory, so I'm thinking maybe there's something in the modern Linux distros that blocks of the registers used in this program? Just a thought. Anyway, I'm attaching the source code to the example. Any help would be great.
Thanks,
Chris
#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
#
.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
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
int $0x80
|