Here code for opening file, reading from it and close it. At beginig i have thinked taht it will be complicated. But it was easy and interesting as C. Here is both C and asm code.
openfile.asm
;/usr/include/sys/syscall.h
;#define SYS_read 3
;#define SYS_write 4
;#define SYS_open 5
;#define SYS_close 6
sys_read equ 3
sys_write equ 4
sys_open equ 5
sys_close equ 6
o_rdonly equ 0
format ELF
section '.text' executable
public _start
_start:
;int fid = open("file.txt",O_RDONLY);
push o_rdonly
push f
mov eax, sys_open
push eax
int 0x80
add esp, 4*3 ; clear stack after interupt
mov dword [f_id], eax
;read( fid , &buf[0] , 12 );
push f_buf_len
push f_buf
push eax
mov eax, sys_read
push eax
int 0x80
add esp, 4*4
;write( 1 , &buf[0] , 12 );
push f_buf_len
push f_buf
push 1
mov eax, sys_write
push eax
int 0x80
add esp,4*3
;close( fid );
push dword [f_id]
mov eax, sys_close
push eax
int 0x80
add esp, 4*2
;exit from programm
xor eax, eax ;eax = 0
push eax
inc eax ;eax = 1, sys_exit
int 80h ;system interupt
section '.data' writeable
f db "file.txt",0
f_len = $-f
f_buf db 12 dup 0
f_buf_len = $-f_buf
f_id dd 0
fasm openfile.asm openfile.o
ld openfile.o -o openfile
c.c
#include <fcntl.h>
int main()
{
int fid = open("file.txt",O_RDONLY);
char buf[12];
read( fid , &buf[0] , 12 );
write( 1 , &buf[0] , 12 );
close( fid );
return 0;
}
gcc c.c -o c
file.txtOnly text!!!
This is example how to combine assemblers code with C code
Filename: main.c
extern out_f();
int main()
{
out_f();
return 0;
}
Here is assemblers code
Filename: out.asm
format ELF
section '.text' executable
public out_f
out_f:
push msg_len
push msg
push 1
mov eax, 4
push eax
int 0x80
add esp, 4*4
ret
section '.data' writeable
msg db "Hello from out.asm",0
msg_len = $-msg
Compiling lines is:
gcc -c main.c -o main.o
fasm out.asm out.o
gcc main.o out.o -o main
It is our hello world in asm.
format ELF
section '.text' executable
public _start
_start:
push msg_len ; size of message
push msg ; offset of message
push 1 ; stdout
mov eax,4 ; 4 = sys_write
push eax
int 0x80
add esp,4*3 ; clear stack after interupt
;exit from programm
xor eax, eax ;eax = 0
push eax
inc eax ;eax = 1, sys_exit
int 80h ;system interupt
section '.data' writeable
msg db "Hello world",0
msg_len = $-msg
Compilations is easy as before
fasm hello.asm hello.o
ld -o hello hello.o
Now our hello world becomes more portable becouse it uses standart libc library. You can use power of standart libraries. Also programms code become smaller
format ELF
section '.text' executable
extrn printf
public main
main:
push msg
call printf
add esp,4
ret
section '.data' writeable
msg db "Hello world!",0
There is small diference when compiling this file
fasm hellolibc.asm hellolibc.o
gcc -o hellolibc hellolibc.o
Programm should start with _start point . This programm that only exit. That is minimal what we need start programm and terminate it.
format ELF
section '.text'
executable public _start
_start:
xor eax,eax
push eax
inc eax; 1 = sys_exit
int 0x80
Compiling this with fasm simple.asm -o simple.o
Then running ld to link our first programm
ld -o simple simple.o