Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In with Facebook Sign In with Google Sign In with OpenID

Categories

We have migrated to a new platform! Please note that you will need to reset your password to log in (your credentials are still in-tact though). Please contact lee@programmersheaven.com if you have questions.
Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

Can you help me get my Hello World program to work?


Hi All

I am just learning how to program in assembler. I am using 64 bit Mepis 8.5 on an AMD Athlon 3200+ PC.

I cannot get my basic environment to work to assemble and link a Hello World program. I think it is something to do with 32 bit vs 64 bit and/or perhaps something to do with being on an AMD processor.

I have posted my various attempts below.

Can anybody help please and give me something else to try? Hopefully it is something simple but I do not know where to look.

Best wishes

John

#test1.s Simple printf call and exit
# System Mepis 8.5
# AMD 64 3200+

# as -o test1.o test1.s
# test1.s: Assembler messages:
# test1.s:33: Error: suffix or operands invalid for `push'
# test1.s:36: Error: suffix or operands invalid for `push'

# Error line numbers will not match now. But they refer to the pushl statements.
# Conclusion: May need to assemble 32 bit.
# Thoughts: Not sure why pushl is not compatible with 64 bit.


# as --32 -o test1.o test1.s # assembles no visible errors
# Conclusion: Looks OK

# ld -dynamic-linker /lib/ld-linux.so.2 -o test1 -lc test1.o
# ld: i386 architecture of input file `test1.o' is incompatible with i386:x86-64 output
# Thoughts: OK, cannot mix 32 and 64. Change the output?


# ld -dynamic-linker /lib/ld-linux.so.2 -mi386linux -o test1 -lc test1.o
# ld: skipping incompatible /usr/bin/../lib/libc.a when searching for -lc
# ld: cannot find -lc
# Thoughts: Linked OK. But cannot find 32 bit libc library? Or AMD compatible libc?
# Is this the correct output format?

# ld -V
# GNU ld (GNU Binutils for Debian) 2.18.0.20080103
# Supported emulations:
# elf_x86_64
# elf_i386
# i386linux

# Thoughts: Perhaps try the 64 bit loader? Perhaps it is smarter.
# ld -dynamic-linker /lib/ld-linux-x86-64.so.2 -mi386linux -o test1 -lc test1.o
# ld: skipping incompatible /usr/bin/../lib/libc.a when searching for -lc
# ld: cannot find -lc
# Conclusions: No improvement.

# Thoughts: Try and improve linker search? Only one other libc on the system in /emul/ia32-linux/
# ld -dynamic-linker /lib/ld-linux-x86-64.so.2 -L/emul/ia32-linux/lib -mi386linux -o test1 -lc test1.o
# ld: skipping incompatible /usr/bin/../lib/libc.a when searching for -lc
# ld: cannot find -lc
# Conclusions: Run out of ideas. I need help.

# Thoughts: Switch back to the original loader.
# ld -dynamic-linker /lib/ld-linux.so.2 -L/emul/ia32-linux/lib -melf_i386 -o test1 -lc test1.o
# ld: skipping incompatible /usr/bin/../lib/libc.so when searching for -lc
# ld: skipping incompatible /usr/bin/../lib/libc.a when searching for -lc
# Thoughts: At least it is looking for a dynamic library.

# Thoughts: Try the 64 bit loader with elf_i386 output
# ld -dynamic-linker /lib/ld-linux-x86-64.so.2 -L/emul/ia32-linux/lib -melf_i386 -o test1 -lc test1.o
# ld: skipping incompatible /usr/bin/../lib/libc.so when searching for -lc
# ld: skipping incompatible /usr/bin/../lib/libc.a when searching for -lc

# Thoughts: ?
# ld -dynamic-linker /lib/ld-linux-x86-64.so.2 -L/emul/ia32-linux/lib -mi386linux -o test1 -lc test1.o
# ld: skipping incompatible /usr/bin/../lib/libc.so when searching for -lc
# ld: skipping incompatible /usr/bin/../lib/libc.a when searching for -lc
# Conclusion: Help!

# ld -dynamic-linker /lib/ld-linux-so.2 -L/emul/ia32-linux/lib -melf32-i386 -o test1 -lc test1.o

#/emul/ia32-linux/lib/libc-2.7.so

.section .datatext
output:
.asciz "Hello World!
"

.section .text
.globl _start
_start:
pushl $output
call printf
addl $8, %esp
pushl $0
call exit





Sign In or Register to comment.