I'm an Assembly newby and am studying Jeff Duntemann's book on programming Assembly on Linux. As much as I love Assembly and I have to learn it if I want to do anything significant in IT since it's part of a journey, I am finding difficult to get started because there are so many variables.
My environment is Ubuntu (Linux Debian) 9.10 64-bit and I am using NASM as compiler. Following Duntemann's suggestion, I created a sort of "sandbox" program where I can simply run few instructions and see the effect that these have on registers.
This is the simple program I'm writing:
; Executable name : ; Version : 1.0 ; Created date : ; Last update : ; Author : Marco Tedone ; Description : A template to create sandbox programs ; ; Build using these commands: ; nasm -f elf64 -g -F stabs <your-asm-name>.asm ; ld -o <your-asm-name> <your-asm-name>.o ; SECTION .data ; Section containing initialised data SECTION .text ; Section containing code global _start ; Linker needs this to find the entry point! _start: ; Write your instructions between the two noops nop mov eax,0 inc eax mov ebx,eax nop SECTION .bss ; Section containing uninitialised variables
The program compiles fine but when I run it I get segmentation fault. Why?
Also here there is another program (which actually does something useful) which runs fine:
; Executable name : EATSYSCALL ; Version : 1.0 ; Created date : 1/7/2009 ; Last update : 2/18/2009 ; Author : Jeff Duntemann ; Description : A simple program in assembly for Linux, using NASM 2.05, ; demonstrating the use of Linux INT 80H syscalls to display text. ; ; Build using these commands: ; nasm -f elf -g -F stabs eatsyscall.asm ; ld -o eatsyscall eatsyscall.o ; SECTION .data ; Section containing initialised data EatMsg: db "Eat at Marco's !",10 EatLen: equ $-EatMsg SECTION .bss ; Section containing uninitialized data SECTION .text ; Section containing code global _start ; Linker needs this to find the entry point! _start: nop ; This no-op keeps gdb happy... mov eax,4 ; Specify sys_write call mov ebx,1 ; Specify File Descriptor 1: Standard Output mov ecx,EatMsg ; Pass offset of the message mov edx,EatLen ; Pass the length of the message int 80H ; Make kernel call MOV eax,1 ; Code for Exit Syscall mov ebx,0 ; Return a code of zero int 80H ; Make kernel call
Could anybody tell me what I'm doing wrong? Please note that the first program gives a segmentation fault even if i write a simple instruction such as mov eax,4 or something like that. Does the program need to do something useful not to get a segmentation error?