+++Date last modified: 05-Jul-1997

Standard C functions defined by ANSI (ISO/IEC 9899:1990)

abort()             abs()               acos()              asctime()

asin()              assert()            atan()              atan2()

atexit()            atof()              atoi()              atol()

bsearch()           calloc()            ceil()              clearerr()

clock()             cos()               cosh()              ctime()

difftime()          div()               exit()              exp()

fabs()              fclose()            feof()              ferror()

fflush()            fgetc()             fgetpos()           fgets()

floor()             fmod()              fopen()             fprintf()

fputc()             fputs()             fread()             free()

freopen()           frexp()             fscanf()            fseek()

fsetpos()           ftell()             fwrite()            getc()

getchar()           getenv()            gets()              gmtime()

isalnum()           isalpha()           iscntrl()           isdigit()

isgraph()           islower()           isprint()           ispunct()

isspace()           isupper()           isxdigit()          labs()

ldexp()             ldiv()              localeconv()        localtime()

log()               log10()             longjmp()           malloc()

mblen()             mbstowcs()          mbtowc()            memchr()

memcmp()            memcpy()            memmove()           memset()

mktime()            modf()              perror()            pow()

printf()            putc()              putchar()           puts()

qsort()             raise()             rand()              realloc()

remove()            rename()            rewind()            scanf()

setbuf()            setjmp()            setlocale()         setvbuf()

signal()            sin()               sinh()              sprintf()

sqrt()              srand()             sscanf()            strcat()

strchr()            strcmp()            strcoll()           strcpy()

strcspn()           strerror()          strftime()          strlen()

strncat()           strncmp()           strncpy()           strpbrk()

strrchr()           strspn()            strstr()            strtod()

strtok()            strtol()            strtoul()           strxfrm()

system()            tan()               tanh()              time()

tmpfile()           tmpnam()            tolower()           toupper()

ungetc()            va_arg()            va_end()            va_start()

vfprintf()          vprintf()           vsprintf()          wcstombs()

wctomb()


Additional C numeric functions defined by NCEG

feclearexcepts()    fegetenv()          fegetexcept()       fegetprec()

fegetround()        feprocentry()       feprocexit()        feraiseexcept()

fesetenv()          fesetexcept()       fesetprec()         fesetround()

fetestexcept()


Additional C functions defined by Posix.1

access()            alarm()             cfgetispeed()       cfgetospeed()

cfsetispeed()       cfsetospeed()       chdir()             chmod()

chown()             close()             closedir()          creat()

ctermid()           cuserid()           dup()               dup2()

execl()             execle()            execlp()            execv()

execve()            execvp()            _exit()             fcntl()

fdopen()            fileno()            fork()              fpathconf()

fstat()             getcwd()            getegid()           geteuid()

getgid()            getgrgid()          getgrnam()          getgroups()

getlogin()          getpgrp()           getpid()            getppid()

getpwnam()          getpwuid()          getuid()            kill()

link()              lseek()             mkdir()             mkfifo()

open()              opendir()           pause()             pipe()

read()              readdir()           rewinddir()         rmdir()

setgid()            setpgid()           setsid()            setuid()

sigaction()         sigaddset()         sigemptyset()       sigfillset()

sigismember()       siglongjmp()        sigpending()        sigprocmask()

sigsetjmp()         sigsuspend()        sleep()             stat()

sysconf()           tcdrain()           tcflow()            tcflush()

tcgetattr()         tcgetpgrp()         tcsendbreak()       tcsetattr()

tcsetpgrp()         times()             ttyname()           tzset()

umask()             uname()             unlink()            utime()

wait()              waitpid()           write()


Standard functions added by the draft C++ standard

terminate()        unexpected()


Standard C keywords and operators defined by ANSI (ISO/IEC 9899:1990)

!                   !=                  %                   %=

&                   &&                  &=                  ()

*                   *=                  +                   ++

+=                  ,                   -                   --

-=                  ->                  .                   /

/=                  <                   <<                  <<=

>                   >>                  >>=                 ?:

[]                  ^                   ^=                  |

|=                  ||                  ~                   auto

break               case                char                const

continue            default             do                  double

else                enum                extern              float

for                 goto                if                  int

long                register            return              short

signed              sizeof              static              struct

switch              typedef             union               unsigned

void                volatile            while


Standard C preprocessor instructions defined by ANSI (ISO/IEC 9899:1990)

#                   ##                  #define             #elif

#else               #endif              #error              #if

#if !defined        #if defined         #ifdef              #ifndef

#include            #line               #pragma             #undef

__DATE__            __FILE__            __LINE__            __STDC__

__TIME__


Standard ANSI C character constant escape sequences

\a                      Alert                   ASCII BEL (Ctrl-G)

\b                      Backspace               ASCII BS  (Ctrl-H)

\f                      Form feed               ASCII FF  (Ctrl-L)

\n                      New line                ASCII NL  (Ctrl-J)

\r                      Carriage return         ASCII CR  (Ctrl-M)

\t                      Horizontal tab          ASCII TAB (Ctrl-I)

\v                      Vertical tab            ASCII VT  (Ctrl-K)

\\                      Literal backslash

\'                      Literal apostrophe

\"                      Literal quotation mark

\?                      Literal Question mark

\<1-3 octal digits>     Char value in octal

\x<1-2 hex digits>      Char value in hex


Standard keywords and operators added by the draft C++ standard

->*                 .*                  ::                  asm

catch               class               delete              delete[]

friend              inline              new                 operator

private             protected           public              template

this                throw               try                 virtual


Standard C macros defined by ANSI (ISO/IEC 9899:1990)

BUFSIZ              CHAR_BIT            CHAR_MAX            CHAR_MIN

CLOCKS_PER_SEC      DBL_DIG             DBL_EPSILON         DBL_MANT_DIG

DBL_MAX             DBL_MAX_10_EXP      DBL_MAX_EXP         DBL_MIN

DBL_MIN_10_EXP      DBL_MIN_EXP         EDOM                EOF

ERANGE              EXIT_FAILURE        EXIT_SUCCESS        FILENAME_MAX

FLT_DIG             FLT_EPSILON         FLT_MANT_DIG        FLT_MAX

FLT_MAX_10_EXP      FLT_MAX_EXP FLT_MIN FLT_MIN_10_EXP      FLT_MIN_EXP

FLT_RADIX           FLT_ROUNDS          FOPEN_MAX           HUGE_VAL INT_MAX

INT_MIN             _IOFBF              _IOLBF              _IONBF

L_tmpnam            LC_ALL              LC_COLLATE          LC_CTYPE

LC_MONETARY         LC_NUMERIC          LC_TIME             LDBL_DIG

LDBL_EPSILON        LDBL_MANT_DIG       LDBL_MAX            LDBL_MAX_10_EXP

LDBL_MAX_EXP        LDBL_MIN            LDBL_MIN_10_EXP     LDBL_MIN_EXP

LONG_MAX            LONG_MIN            MB_CUR_MAX          MB_LEN_MAX

NDEBUG              NULL                RAND_MAX            SCHAR_MAX

SCHAR_MIN           SEEK_CUR            SEEK_END            SEEK_SET

SHRT_MAX            SHRT_MIN            SIG_DFL             SIG_ERR

SIG_IGN             SIBGABRT            SIGFPE              SIGILL

SIGINT              SIGSEGV             SIGTERM             TMP_MAX

UCHAR_MAX           UINT_MAX            ULONG_MAX           USHRT_MAX

offsetof()


Additional C numeric macros defined by NCEG

FE_ALL_EXCEPT       FE_DBLPREC          FE_DIVBYZERO        FE_DOWNWARD

FE_FLTPREC          FE_INEXACT          FE_INVALID          FE_LDBLPREC

FE_OVERFLOW         FE_TONEAREST        FE_TOWARDZERO       FE_UNDERFLOW

FE_UPWARD           fpclassify()        FP_INFINITE         FP_NANQ

FP_NANS             FP_NORMAL           FP_SUBNORMAL        FP_ZERO

INFINITY            isfinite()          isnan()             isnormal()

NAN                 NANS                __FPCE_IEEE__       __FPCE__


Additional C macros defined in Posix.1

ARG_MAX             B0                  B50                 B75

B110                B134                B150                B200

B300                B600                B1200               B1800

B2400               B4800               B9600               B19200

B38400              BRKINT              CHILD_MAX           CLK_TCK

CLOCAL              CREAD               CS5                 CS6

CS7                 CS8                 CSIZE               CSTOPB

E2BIG               EACCESS             EAGAIN              EBADF

EBUSY               ECHILD              ECHO                ECHOE

ECHOK               ECHONL              EDEADLK             EEXIST

EFAULT              EFBIG               EINTR               EINVAL

EIO                 EISDIR              EMFILE              EMLINK

ENAMETOOLONG        ENFILE              ENODEV              ENOENT

ENOEXEC             ENOLCK              ENOMEM              ENOSPC

ENOTDIR             ENOTEMPTY           ENOTTY              ENXIO

EPERM               EPIPE               EROFS               ESPIPE

ESRCH               EXDEV               FD_CLOEXEC          F_DUPFD

F_GETFD             F_GETFL             F_GETLK             F_OK

F_RDLCK             F_SETFD             F_SETFL             F_SETLK

F_SETLKW            F_UNLCK             F_WRLCK             HUPCL

ICANON              ICRNL               IEXTEN              IGNBRK

IGNCR               IGNPAR              IGNLCR              INPCK

ISIG                ISTRIP              IXOFF               IXON

LDBL_DIG            LDBL_EPSILON        LDBL_MANT_DIG       LDBL_MAX

LDBL_MAX_10_EXP     LDBL_MAX_EXP        LDBL_MIN            LDBL_MIN_10_EXP

LDBL_MIN_EXP        LINK_MAX            L_ctermid           MAX_CANON

MAX_INPUT           NAME_MAX            NCCS                NGROUPS_MAX

NOFLSH              OPEN_MAX            OPOST               O_ACCMODE

O_APPEND            O_CREAT             O_EXCL              O_NOCTTY

O_NONBLOCK          O_RDONLY            O_RDWR              O_TRUNC

O_WRONLY            PARENB              PARMRK              PARODD

PATH_MAX            PIPE_BUF            R_OK                SA_NOCLDSTOP

SIGARLM             SIGCHLD             SIGCONT             SIGHUP

SIGKILL             SIGPIPE             SIGQUIT             SIGSTOP

SIGTSTP             SIGTTIN             SIGTTOU             SIGUSR1

SIGUSR2             SIG_BLOCK           SIG_SETMASK         SIG_UNBLOCK

SSIZE_MAX           STDERR_FILENO       STDIN_FILENO        STDOUT_FILENO

STREAM_MAX          S_IRGRP             S_IROTH             S_IRUSR

S_IRWXG             S_IRWXO             S_IRWXU             S_ISBLK

S_ISCHR             S_ISDIR             S_ISFIFO            S_ISGID

S_ISREGSUID         S_IWGRP             S_IWOTH             S_IWUSR

S_IXGRP             S_IXOTH             S_IXUSR             TCIFLUSH

TCIOFF              TCIOFLUSH           TCION               TCOFLUSH

TCOFF               TCOON               TCSADRAIN           TCSAFLUSH

TCSANOW             TOSTOP              TZNAME_MAX          VEOF

VEOL                VERASE              VINTR               VKILL

VMIN                VQUIT               VSTART              VSTOP

VSUSP               VTIME               WEXITSTATUS         WIFEXITED

WIFSIGNALED         WIFSTOPPED          WNOHANG             WSTOPSIG

WTERMSIG            WUNTRACED           W_OK                X_OK

_PC_MAX_CANON       _PC_MAX_INPUT       _PC_NAME_MAX        _PC_NO_TRUNC

_PC_PATH_MAX        _PC_PIPE_BUF        _PC_VDISABLE        _POSIX_ARG_MAX

_POSIX_CHILD_MAX    _POSIX_JOB_CONTROL  _POSIX_LINK_MAX     _POSIX_MAX_CANON

_POSIX_MAX_INPUT    _POSIX_NAME_MAX     _POSIX_NGROUPS_MAX  _POSIX_NO_TRUNC

_POSIX_OPEN_MAX     _POSIX_PATH_MAX     _POSIX_SAVED_IDS    _POSIX_SSIZE_MAX

_POSIX_STREAM_MAX   _POSIX_TZNAME_MAX   _POSIX_VDISABLE     _POSIX_VERSION

_SC_ARG_MAX         _SC_CHILD_MAX       _SC_CLK_TCK         _SC_JOB_CONTROL

_SC_NGROUPS_MAX     _SC_OPEN_MAX        _SC_SAVED_IDS       _SC_STREAM_MAX

_SC_TZNAME_MAX      _SC_VERSION


_PC_CHOWN_RESTRICTED

_POSIX_CHOWN_RESTRICTED


Standard C defined data types in ANSI (ISO/IEC 9899:1990)

clock_t             div_t               FILE                fpos_t

jmp_buf             struct lconv        ldiv_t              ptrdiff_t

sig_atomic_t        size_t              time_t              struct tm

va_list             wchar_t


Additional C data types defined by NCEG

fenv_t              fexcept_t


Additional C data types defined in Posix.1

cc_t                dev_t               DIR                 gid_t

ino_t               mode_t              nlink_t             off_t

pid_t               struct passwd       sigjmp_buf          sigset_t

sigaction           speed_t             ssize_t             struct stat

tcflag_t            struct termios      uid_t               struct utsname


Standard C global variables in ANSI (ISO/IEC 9899:1990)

errno              stderr               stdin               stdout



Posted by Jason Ryu
,

http://blog.naver.com/heebongkim/10005380491

 아직도 이식성때문에 저런 놈이 종종 따라다닌다....


함수 호출시 전달되는 파라미터는 스택에 저장되는데, 가장 오른쪽것부터 쌓인다.(일부 예외가있긴해도)


1. __cdecl

  • 함수를 호출한 놈이 스택을 정리하게된다. 그래서 스택정리코드가 덧붙어서 크기가 좀 커지긴한다. (작다)
  • 가변인자 함수를 지원해준다.
  •  Name Mangling. int func(int n) -> _func@


2. __stdcall

  • 호출된 함수가 직접 스택을 정리한다. __cdecl보다는 크기가 작다(스택정리코드가 함수뒤에 한번만 작성되므로)
  • 가변인자 미지원. 호출된 함수가 인자개수를 알수없어서 스택정리를 할수가 없게되기때문이다.
  • Name Mangling. int func(int n) -> _func@4


3. __fastcall

  • 호출된 함수가 직접 스택정리.
  • 파라미터가 2개 이하라면 edx, ecx 레지스터를 이용해서 대입.
  • Namg Mangling. int func(int n) -> @func@4


4. thiscall

  • this 포인터만 ecx 레지스터 이용하고, C++ 네이밍룰을 따름.


------------------------< 스크랩 >--------------------------------------

함수호출 방식이 __cdecl, __pascal, __stdcall로 여러 가지가 있는 이유는 윈도우즈의 역사성에 있다. 우선 win16에서는 실행파일의 크기가 줄어들고 속도가 빠르다는 이유로 pascall 방식을 사용 했고 win32에서는 가변매개인자를 지원하는 함수를 제외한 모든 함수들은 __stdcall을 사용 한다.

 만약 c 방식의 함수호출을 원한다면 __cdecl을 명시해 주어야 한다.(윈도우즈 프로그래밍에 있어서) 우선 c 방식의 함수 호출과 pascal 방식의 함수호출의 차이점을 알아보자.

 첫 번째로 함수호출후 종료 시점에 호출한 함수의 스택을 정리하는 주체가 호출한 함수이냐 아니면 호출당한 함수이냐의 차이이다. 두 번째는 매개인자를 스택에 넣는 방향에 따라 나눈다. 즉, 다음과 같이 정리할 수가 있다.

(언더바는 생략가능함 )

1.인수를 스택에 집어넣는 방향에 따라서 다음과 같이 나뉘고
       pascal : 인수를 스택에 저장하는 순서를 왼쪽에서 오른쪽으로 한다.
       cdecl : 인수를 스택에 저장하는 순서를 오른쪽에서 왼쪽으로 한다.
       stdcall : 인수를 스택에 저장하는 순서를 오른쪽에서 왼쪽으로 한다.
2.스택에 인수를 pop 하는 주체에 따라서 다음과 같이 나뉘고.
      pascal : 호출을 당하는 쪽이 스택공간을 삭제한다.
      stdcall : 호출을 당하는 쪽이 스택공간을 삭제한다.
      cdecl : 호출을 하는 쪽이 스택공간을 삭제한다. 

이렇게 stdcall은 pascal방식과 cdecl방식을 혼합한 형태를 띄운다

 

자 이제는 WinMain함수를 살펴보자 일반적으로 WinMain은 다음과 같이 선언되어 있다.

int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow )

APIENTRY는 WINAPI와 같은 형식을 나타낸다. 이것은 FAR __stdcall로 정의되어 있다. 또한 참고로 CALLBACK은 __stdcall로 정의되어 있다. 그럼 WINAPI와 __cdecl 함수의 호출 방식의 차이점을 예제로 알아보도록 하자. 아래에 두 방식으로 호출되는 간단한 예제가 있다.

#include "stdafx.h" int __stdcall func(int i,int j); int __cdecl func2(int i,int j); int _tmain(int argc, _TCHAR* argv[]) { func(1,2); func2(2,3); return 0; } int __stdcall func(int i,int j) { int r; r=i+j; return r; } int __cdecl func2(int i,int j) { int r; r=i+j; return r; }

이 함수들을 호출하는 부분을 디스어셈블 해 보갰다.

func(1,2); 00411A1E push 2 00411A20 push 1 00411A22 call func (411069h) func2(2,3); 00411A27 push 3 00411A29 push 2 00411A2B call func2 (4110FFh) 00411A30 add esp,8 <-------------- cdecl의 함수호출의 경우는 이 부분이 추가됨 return 0; ... ... 00411AA0 ret 8 <------- func가 종료될 때 ... 00411AE0 ret <--------func2가 종료될때 ...

위에 보면은 func를 호출할 때는 없는 코드가 func2에는 있는 것을 볼 수가 있다. 바로 스택을 정리 해주는 코드이다. add esp,8 이라는 것이다. 모든 함수 호출 형식이 이와 같았다면.. 실행 화일 코드에 add esp,8라는 명령어가 더 들어가게 된다. 따라서 이 코드가 존재하지 않는 pascall 방식이 실행크기가 작아지게 된 것이다. 파스칼 호출 방식은 속도도 저 명령어 하나 만큼 빨라지게 되는 것이다.

 여기에는 8086 아키텍쳐에 관련된 명령어가 그 원인으로 등장한다. 그리고 스택을 정리한다는 것 자체가 그 함수를 호출한 뒤에 add esp,8으로 스택포인터를 인자의 크기만큼 변경을 시킨다는 이야긴데...근데 여기서 프로시저 즉 함수를 다 수행했을때 원래 상태로 돌아가게 될 때 쓰이는 명령어는 ret이다. 함수 시작하고, 함수가 끝났을때 ret 명령어로 호출한 부분으로 넘어가게 된다. 다시 말하면 이 명령어는 실행되던 함수를 바로 빠져나가게 된다. 따라서.. 스택을 정리할 시간이 전혀 없다. 이에 8086설계자들은 함수에서 리턴이 될 때 스택포인터(SP)를 적절한 위치로 리셋을 시킬 수 있는 ret명령어를 새로 제공을 하여 이 문제를 아주 손쉽게 해결해 버렸다. 즉 ret, n 이라는 명령어를 제공했다는 셈이다.. 

어차피 리턴할 걸 스택 포인터가 정리되는 부분으로 아예 리턴을 해버리란 이야기다.. 이것은 가만히 앉아서 프로그램의 속도와 크기를 이점을 살리는 것이다. 

add esp,8 ; -->> 추가된 코드..

호출하는 부분에서 이렇게 코딩하는 대신 호출 받는부분에서 리턴할때 ret, 8으로 해결했다는 것이다. 이래서 속도가 더빨라지는 것이다. 크기도 줄어들고..... 생각을 한번 해보자..... 이런식의 함수가 굉장히 많이 호출된다면.. 크기나 실행 시간이 증가되는건 당연하지 않겠는가 ? 이 이유로 속도와 크기가 아주 중요시 되던 시절에(windows 3.0, 3.1이 널리 사용되던 시절에) OS/2와 Windows설계자들은 API함수를 설계할때 프로그램이 느려지고 크기가 커지는 C방식을 사용하지 않고 pascal이나 fortran이 사용하고 있는 방식으로 스택 프레임을 설계 하게 되었다. 바로 이런 이유가 바로 pascal방식에 비교해서 바로 cdecl의 단점이 되는 것이다. 자 이번에는 다시 위의 cdecl 호출의 장점을 보게 되면.. 가변매개인자를 사용할 수가 있다는 것인데... 즉, 매개인자를 오른쪽에서 왼쪽으로 집어 넣는 것이 왜 중요한가? 이다. 이것은 인자의 첫번째가 어디인지 확실하다는 것이다. 즉 알려진 장소에서 첫번째 인자를 찾아낼 수 있다는 장점으로 가변인자를 허용할 수 있다. 호출이 되었을대 스택의 맨 상위부분이 인자의 첫번째임은 확실하니까.... 이것이 cdecl방식의 장점이 되는 것이다. 함수호출이 끝난후 스택을 정리할 때 호출한쪽에서는 정확하게 Stack을 사용한 사이즈를 알고있기 때문에 문제가되지 않지만 호출당한쪽에서는 또다른 정보를 가지고 사용한 Stack의 사이즈를 알아야 하기 때문에 심각한 문제가 발생할수 있다는 것이다. 그러기 때문에 stdcall은 함수호출 방식은 파스칼을 따르고 있지만 가변매개인자는 지원하지 못하는 것이다. 가변매개인자를 꼭 사용해야만 한다면 반드시 cdecl을 사용해야만 한다.



Posted by Jason Ryu
,