I suspect I'm doing your computer science homework for you!
Look at unistd.h.
The _syscallX macro takes no parameters by itself and is used to specify the architecture specific assembly language prologue needed to set up a transition from user space to kernel space. Some other 'standard' macros make use of _syscallX to give convenient access to the operations provided by the kernel (i.e. system calls). Each system call has a number and in Linux these numbers are given names beginning with __NR_. The name of the number for 'mkdir' is __NR_mkdir and happens to have the value 38.
#define _syscall2(type, name, type1, arg1, type2, arg2) \
type name(type1 arg1, type2 arg2) \
return (type)syscall(__NR_ ## name, arg1, arg2); \
So if we want to create a function that implements the mkdir system call.
_syscall2(int, mkdir, char *, path, int, perms);
And without using the above macro.
int my_mkdir(char *path, int perms)
_syscallX(); /* system call prologue */
return (int) syscall(38, path, perms);
Hope this helps.