Simple tests to be done, one work and another not, what I was thinking is change only command line and compile to both 32 and x864-64.
usage is: ./make_32 source
make_32.sh
sol32 $1.asm $1.o -elf32
ld -m elf_i386 -o $1 $1.o
./$1 ; echo $?
rm $1.o
make_x86_64.sh
sol32 $1.asm $1.o -elf64 $2 $3 $4
elfedit --output-mach x86-64 $1.o
ld -m elf_x86_64 -o $1 $1.o
./$1 ; echo $?
rm $1.o
macro.inc
MACRO string
MARG name, symbols :req
name db &symbols
sz&name equ $-&name
ENDM
/*
eg: sol32 source.asm source.o -elf64 -d check
this will create a fake (not valid) object file into this context but will count function parameters
need more work, how can I know if an function needs an address but we put [address]?,
this is valid to invoke and can generated errors that are hard to find
*/
#ifdef check
define ncall invoke
#endif
#ifdef -elf64
MACRO ncall
MARG nfunction :req, p1, p2, p3, p4, p5, p6
#ifnb <&p6>
mov r9,p6
#endif
#ifnb <&p5>
mov r8,p5
#endif
#ifnb <&p4>
mov rcx,p4
#endif
#ifnb <&p3>
mov rdx,p3
#endif
#ifnb <&p2>
mov rsi,p2
#endif
#ifnb <&p1>
mov rdi,p1
#endif
mov rax,nfunction
syscall
ENDM
#endif
#ifdef -elf32
MACRO ncall
MARG nfunction :req, p1, p2, p3, p4, p5, p6
#ifnb <&p6>
mov ebp,p6
#endif
#ifnb <&p5>
mov edi,p5
#endif
#ifnb <&p4>
mov esi,p4
#endif
#ifnb <&p3>
mov edx,p3
#endif
#ifnb <&p2>
mov ecx,p2
#endif
#ifnb <&p1>
mov ebx,p1
#endif
mov eax,nfunction
int 80h
ENDM
#endif
unistd.inc
stdin equ 0
stdout equ 1
stderr equ 2
;just to count functions parameters, so can report errors
import sys_write [3] ;fd,ptr buf,count
import sys_exit [1] ;status
;no holes allowed into syscall enumeration
#ifdef -elf64
ENUM Native,0,314
sys_read
sys_write
sys_open
sys_close
sys_newstat
sys_newfstat
sys_newlstat
sys_poll
sys_lseek
sys_mmap
sys_mprotect
sys_munmap
sys_brk
sigaction
sigprocmask
rt_sigreturn
sys_ioctl
sys_pread64
sys_pwrite64
sys_readv
sys_writev
sys_access
sys_pipe
sys_select
sys_sched_yield
sys_mremap
sys_msync
sys_mincore
sys_madvise
sys_shmget
sys_shmat
sys_shmctl
sys_dup
sys_dup2
sys_pause
sys_nanosleep
sys_getitimer
sys_alarm
sys_setitimer
sys_getpid
sys_sendfile64
sys_socket
sys_connect
sys_accept
sys_sendto
sys_recvfrom
sys_sendmsg
sys_recvmsg
sys_shutdown
sys_bind
sys_listen
sys_getsockname
sys_getpeername
sys_socketpair
sys_setsockopt
sys_getsockopt
stub_clone
stub_fork
stub_vfork
stub_execve
sys_exit
sys_wait4
sys_kill
sys_newuname
sys_semget
sys_semop
sys_semctl
sys_shmdt
sys_msgget
sys_msgsnd
sys_msgrcv
sys_msgctl
sys_fcntl
sys_flock
sys_fsync
sys_fdatasync
sys_truncate
sys_ftruncate
sys_getdents
sys_getcwd
sys_chdir
sys_fchdir
sys_rename
sys_mkdir
sys_rmdir
sys_creat
sys_link
sys_unlink
sys_symlink
sys_readlink
sys_chmod
sys_fchmod
sys_chown
sys_fchown
sys_lchown
sys_umask
sys_gettimeofday
sys_getrlimit
sys_getrusage
sys_sysinfo
sys_times
sys_ptrace
sys_getuid
sys_syslog
sys_getgid
sys_setuid
sys_setgid
sys_geteuid
sys_getegid
sys_setpgid
sys_getppid
sys_getpgrp
sys_setsid
sys_setreuid
sys_setregid
sys_getgroups
sys_setgroups
sys_setresuid
sys_getresuid
sys_setresgid
sys_getresgid
sys_getpgid
sys_setfsuid
sys_setfsgid
sys_getsid
sys_capget
sys_capset
sys_rt_sigpending
sys_rt_sigtimedwait
sys_rt_sigqueueinfo
sys_rt_sigsuspend
stub_sigaltstack
sys_utime
sys_mknod
sys_ni_syscall
sys_personality
sys_ustat
sys_statfs
sys_fstatfs
sys_sysfs
sys_getpriority
sys_setpriority
sys_sched_setparam
sys_sched_getparam
sys_sched_setscheduler
sys_sched_getscheduler
sys_sched_get_priority_max
sys_sched_get_priority_min
sys_sched_rr_get_interval
sys_mlock
sys_munlock
sys_mlockall
sys_munlockall
sys_vhangup
sys_modify_ldt
sys_pivot_root
sys_sysctl
sys_prctl
sys_arch_prctl
sys_adjtimex
sys_setrlimit
sys_chroot
sys_sync
sys_acct
sys_settimeofday
sys_mount
sys_umount
sys_swapon
sys_swapoff
sys_reboot
sys_sethostname
sys_setdomainname
stub_iopl
sys_ioperm
sys_create_module
sys_init_module
sys_delete_module
sys_get_kernel_syms
sys_query_module
sys_quotactl
sys_nfsservctl
sys_getpmsg
sys_putpmsg
sys_afs_syscall
sys_tuxcall
sys_security
sys_gettid
sys_readahead
sys_setxattr
sys_lsetxattr
sys_fsetxattr
sys_getxattr
sys_lgetxattr
sys_fgetxattr
sys_listxattr
sys_llistxattr
sys_flistxattr
sys_removexattr
sys_lremovexattr
sys_fremovexattr
sys_tkill
sys_time
sys_futex
sys_sched_setaffinity
sys_sched_getaffinity
sys_set_thread_area
sys_io_setup
sys_io_destroy
sys_io_getevents
sys_io_submit
sys_io_cancel
sys_get_thread_area
sys_lookup_dcookie
sys_epoll_create
sys_epoll_ctl_old
sys_epoll_wait_old
sys_remap_file_pages
sys_getdents64
sys_set_tid_address
sys_restart_syscall
sys_semtimedop
sys_fadvise64
sys_timer_create
sys_timer_settime
sys_timer_gettime
sys_timer_getoverrun
sys_timer_delete
sys_clock_settime
sys_clock_gettime
sys_clock_getres
sys_clock_nanosleep
sys_exit_group
sys_epoll_wait
sys_epoll_ctl
sys_tgkill
sys_utimes
sys_vserver
sys_mbind
sys_set_mempolicy
sys_get_mempolicy
sys_mq_open
sys_mq_unlink
sys_mq_timedsend
sys_mq_timedreceive
sys_mq_notify
sys_mq_getsetattr
sys_kexec_load
sys_waitid
sys_add_key
sys_request_key
sys_keyctl
sys_ioprio_set
sys_ioprio_get
sys_inotify_init
sys_inotify_add_watch
sys_inotify_rm_watch
sys_migrate_pages
sys_openat
sys_mkdirat
sys_mknodat
sys_fchownat
sys_futimesat
sys_newfstatat
sys_unlinkat
sys_renameat
sys_linkat
sys_symlinkat
sys_readlinkat
sys_fchmodat
sys_faccessat
sys_pselect6
sys_ppoll
sys_unshare
sys_set_robust_list
sys_get_robust_list
sys_splice
sys_tee
sys_sync_file_range
sys_vmsplice
sys_move_pages
sys_utimensat
sys_epoll_pwait
sys_signalfd
sys_timerfd_create
sys_eventfd
sys_fallocate
sys_timerfd_settime
sys_timerfd_gettime
sys_accept4
sys_signalfd4
sys_eventfd2
sys_epoll_create1
sys_dup3
sys_pipe2
sys_inotify_init1
sys_preadv
sys_pwritev
sys_rt_tgsigqueueinfo
sys_perf_event_open
sys_recvmmsg
sys_fanotify_init
sys_fanotify_mark
sys_prlimit64
sys_name_to_handle_at
sys_open_by_handle_at
sys_clock_adjtime
sys_syncfs
sys_sendmmsg
sys_setns
sys_getcpu
sys_process_vm_readv
sys_process_vm_writev
sys_kcmp
sys_finit_module
ENDE
#endif
#ifdef -elf32
ENUM Native,0,348
sys_restart_syscall
sys_exit
sys_fork
sys_read
sys_write
sys_open
sys_close
sys_waitpid
sys_creat
sys_link
sys_unlink
sys_execve
sys_chdir
sys_time
sys_mknod
sys_chmod
sys_lchown
sys_break
sys_oldstat
sys_lseek
sys_getpid
sys_mount
sys_umount
sys_setuid
sys_getuid
sys_stime
sys_ptrace
sys_alarm
sys_oldfstat
sys_pause
sys_utime
sys_stty
sys_gtty
sys_access
sys_nice
sys_ftime
sys_sync
sys_kill
sys_rename
sys_mkdir
sys_rmdir
sys_dup
sys_pipe
sys_times
sys_prof
sys_brk
sys_setgid
sys_getgid
sys_signal
sys_geteuid
sys_getegid
sys_acct
sys_umount2
sys_lock
sys_ioctl
sys_fcntl
sys_mpx
sys_setpgid
sys_ulimit
sys_oldolduname
sys_umask
sys_chroot
sys_ustat
sys_dup2
sys_getppid
sys_getpgrp
sys_setsid
sys_sigaction
sys_sgetmask
sys_ssetmask
sys_setreuid
sys_setregid
sys_sigsuspend
sys_sigpending
sys_sethostname
sys_setrlimit
sys_getrlimit
sys_getrusage
sys_gettimeofday
sys_settimeofday
sys_getgroups
sys_setgroups
sys_select
sys_symlink
sys_oldlstat
sys_readlink
sys_uselib
sys_swapon
sys_reboot
sys_readdir
sys_mmap
sys_munmap
sys_truncate
sys_ftruncate
sys_fchmod
sys_fchown
sys_getpriority
sys_setpriority
sys_profil
sys_statfs
sys_fstatfs
sys_ioperm
sys_socketcall
sys_syslog
sys_setitimer
sys_getitimer
sys_stat
sys_lstat
sys_fstat
sys_olduname
sys_iopl
sys_vhangup
sys_idle
sys_vm86old
sys_wait4
sys_swapoff
sys_sysinfo
sys_ipc
sys_fsync
sys_sigreturn
sys_clone
sys_setdomainname
sys_uname
sys_modify_ldt
sys_adjtimex
sys_mprotect
sys_sigprocmask
sys_create_module
sys_init_module
sys_delete_module
sys_get_kernel_syms
sys_quotactl
sys_getpgid
sys_fchdir
sys_bdflush
sys_sysfs
sys_personality
sys_afs_syscall
sys_setfsuid
sys_setfsgid
sys__llseek
sys_getdents
sys__newselect
sys_flock
sys_msync
sys_readv
sys_writev
sys_getsid
sys_fdatasync
sys__sysctl
sys_mlock
sys_munlock
sys_mlockall
sys_munlockall
sys_sched_setparam
sys_sched_getparam
sys_sched_setscheduler
sys_sched_getscheduler
sys_sched_yield
sys_sched_get_priority_max
sys_sched_get_priority_min
sys_sched_rr_get_interval
sys_nanosleep
sys_mremap
sys_setresuid
sys_getresuid
sys_vm86
sys_query_module
sys_poll
sys_nfsservctl
sys_setresgid
sys_getresgid
sys_prctl
sys_rt_sigreturn
sys_rt_sigaction
sys_rt_sigprocmask
sys_rt_sigpending
sys_rt_sigtimedwait
sys_rt_sigqueueinfo
sys_rt_sigsuspend
sys_pread64
sys_pwrite64
sys_chown
sys_getcwd
sys_capget
sys_capset
sys_sigaltstack
sys_sendfile
sys_getpmsg
sys_putpmsg
sys_vfork
sys_ugetrlimit
sys_mmap2
sys_truncate64
sys_ftruncate64
sys_stat64
sys_lstat64
sys_fstat64
sys_lchown32
sys_getuid32
sys_getgid32
sys_geteuid32
sys_getegid32
sys_setreuid32
sys_setregid32
sys_getgroups32
sys_setgroups32
sys_fchown32
sys_setresuid32
sys_getresuid32
sys_setresgid32
sys_getresgid32
sys_chown32
sys_setuid32
sys_setgid32
sys_setfsuid32
sys_setfsgid32
sys_pivot_root
sys_mincore
sys_madvise
sys_madvise1
sys_getdents64
sys_fcntl64
sys_gettid
sys_readahead
sys_setxattr
sys_lsetxattr
sys_fsetxattr
sys_getxattr
sys_lgetxattr
sys_fgetxattr
sys_listxattr
sys_llistxattr
sys_flistxattr
sys_removexattr
sys_lremovexattr
sys_fremovexattr
sys_tkill
sys_sendfile64
sys_futex
sys_sched_setaffinity
sys_sched_getaffinity
sys_set_thread_area
sys_get_thread_area
sys_io_setup
sys_io_destroy
sys_io_getevents
sys_io_submit
sys_io_cancel
sys_fadvise64
sys_exit_group
sys_lookup_dcookie
sys_epoll_create
sys_epoll_ctl
sys_epoll_wait
sys_remap_file_pages
sys_set_tid_address
sys_timer_create
sys_timer_settime
sys_timer_gettime
sys_timer_getoverrun
sys_timer_delete
sys_clock_settime
sys_clock_gettime
sys_clock_getres
sys_clock_nanosleep
sys_statfs64
sys_fstatfs64
sys_tgkill
sys_utimes
sys_fadvise64_64
sys_vserver
sys_mbind
sys_get_mempolicy
sys_set_mempolicy
sys_mq_open
sys_mq_unlink
sys_mq_timedsend
sys_mq_timedreceive
sys_mq_notify
sys_mq_getsetattr
sys_kexec_load
sys_waitid
sys_add_key
sys_request_key
sys_keyctl
sys_ioprio_set
sys_ioprio_get
sys_inotify_init
sys_inotify_add_watch
sys_inotify_rm_watch
sys_migrate_pages
sys_openat
sys_mkdirat
sys_mknodat
sys_fchownat
sys_futimesat
sys_fstatat64
sys_unlinkat
sys_renameat
sys_linkat
sys_symlinkat
sys_readlinkat
sys_fchmodat
sys_faccessat
sys_pselect6
sys_ppoll
sys_unshare
sys_set_robust_list
sys_get_robust_list
sys_splice
sys_sync_file_range
sys_tee
sys_vmsplice
sys_move_pages
sys_getcpu
sys_epoll_pwait
sys_utimensat
sys_signalfd
sys_timerfd_create
sys_eventfd
sys_fallocate
sys_timerfd_settime
sys_timerfd_gettime
sys_signalfd4
sys_eventfd2
sys_epoll_create1
sys_dup3
sys_pipe2
sys_inotify_init1
sys_preadv
sys_pwritev
sys_rt_tgsigqueueinfo
sys_perf_event_open
sys_recvmmsg
sys_fanotify_init
sys_fanotify_mark
sys_prlimit64
sys_name_to_handle_at
sys_open_by_handle_at
sys_clock_adjtime
sys_syncfs
sys_sendmmsg
sys_setns
sys_process_vm_readv
sys_process_vm_writev
ENDE
#endif
write.asm
section "text" class_code alias ".text"
section "data" class_data alias ".data"
lf equ 10
.USE64
include ../native/unistd.inc
include ../macro/macro.inc
.data
string msg_01 <"x86-64 native system calls:",lf,"syscall rax,rdi,rsi,rdx,r10,r8,r9",lf,"return: rax rdx",lf>
string msg_02 <"Registers that should be preserved accross function calls:",lf,"rbx,rbp,rsp,r12,r13,r14,r15",lf,lf>
string msg_03 <"x86-64 C function libraries:",lf,"call function,rdi,rsi,rdx,rcx,r8,r9",lf>
.text
.entry _start
_start:
ncall sys_write,stdout,msg_01,szmsg_01
ncall sys_write,stdout,msg_02,szmsg_02
ncall sys_write,stdout,msg_03,szmsg_03
ncall sys_exit,0 ;should have one "new line" at the end? or generate an error
read.asm
section "text" class_code alias ".text"
section "data" class_data alias ".data"
section "bss" class_bss alias ".bss"
lf equ 10
.USE64
include ../native/unistd.inc
include ../macro/macro.inc
.bss
buffer1 rq 1 ;<----section is created but reserved data no
.data
string msg_01 < "type anything",lf >
string msg_02 < "right",lf >
string msg_03 < "wrong",lf >
buffer dq 1
.text
.entry _start
_start:
ncall sys_write,stdout,msg_01,szmsg_01
;ncall sys_read,stdin,buffer1,8 ;buffer1 is not reserved into this section
ncall sys_read,stdin,buffer,8
mov rax, [buffer]
;.if rax == swap "anything" --->*Error** Mini string is too big: "gnihtyna"
;.if rax == "gnihtyna" ;--->*Error** Mini string is too big: "gnihtyna"
cmp rax, qword "gnihtyna" ;--->cmp rax,74796E61
jne not_right
ncall sys_write,stdout,msg_02,szmsg_02
jmp skip
not_right:
ncall sys_write,stdout,msg_03,szmsg_03
skip:
ncall sys_exit,0
That rax register can be eax register, so I can create a macro like rax|eax==r00, this way we can reach portability.