분류 전체보기 검색 결과

12개 발견
  1. 미리보기
    2016.03.15 - Saika

    CodeGate2016 eocnd

  2. 미리보기
    2015.06.08 - Saika

    OS X 10.10.3 Kernel Debugging

  3. 미리보기
    2014.11.30 - Saika

    WhiteHat 2014 DROP DATABASE팀 예선 Writeup

  4. 미리보기
    2014.09.01 - Saika

    리눅스 명령어 모음

  5. 미리보기
    2014.08.23 - Saika

    어셈블리 : 함수호출규약

  6. 미리보기
    2014.07.31 - Saika

    HTTP 응답코드 목록

  7. 미리보기
    2014.07.25 - Saika

    x86 Assembly

  8. 미리보기
    2014.07.23 - Saika

    MySQL 연산자 우선순위

  9. 미리보기
    2014.07.23 - Saika

    x86 레지스터 목록

  10. 미리보기
    2014.07.23 - Saika

    ARM assembly 문법정리

  11. 미리보기
    2014.07.23 - Saika

    x86 호출 규약 목록

  12. 미리보기
    2014.07.23 - Saika

    레지스터 목록 및 설명

-

이번 코드게이트는 bpsec에서 낸다길래 RF관련 문제가 나오지않을까했는데 진짜 나왔다ㅋㅋ

대회일정을 착각하는바람에 다른 일하고 겹쳐서 대회끝나고 푼게 너무 아쉽다 ㅠㅠ


여튼 문제설명을 하자면 처음에 encnd라는 문제를 받았을때 3기가나 넘게 되길래 포렌식문제인줄알았는데 첫 힌트였던 Creep노래만 듣고있다가 두번째 힌트였던 RKE Sniffing 동영상을보고 Audacity로 열어보고 RF 패킷파일인줄 알게되었다


ASK/OOK 방식 이길래 따로 demodulation 해주는 코드만드는 등 삽으로 퍽퍽쑤시다가 wav로 변환해보자란 생각이들어서 옛날에 RF스터디때 만들어두었던 HackRF에서 라디오신호받아서 변환해주는 grc에다 파일 인풋 아웃풋만 파일입력받게 바꿔서 패킷을 디코딩해봤더니 처음에는 low pass filter하고 samplerate같은 설정을 잘못해서 너무 빠르거나 알수없는소리가 나왔는데 잘 설정했더니 신나는 강남스타일이 들어있는 wav파일이 나왔다ㅠㅠ




영어 소문자에 공백이없다고해서 플래그는 gangnamstyle

'CTF' 카테고리의 다른 글

WhiteHat 2014 DROP DATABASE팀 예선 Writeup  (2) 2014.11.30

다른 카테고리의 글 목록

CTF 카테고리의 포스트를 톺아봅니다

-

OS X Kernel Debugging - 10.10.3


* Parellels는 리커버리 파티션을 이용해서 OS X VM을 설치할수있다.

* VMWARE에서는 앱스토어에서 받을수있는 OS X.app을 드래그해주면 설치할수있다.


커널 디버깅을 하기 위해서는 Debugger와 Debuggee의 OS버전이 같아야하고 KDKs 설치후 nvram 플래그를 설정해주어야한다.

우선 KDKs는 각 OS X 버전 별로 다르므로 애플홈페이지에서 자신의 버전에 맞는 KDKs를 다운받아 설치한다

Kernel Debug Kit(KDK)s Download

설치하면 디버그용 커널이 설치되는데 실제 커널이 있는 디렉토리로 복사해주어야한다


아래 명령어는 10.10.3 기준이다 버전별로 KDKs설치되는 경로가 다르므로 주의! 

sudo  cp  /Library/Developer/KDKs/*/System/Library/Kernels/kernel.development  /System/Library/Kernels/


이때 플래그들은 활성화 시킬 값들을 모두 더한 값으로 설정해준다. (ex : 0x100 + 0x040 + 0x001 = 0x141)

 플래그

 설명

 0x001

 부팅할때 멈춘후 디버거가 attach될때까지 기다린다

 0x002

 커널 디버깅의 출력값을 콘솔로 전송한다

 0x004

 nonmaskable 인터럽트로 디버거를 떨군다(Drop into debugger on a nonmaskable interrupt)

 0x008

 커널 디버깅정보를 시리얼포트로 전송한다

 0x010

 ddb를 기본 디버거로 만든다

 0x020

 진단 루틴 정보(diagnostics information)를 시스템로그에 출력한다

  0x040

 ARP와 route를 통한 디버거를 허용한다

 0x080

 최신(newer) 시스템에 옛날버전의 GDB를 지원하게한다.

 0x100 graphical panic dialog screen표시를 해제



2번 설정을 사용하면 

sudo nvram boot-args="pmuflags=1 debug=0x166 kext-dev-mode=1 kcsuffix=development -v"

sudo kextcache -invalidate

sudo reboot

위의 설정에서는 0x166이란 설정값을 사용했는데 이렇게하면 자세한 디버깅정보를 출력해주면서 크래시나 패닉이 일어났을때 디버거 attach 대기 상태로 넘어가게되어 매번 크래시마다 재부팅할때 디버거를 다시 attach해서 복잡하게 진행하는 귀찮은 일을 조금더 편하게 할수있다

부팅할때부터 디버거를 attach하고싶다면 0x141 플래그를 사용하면 디버깅할때 자세한정보를 출력해주면서 부팅시 디버거 attach 대기상태가된다



해당 플래그를 정상적으로 입력하고 크래시를 내면 waiting for debugger라고 뜨는데. 바로 위에 나타나는 ip를 사용하여 이제는 Host OS에서 lldb의 kdp-remote 명령을 이용해 연결할수있다.


lldb에서

kdp-remote <TARGET_IP>



다른 카테고리의 글 목록

Hack 카테고리의 포스트를 톺아봅니다

-

 141108~09 진행된 Whitehat Contest 예선 Writeup입니다

WhiteHat 2014_DROP DATABASE팀_Writeup.pdf


'CTF' 카테고리의 다른 글

CodeGate2016 eocnd  (1) 2016.03.15

다른 카테고리의 글 목록

CTF 카테고리의 포스트를 톺아봅니다

-


A


adduser

루트로 로그인해서 이용자를 추가합니다.
# adduser zzz
zzz란 아이디를 만든다.
# adduser -p bbb -g ggg -s '/bin/bash' -d '/home/www' zzz
비밀번호가 bbb이고 그룹은 ggg 쉘은 bash 홈디렉토리는 /home/www 인 zzz란 아이디를 만든다.

 

 


alias

자주 쓰이는 명령어를 쓰기 편하게 바꾸는 명령입니다.

 

$ alias

alias cp='cp -i'

alias la='ls $LS_OPTIONS -a'

alias less='less -rf'

alias lf='ls $LS_OPTIONS -F'

alias ll='ls $LS_OPTIONS -l'

alias ls='ls $LS_OPTIONS'

alias mv='mv -i'

alias rm='rm -i'

 

 

$ alias dir='ls -al'

dir 명령어가 ls -al 명령어를 대산합니다. 한글로도 사용 가능합니다.

 

B

bg

사용중인 프로그램의 수행을 백그라운드로 수행합니다.

 # bg

 

 

 


bash

bash 셸이 아닌 사용자가 셸을 변경하고자 할 때 사용하는 명령입니다.
bash셸은 일반적으로 Linux의 기본 셸로 지정되어 있습니다.
만약 다른 셸을 사용하고 있으면서 bash 셸로 바꾸기 위한 명령은 다음과 같습니다.

# bash     (enter)'

 

c

C


cat

cat(conCATenate)은 파일의 내용을 표준 출력으로 내보내어, 파일내용을 알아보거나, 여러 파일을 하나의 파일로 출력하여 연결합니다. 또는 표준 입력으로부터 파일을 만들 수도 있습니다.

    cat [options] [file(s)]

파일 이름이 주어지지 않으면, 표준 입력으로 입력 받습니다.

   

옵션 :   -n 행 번호를 붙인다.

          -u 버퍼를 통하지 않고 출력시킨다.

          -A 화면 제어 문자를 보여준다. 라인의 끝은 $, 탭문자는 ^l로 보여준다.

 

ex)

control-D를 입력할 때까지 키보드(표준 입력)에 입력한 내용을 memo라는 파일로 저장한다.             

   cat > memo

 

test2와 test12 파일을 연결하여 te1이라는 파일에 저장한다.

   -rw-r--r--   1 hjh      linux         139 Sep 21 19:53 te1

  -rw-r--r--   1 hjh      linux         281 Sep 14 21:46 test2

  $ cat te1 test2 > test12

  -rw-r--r--   1 hjh      linux         139 Sep 21 19:53 te1

  -rw-r--r--   1 hjh      linux         420 Oct  7 16:53 test12

  -rw-r--r--   1 hjh      linux         281 Sep 14 21:46 test2

 

 

 

 


chfn

사용자의 finger 정보를 바꾸는 명령어입니다.

 

$ chfn

Changing finger information for hjh.

Password:

Name [hjh]: hjh

Office [hjh]:

Office Phone [hjh]:

Home Phone [hjh]:

 

Finger information changed.

 

 

chfs

사용자의 shell을 바꾸는 명령어입니다.

 

$ chsh

Changing shell for hjh.

Password:

New shell [/bin/bash]:

 

 

 

D

date

현재 시각을 출력합니다.

 

$ date

Sat Oct  7 17:34:34 KST 2000

 

 

 

df

파일 시스템 구조와 용량등을 보여줍니다.

 

$ df

Filesystem           1k-blocks    Used Available   Use% Mounted on

/dev/hda6              3016144   1231812   1631120     43% /

/dev/hda1                19487      3198        15283     17% /boot

/dev/hdb2               425582    193543     210065     48% /opt

/dev/hdb1               605164    137520     436904     24% /home/ftp

/dev/hdc                661404    661404             0    100% /home/ftp/pub/cdrom

/dev/hdd                559026    559026             0    100% /home/ftp/pub/cdrom1

 

$ df -m    (파일 크기를 Mbyte단위로 보여줍니다.)

Filesystem           1M-blocks Used Available Use% Mounted on

/dev/hda6                 2945      1203      1593  43%     /

/dev/hda1                   19         3           15  17%     /boot

/dev/hdb2                  416       189        205  48%     /opt

/dev/hdb1                  591       134        427  24%     /home/ftp

/dev/hdc                   646       646           0 100%     /home/ftp/pub/cdrom

/dev/hdd                   546       546           0 100%     /home/ftp/pub/cdrom1

 

 

dmesg

부팅 메세지를 보여주는 명령입니다.

CPU 속도에 대한 간단한 지표(오로지 속도)로는 리눅스 부팅 초기에 화면에 표시되는BogoMIPS라는 것을 들 수 있다.

Probing PCI hardware
Calibrating delay loop.. ok - 47.82 BogoMIPS
Memory 47020k/49152k available (764k kernel
code, 384k reserved, 984k data)

부팅 화면이 너무 빠르게 지나간다면 로그인하고 나서 dmesg 명령을 사용하여 확인해보기 바란다. dmesg명령의 출력화면도 한 페이지를 넘어가므로 more 또는 less를 파이프로 연결하여 사용하기 바란다. 위 결과는 필자의 펜티엄 120MHz에 대한 BogoMIPS 결과이다.

그럼 BogoMIPS란 무엇인가? BogoMIPS 미니 하우투 문서에 잘 설명되어 있다. MIPS‘Millions of Instructions Per Second’를 의미하는 것으로서 초당 몇 번의 연산 명령을 수행할 수 있는지 여부를 보여주는 것이다. 당연히 이 값이 높은 시스템일수록 빠르다는 것은 분명한 사실이다. 하지만 비슷비슷한 수치 간의 비교는 상당히 힘든 방식이다.

BogoMIPS라는 말은 커널 제작자인 Linus가 만든 말로서 Bogo는 ‘Bogus’ 즉 가짜라는 의미를 가지고 있다. 그렇게 과학적이지는 않으므로 우스개소리로 넘기라는 뜻이라고 생각한다. 이 값은 프로세서의 속도에 따라 결정되어야 하는 타이밍 루프(timing loop)값이다.

 

 

du

파일 size를 kbyte단위로 보여줍니다.

 

-a 디렉토리뿐만 아니라 파일의 크기도 보여줍니다.

-b KB단위가 아니라, byte 단위로 나타냅니다.

-s 서브 디렉토리는 나타내지 않습니다.                                       

 

ex)

$ du

...........

4       ./ccc

804     ./WWW/images

1424    ./WWW

4       ./SSS

22280   .

 

총 size보여줍니다.

$ du -s

22280   .

 

$ du -s /usr/bin

72996   /usr/bin

 

e

E

echo

아큐먼트로 오는 문장이나 그 주소에 해당되는 값을 보여줍니다.

 

형식 : echo [-ne] [string]

 

옵션 :

-e 특수한 의미를 가지는 문자를 실행합니다.

\a 벨소리를 냅니다.

\b 백스페이스

\f 폼피드

\n 새로운 라인

\r 한 줄을 띄웁니다.

\t 가로방향의 탭

\\ 역슬래시

 

 

 

 

exit

현재의 프로세스를 종료하고 빠져나갑니다.

 

 

 

 

 

 

F

find

$ find hjh

hjh

 

find ---주어진 파일명과 동일한 파일을 찾고, 그 경로를 출력한다.

# find / -name newbie -print

최상위 루트 디렉토리부터 검색하여 검색된 파일을 한 행에 하나씩 표준 출력

# find . -name newbie -print

현제의 작업 디렉토리에서 검색

# find / -size +1000 -print

최상위 루트에서 크기가 1000블록 이상인 파일 검색

# find . -size -1000 -print

현 디렉토리에서 크기가 1000블록 이하인 파일 검색

# find . -mtime +10 -print

10일 이전에 수정된 파일 검색

# find . -mtime -10 exec rm {} \:

10일 이내에 수정한 파일을 검색하여 모두 지운다

# find / -cmin 5 -print

5분전에 마지막으로 수정된 파일을 찾을 수 있다.

# find /home -empty -print

/home 디렉토리에 용량이 0인 파일과 디렉토리를 찾는다.

# find / -perm -4000 -print

퍼미션이 4000 이상인 파일을 모두 출력한다.

 

 

finger

who 명령을 보충하는 명령이 finger입니다. 특정 사용자에 대한 정보를 알려면 finger username(또는 사용자가 다른 컴퓨터에 있으면 finger username@domain)을 입력합니다.

 

$ finger

Login   Name      Tty     Idle  Login Time   Office     Office Phone

hjh       hjh        /0          Oct  7 16:17 (linux5)

root      root      *1    22:52  Oct  6 17:34

root      root      *p0   22:30  Oct  6 17:36 (:0.0)

root      root      *p1   22:30  Oct  6 17:36 (:0.0)

 

 

free

도스에서의 mem 과 같은 역할을 하며, 메모리의 사용상태와 남은 상태, 버퍼의 상태등을 보여줍니다.

 

$ free

                  total       used       free     shared    buffers     cached

Mem:          30848      29844       1004      14324       1028       8900

-/+ buffers/cache:     19916      10932

Swap:         68504      39508      28996 

 

 

fsck

모든 파일 시스템을 체크합니다.

단일 사용자 모드에서의 부팅

단일 사용자 모드( single user mode, 실행 레벨 1)는 중요한 실행 레벨이다. 이 상태에서는 단지 관리자만이 시스템을 사용할 수 있으며, login 같이 시스템 가동에 필수적인 최소한의 서비스만이 실행된다. 단일 사용자 모드는 몇몇 시스템 관리 작업을 하기 위해서 필요한데, 예를 들자면 /usr파티션에 fsck를 실행시키는 일 같은 것들이다. fsck를 실행시키기 위해서는 해당 파티션을 언마운트시켜야 하는데, /usr 같은 파티션을 언마운트시키자면 거의 모든 시스템 서비스들을 종료시켜야 한다.

가동 중인 시스템을 단일 사용자 모드로 전환하려면, telinit를 사용해 실행 레벨 1로 전환하면 된다. 부팅시에는, 커널 명령행에 single이나 emergency라고 적어주면 커널이 이것을 init에 전달해 주게 되며, init는 이것을 알아듣고 기본 설정된 실행 레벨 대신 레벨 1번을 사용하게 된다. (커널 명령행 인자를 넣는 방법은 시스템을 부팅하는 방법에 따라 좀 다를 수 있다. 보통은 LILO에서 boot: 프롬프트가 떴을 때, "boot:linux single"과 같이 하는 방법을 쓴다.)

단일 사용자 모드는, 주로 손상된 파일시스템이 마운트되기 전에 fsck 명령을 수동으로 실행하기 위해서 사용된다. 손상된 파일 시스템을 그대로 다시 마운트하면 더욱 큰 손상을 입힐 수 있기 때문에, 손상된 파일시스템은 마운트한다거나 기타 다른 조작을 해선 안되며 가능한 빨리 fsck로 복구를 시도하여야 한다.

손상된 파일시스템이 발견되면 init가 자동으로 fsck를 실행하는데, 이 자동 복구가 실패하게 되면 init 스크립트는 자동으로 시스템을 단일 사용자 모드로 진입시킨다. 이렇게 하면, 손상이 심각하여 fsck가 자동으로 복구할 수 없는 파일시스템이 그대로 마운트되는 일을 막을 수 있다. 물론 이럴 정도로 심하게 손상되는 일은 상당히 드물며, 보통 하드디스크가 손상되었거나 실험적인 커널을 사용했을 경우에 가끔 발생할 수 있는 일이다. 그러나, 이런 사태에 대비하고는 있어야 하겠다.

보안상의 이유로, 제대로 설정되어 있는 시스템이라면 단일 사용자 모드에서 쉘을 실행시키기 전에 루트 패스워드를 물어올 것이다. LILO에서 커널 명령행 인수로 single 을 적어 주는 경우도 이와 같다.(그러나 /etc/passwd가 들어있는 파일시스템이 깨졌다면 단일 사용자 모드로도 들어 올 수가 없다. 결국 이럴 때는 부팅 플로피를 사용해야만 할 것이다)

 

 

G

gdm, xdm, kdm

/etc/inittab

서버에서 xdm을 실행해줄 필요가 있다. 이는 보통 /etc/inittab에서 제어되며 사용가능한 xdm서버는 여러가지가 제공된다. (xdm, gdm, kdm등)

xdm을 사용할 것을 권장한다.

/etc/inittab에서 다음줄을 찾는다.

x:5:respawn:/etc/X11/prefdm -nodaemon 
6.0에서는 prefdm은 gdm에 링크되어 있으며, 6.1에서는 prefdm은 어떤 xdm을 이용할 것인가를 결정하는 스크립트 파일이다.

이 줄을 다음과 같이 수정한다.

x:5:respawn:/usr/bin/X11/xdm -nodaemon
보통 xdm은 런레벨 5에서 작동된다. 서버가 어떤 런 레벨에 있는지는 다음 항목을 보면 알 수 있다. /etc/inittab파일의 initdefault항목을 보았을 때, 다음과 같다면
id:3:initdefault:
아래와 같이 고쳐준다.
id:5:initdefault: 

 

 

grep

파일 중에서 어떠한 패턴을 검색합니다. 입력으로 파일이 오지 않으면 표준 입력으로부터 입력을 받습니다.

 

형식 :  grep  문장 파일명

 

옵션----------------

-A [숫자] 라인에서 패턴과 매치되는 문자열을 찾아서 그 이상의 라인을 전부 보여줍니다.

-B [숫자] 라인에서 패턴과 매치되는 문장열을 찾아서 그 이하의 라인을 전부 보여줍니다.

-b 매치되는 라인과 그 크기(bite)를 출력합니다.

-c 매치되는 개수를 출력합니다.

-f 파일로부터 패턴을 입력받아 들입니다.

-n 매치되는 라인과 그 라인수를 출력합니다.

-v 매치되지 않는 라인을 출력합니다.]

-w 주어진 단어와 완전히 매치되는 라인을 출력합니다.

 

ex) finger가들어있는 것들을 모두 보여줍니다.

$ grep finger .bash_history

grep finger *

grep finger .*

grep finger

grep finger newfile > fin

history|grep finger

history|grep finger | more

finger

finger | sort  

 

 

groupadd

그룹이용자를 추가하는 명령입니다.

 Group passwords.

/etc/groups file은 사용자가 특정 group의 회원이 될 수 있도록 허용하는 password를 담고 있다. 이 기능은 /usr/src/shadow-YYMMDD/config.h의 SHADOWGRP 상수를 정의할 경우 작동된다.

만일 이 기능을 쓴다면, /etc/gshadow file을 만들어, group password와 group 관리자에 대한 정보를 담을 수 있도록 하라.

/etc/shadow를 만들 때, 당신은 pwconv를 썼지만, /etc/gshadow를 만드는 데에는 그런 program이 없다. 하지만 걱정말라. 알아서 하니까.

처음 /etc/gshadow를 만들기 위해서 다음처럼 해라:

touch /etc/gshadow

chown root.root /etc/gshadow

chmod 700 /etc/gshadow

당신이 새로운 group을 만든다면, 자동적으로 /etc/group와 /etc/gshadow file에 그들이 덧붙여진다. group에 사용자를 추가하거나 삭제, 또는 group password를 바꾸면, /etc/gshadow file은 따라서 바뀔 것이다.

groups, groupadd, groupmod, groupdel program이 group을 고치는 도구로써 Shadow Suite에 포함되어 공급된다.

/etc/group file의 형식 -------- groupname:!:GID:member,member,...

 

gpasswd 명령은 group의 사용자나 관리자를 추가, 또는 삭제할 때 쓴다. root또는 관리자만이 group member를 추가, 삭제할 수 있다.

group password는 root나 group 관리자에 의해 passwd 명령으로 바꿀 수 있다.

gpasswd에 대한 manual page가 현재 제공되어 있지 않지만, 아무런 parameter없이 gpasswd를 치면 option에 대한 list가 나오므로, file format과 개념만 잘 이해하면 사용법을 쉽게 익힐 수 있다.

 

  

H

head

파일의 처음 n개의 내용을 보고자할 때 사용하는 명령입니다.

 

ex)

$ head .bash_history    

cd test

ls

ls /bin

cd ..

ls /

alias ls

cd root

vi root

ls -al

ls /...........

 

 

history

작업한 내역을 보여줍니다.

 

ex) 최종작업 5가지를 출력합니다.

$ history 5

 1025  ls -l Desktop

 1026  ls -al

 1027  mv test1 test2

 1028  ls -al

 1029  history 5

 

 

I

id

사용자의 로그인명, ID, 그룹 ID등을 출력합니다.

 

$ id

uid=1013(hjh) gid=1000(linux) groups=1000(linux),100(users)

 

 

 ispell

영어 단어의 철자를 확인합니다.

    ispell [options] [file(s)]

파일 이름을 써주면 해당 파일의 단어를 검사하며, 파일 이름없이 실행시키면 표준 입력의 단어를 체크합니다. 해당하는 단어가 없을 때는 비슷한 단어들의 리스트를 보여줍니다.                    

 

 

install

파일을 갱신하고 이진 파일로써 인스톨하기 위해 makefile에서 종종 사용되는 유틸리티입니다.

 

 

 

j

J

 join

두 개의 파일에서 공통된 라인을 찾아 내는 명령입니다.

 

 

joe

emacs에 기초한 텍스트 에디터입니다.

 

 

 

 

K

 kill

실행되어 있는 프로세서 ID를 입력해서 프로세서를 종료하는 명령입니다.

좀비 프로세스 또한 kill명령을 사용하여 끝낼 수 있는데, kill -signal pid 와 같은 형식으로 사용하지만 -9(SIGKILL)이 무조건 종료시키기 위한 옵션으로 많이 쓰입니다. 
다른 시그널은 프로세스에 따라서 무시될 수도 있습니다. 
꼭 kill이 아니더라도 프로세스에게 시그널을 보낼 수있는데, 컨트롤 Z(susp)를 누르면 SIGSTOP이, quit(^)는 SIGQUIT, intr(^C)는 SIGINT가 실행중인 프로세스에게 전달됩니다.

 

 

 

 

L

last

시스템에 마지막으로 접근한 사용자를 표시합니다.
옵션 : -f  파일명을 참조하여 출력합니다.
        -t  tty로 로그인한 터미널을 추적합니다.
        -v  로그인한 연도를 추가해서 출력합니다.

 

 

less

파일을 한 page 단위로 출력합니다.
 

$ less .bash_history

 

 

lf

디렉토리를 모두 보여줍니다.

 

$ lf

Desktop/  a*   bbb   down/  finda  homepage.tar.Z   newfile*   te1     test2

SSS/      a.c  ccc/  err    his    homepage.tar.gz  newfile2*  test/   test3/

WWW/      aaa  doc@  fin    hjh    homepage.tar.z   nohup.out  test12

 

 

ln

앞의 파일, 디렉토리를 뒤로 링크시킴

$ ln -s /usr/doc/HOWTO/ $HOME/doc

 

 

 

locate

저장 위치를 찾아 줍니다.

목록을 DB화 시켜놓았기대문에 빨리 찾습니다.

 

$ locate ls

/usr/lib/python1.5/mimetools.py

/usr/lib/python1.5/mimetools.pyc

/usr/lib/python1.5/mimetools.pyo

/usr/lib/pgsql/python/tutorial/pgtools.py

/usr/lib/pgsql/test/performance/sqls

/usr/lib/pgsql/test/performance/sqls/connection........

 

 

login, logout

자신을 식별하고 시스템에 대한 액세스를 얻기 위해 사용하는 명령입니다. 

형식 : login -옵션 사용자명
옵션 : -f 뒤의 사용자명으로 로그인 합니다.
        -g 뒤의 그룹사용자명으로 로그인 합니다.

터미널 상태에서 login 이라고 입력하면 새롭게 리눅스 시스템에 다른 ID로 로그인할 수 있습니다.

 

 

ls

디렉토리와 파일의 정보를 출력합니다. 도스의 dir과 비슷합니다.

    ls [-ailFRC] [파일 또는 디렉토리]

옵션----------------

    -l 파일에 대한 정보(파일 허용권, 소유자, 그룹, 크기, 날짜)를 긴 형식으로 보여줍니다.

    -a 는 모든 파일을 지정합니다(디렉토리의 히든 파일도 보여줍니다).

    -i 파일의 'inode'도 같이 보여줍니다.

    -t 최종 수정된 시간별로 정렬합니다.

    -r 파일을 역순, 즉 내림차순으로 배열합니다.

    -u 변경되지 않았더라도 최근에 엑세스했던 파일들을 보여준다. 이 t나 u옵션으로 최근에 다루었던 파일을 찾는데 유용하게 쓸 수 있습니다.

    -F 파일의 특성을 보여줍니다. 이름 뒤에 디렉토리면 /를 실행파일이면 *, 심블릭 링크된 파일이면 @를 붙여줍니다.

    -R 하위 디렉토리의 파일도 모두 보여줍니다.

    -C 컬럼별로 파일을 보여줍니다.

    -w 컬럼수로 가로의 크기를 설정합니다.

    -m 가로로 간단히 출력합니다.

    -- color=yes 서브디렉토리를 구별하기 위해 color로 보여집니다.

    

리눅스의 명령어에서 이런 옵션들은 대개 여러 개를 같이 써 줄 수 있다.    
ex) -a -l은 -al과 같이 쓸 수 있습니다..
      ls -art는 현재 디렉토리에서 파일이 최종 수정된 시간의 내림차순으로 정렬된 모든 파일의 이름을 나열합니다. 따라서 가장 최근파일이 맨 아래에 표시됩니다.

 

$ ls -l Desktop

total 40

drwxr-xr-x   2 hjh      linux        4096 Sep  7 18:53 Autostart

-rw-r--r--   1 hjh      linux        2487 Sep  7 18:53 Home.kdelnk

-rw-r--r--   1 hjh      linux         270 Sep  7 18:53 Printer.kdelnk

drwxr-xr-x   2 hjh      linux        4096 Sep  7 18:53 Templates

drwxr-xr-x   2 hjh      linux        4096 Sep  7 18:53 Trash

-rw-r--r--   1 hjh      linux         432 Sep  7 18:53 cdrom.kdelnk

-rw-r--r--   1 hjh      linux         417 Sep  7 18:53 floppy.kdelnk...이하 생략

 

 

 

 

M

mail

메일을 주고 받을 수 있는 명령입니다.

 

[hjh@mail mail]$ mail       

No mail for hjh                      ### 현재 받은 메일이 없다고 나타내 줍니다.

 

 

메일을 보낼 때의 형식 : mail E-mail주소(= mail ID@도메인이름)

 

[hjh@mail mail]$ mail hjh       

  ### hjh라는 ID를 가진 사용자에게 메일을 보냅니다.(현재 host를 같이 사용중일 경우에는 그냥 ID만 적어도 됩니다.)

Subject: 안녕     ### 제목을 적습니다.

안녕                 ### 편지 내용을 적습니다.

test입니다.

.                     ### 마칠 때는 새줄에서 .을 적습니다.

Cc:                 ### 참조할 메일 주소를 적습니다.

[hjh@mail mail]$

 

 

man

주어진 명령이나 자원들의 매뉴얼을 출력한다. more에서와 같이 페이지 넘기기나 탐색 명령을 줄 수 있다.

    man [options] [section] command

 

    -k 다음에 키워드를 주면 그것이 포함된 명령어를 보여준다. 이것이 apropos 명령과 같다.

    -f 다음에 명령어를 적어주면 한 줄짜리 짧은 명령어 설명을 보여준다.  이것은 whatis 명령과 같다.

 

section은 다음과 같이 나누어져 있다. 해당 번호를 적으면 된다.

(1) User Commands

(2) System Calls

(3) Subroutines

(4) Devioes

(5) File Formats

(6) Games

(7) Miscellaneous

(8) Sys. Administration

 

 

 

mv

파일의 이름을 변경하거나 이동하는 명령입니다. 

옵션 : -b 백업파일을 만든후 파일을 지우거나 옮깁니다.
         -i 이미 존재하는 파일을 덮어 쓸 것인지 물어봅니다.
         -v 파일을 옮기면서 파일명을 출력합니다.

 

ex)

-rw-r--r--   1 hjh      linux         281 Sep 14 21:46 test1

$ mv test1 test2
$ ls

-rw-r--r--   1 hjh      linux         281 Sep 14 21:46 test2

 

 

mount,  mke2fs

mount 명령의 여러 양식은 매우 공통적입니다.

형식 : mount  [-t] [fs-type] device mount-point

/proc]#cat filesystems에서 fs-type을 알 수 있습니다.
/etc]#cat fstab 명령으로 device, mount-point를 확인할 수 있습니다.

예를 들어, 명령 mount /dev/hdb3 /mnt 는 디렉토리 /mnt 아래에 하드 디스크 파티션 /dev/hdb3을 탑재합니다.
비슷하게, mount -r -t iso9660 /dev/sr0 /mnt 는 디렉토리 /mnt 아래에 SCSI CD-ROM 드라이브 /dev/sr0을 탑재하며, 이 드라이브는 읽기 전용이고 ISO9660 파일 형식을 갖습니다. 
또한 명령 mount -vat nfs 는 /etc/fatab 파일에 나열되는 모든 NFS 파일 시스템을 탑재합니다.

파 일 시스템이 올바르게 탑재하지 않는 경우, 명령 mount -vf device mountpoint를 사용하여 어떤 mount가 수행중인지를 확인할 수 있습니다. 이 명령은 verbose목록을 제공하며 mount에게 파일 시스템 탑재를 제외한 모든 것을 수행하도록 지시합니다. 이 방법으로 mount 명령을 가장하고 명령이 수행하려고 시도하는 사항에 대한 많은 정보를 얻을 수 있습니다.

 

mke2fs는 partition을 ext2 file system으로 format하기 위해서 사용된다. - LINUX에서 가장 널리 사용되는 file system이다. mount는 formatted partition을 여러분의 계층적인 디렉토리 구조로 연결하기위해 사용된다.

도스 포맷의 디스크

 

먼 약 여러분들이 원래의 IOMEGA의 tools에 의해 생성된 DOS file structure를 가진 ZIP disk를 가지고 있다면 이들은 partition scan상에서 disk가 /dev/sda4 의 하나의 파티션만을 가진다고 보고를 할 것이다.

여러분들은 이들 disk를 /zip라는 directory에 mount를 할려면 이런식으로 해야만 한다.

mkdir /zip

mount -t msdos /dev/sda4 /zip

이 제 여러분들의 disk는 /zip에 마운트되어 보일 것이다. disk가 mount 되어 있는 동안에 여러분들은 그것을 제거하려 해서는 안된다. 여러분들이 disk를 가지고 작업이 끝났을 경우 그것을 umount 시키고 release 시켜 계층적인 directory로 부터 분리시키면 된다.

umount /zip

일단 여러분들이 mount되는 directory /zip를 만들고 나면 여러분들은 다시 이것을 할 필요는 없으며 후에 다시 어디선가 mount를 시키면 된다.

  

리눅스로 다시 포맷하기

 

만약 여러분들이 ZIP disk를 지우고 그 위에 Linux native file system을 만들기를 원하면, 전 disk에 대하여 fdisk를 해 주어야 한다.

fdisk /dev/sda

그리고 모든 기존의 파티션들을 지워야 한다. (d 명령을 사용한다) 그리고 나서 n 명령 이용하여 새로운 partition을 만들어 주고 w 명령으로 변화사항을 기입을 하고 q 명령으로 마친다.

파티션을 format한다.

mke2fs /dev/sda1

(여기서 1이란 수는 여러분들이 fdisk에서 partition에 부여한 번호이다. 이제 여러분들은 disk를 mount하여 사용하면 된다.

mount -t ext2 /dev/sda1 /zip

(위에서 사용한 mount point를 다시 사용한다.) 

 

 

 mkswap

스왑 공간 생성하기

스 왑 파일은 평범한 파일이다. 즉, 커널이 보기엔 일반 파일과 다를 바가 없다. 다만 다른 점이라면 스왑 파일에는 빈틈(holes)이 없으며, mkswap과 함께 사용하게 되어 있다는 점 정도이다. 그리고 스왑 파일은 꼭 자신의 파일시스템(local filesystem)에 있어야 하며, NFS를 통해 마운트된 파일시스템에 있어선 안 된다.

 

스 왑 파일 안에 홀(hole)이 없어야 한다는 점은 중요하다. 스왑 파일은 디스크의 일부를 미리 점유하고 있는데, 이렇게 하면 디스크 섹터를 일일이 할당하는 과정을 거치지 않고서도 메모리 페이지를 파일로 빠르게 스왑시킬 수 있다. 즉, 커널은 파일에 미리 할당되어 있는 섹터를 곧바로 사용하기만 하면 되는 것이다. 스왑 파일 안에 빈틈이 있다는 것은 아무 섹터도 할당되지 않은 공간이 파일 안에 있다는 뜻인데, 이렇게 되면 커널이 스왑을 사용하는데 곤란을 겪게 된다.

 

홀이 없는 스왑 파일을 생성하기 위한 좋은 방법은 다음과 같다.

$ dd if=/dev/zero of=/extra-swap bs=1024 count=1024

1024+0 records in

1024+0 records out

$

 

  위에서 /extra-swap이란 것은 스왑 파일의 이름이며, bs= 뒤에 오는 숫자는 입출력 단위의 크기를 지정한 것이고(1024 byte, 즉 1 kilobyte), count= 뒤의 숫자는 입출력 단위의 몇배 크기의 파일을 만들 것인지를 지정하기 위한 것이다(즉, 여기서는 1024 kilobyte 크기의 파일을 만든 것이 되겠다). count는 꼭 4의 배수로 지정해 주는 것이 좋은데, 그 이유는 커널이 스왑하는 메모리 페이지(memory page)의 단위가 4 kilobyte이기 때문이다. 만일 파일의 크기를 4 kilobyte의 배수로 하지 않는다면, 파일 끝에 남는 몇 킬로바이트는 아예 사용되지 않을 것이다.

 

스 왑 파티션도 사실 특별한 것은 없다. 만드는 것도 다른 보통 파티션과 다를 것이 없지만, 특별한 점이라면 스왑파티션에는 어떤 파일시스템도 사용되지 않으며 날것(raw partition) 그대로 쓴다는 점이다. 스왑용으로 쓸 파티션은 type 82로 지정해 두는 것이 좋은데, 이렇게 해두면 파티션의 용도가 명확해진다. 그러나 사실 커널은 이런 것에 그다지 구애받진 않는다.

 

스 왑 파일이나 스왑 파티션을 만들고 나면, 그 앞부분에 일종의 인식표를 달아두어야 한다. 여기에는 커널이 사용하는 몇가지 정보가 위치하게 된다. 이것을 해주는 명령어는 mkswap인데, 다음과 같이 쓰인다. $ mkswap /extra-swap 1024

Setting up swapspace, size = 1044480 bytes

$ 이렇게 했다고 해서 이 스왑 공간을 사용하게 된 것은 아니다. 다만 커널이 이것을 가상 메모리로 사용할 수 있도록 준비만 마친 것이다.

 

mkswap 명령은 사용에 주의가 필요하다. 이 명령은 파일이나 파티션이 사용 중인지 아닌지를 판별해 주지 않기 때문이다. 따라서 mkswap을 부주의하게 사용하면 중요한 파일과 파티션을 간단히 날려버릴 수 있다! 그러나 다행히도, mkswap 명령은 주로 시스템 설치시에만 사용된다는 점이 우리를 안심시켜 주긴 한다.

 

리 눅스의 메모리 관리자는 각각의 스왑 공간의 크기를 약 127MB로 제한하고 있다(몇가지 기술적인 이유로 인해 실제 한계치는 (4096-10) * 8 * 4096 = 133890048 bytes 즉 127.6875 megabytes이다). 대신, 최대 8개의 스왑 공간을 연결해 사용하면 스왑을 대략 1GB까지 확장할 수가 있다.

 

 

 

n 

N

  nice

nice는 프로세스의 순위를 변경시킵니다. 이것은 커다란 프로그램을 컴파일할 때와 같이 CPU나 메모리를 많이 쓰는 경우 전체 시스템 속도를 많이 저하시켜 마치 다운된 것처럼 만들어 버릴 수도 있기 때문에 다른 프로세스들에게 먼저 양보하는 선행(?)을 하게 한다. 그 정도를 -n뒤에 nice값으로 주어 명령을 실행시킵니다.

    #nice command -n XX

nice값은 -20에서 19까지 있는데, 값이 작을수록 우선 순위가 높습니다. -n옵션을 쓰기 않으면 디폴트로 10이 쓰입니다. 일반 유저는 nice값을 증가시킬 수밖에 없지만 root는 nice값을 감소시켜 우선 순위를 높을 수도 있습니다.                 

 

 

  nslookup

도메인의 IP주소나 도메인 등의 정보를 출력합니다.

형식 : nslookup 도메인이나 IP

[hjh@mail hjh]$ nslookup

.......

www.yahoo.co.kr

.......

Name:    www.yahoo.co.kr

Address:  211.32.119.135

 

211.32.119.135

......

Name:    www.yahoo.co.kr

Address:  211.32.119.135

 

 

 

 

O

od

 8, 10, 16진 또는 파일의 ASCII 덤프를 만들기 위한 명령입니다.

형식 : od -옵션 file

옵션 : -b 바이트를 8진수로 출력합니다.
        -c 바이트를 아스키 문자로 출력합니다.
        -x 16진수 워드단위로 출력합니다.

 

 

P

passwd

사용자의 패스워드를 변경 또는 바꾸는 명령어입니다.(암호화 되어 /etc/passwd 파일에 놓여집니다.)

암호는 최소한 6자 이상이어야 합니다(8자 이상 권장).

암호는 구두점 기호와 숫자뿐만 아니라 대소문자를 모두 포함해도 됩니다.

 

$ passwd

Changing password for hjh

(current) UNIX password:

New UNIX password:

 

 

pine

메일을 주고 받을 수 있는 명령입니다.

 

$ pine

 

 

 PINE 4.10   MAIN MENU                            Folder: INBOX  19 Messages

           ?     HELP               -  Get help using Pine

           C     COMPOSE MESSAGE    -  Compose and send a message

           I     MESSAGE INDEX      -  View messages in current folder

           L     FOLDER LIST        -  Select a folder to view

           A     ADDRESS BOOK       -  Update address book

           S     SETUP              -  Configure Pine Options

           Q     QUIT               -  Leave the Pine program

     Copyright 1989-1999.  PINE is a trademark of the University of Washington.

                    [Folder "INBOX" opened with 19 messages]

? Help                     P PrevCmd                 R RelNotes

----------------

O OTHER CMDS > [ListFldrs] N NextCmd                 K KBLock

 


위와 같이 main창이 뜨면 선택해서 사용할 수 있습니다.

 

ping

ping(packet internet gopher)은 자신의 네트워크나 다른 네트워크가 통신이 잘되고 있는지 점검을 합니다.

형식 : ping hostname
 

 

 

 ps

프로세서에 관한 리스트를 보여줍니다.

 

 

 

 pwd

print working directory, 현재 작업 Directory를 출력한다.

 

 

 

q

Q

quit

대화식 모드에서 lpc를 떠납니다.

 

 

 

 

R

 rm

remove, 파일을 제거한다. 리눅스에서는 한번 지운 파일은 다시 복구할 수 없다.

    rm [options] file(s)

사용 가능한 옵션은 다음과 같다.

    -f 쓸수 없는 파일이라도 물어보지 않고 강제로 지운다.

    -i 각 파일에 대하여 지울 것인지 물어 온다.

    -r 서브디렉토리를 포함한 모든 내용을 재귀적으로 지운다.

    -v 지워지는 파일명을 출력한다.                                                                            

 

 

rmdir

remove directory, 디렉토리를 지운다. 만약 디렉토리가 비어있지 않으면 지울 수 없다.

 

 

 

 

S

 

 

 sh

원래의 unix명령인 본 셸을 불러내는 명령어 입니다.

 

 

su

사용중에 다른 ID로 재접속하는 명령어입니다.

형식 : su 사용자ID (그냥 su만 입력하면 root로 재접속하겠다는 뜻입니다.)

 

 

 

                            swapon
스왑 공간 사용하기

스왑 공간을 초기화하는 데는 swapon 명령을 사용한다. 이 명령은 커널에게 해당 공간을 스왑으로 사용할 수 있다는 점을 알려준다. 이 명령에게는 추가하고자 하는 스왑 공간의 경로를 인수로 전달해 주어야 한다. 임시 스왑 파일을 스왑 공간에 추가하고자 한다면 다음과 같이 한다.

$ swapon /extra-swap
$

스왑 공간들은 /etc/fstab 파일에 의해서 자동적으로 사용될 수도 있다.

/dev/hda8        none        swap        sw     0     0
/swapfile none swap sw 0 0

시스템이 시작될 때, 스크립트를 통해서 swapon -a 명령이 실행되는데 이 명령은 /etc/fstab에 나열되어 있는 스왑 공간들을 모두 사용하게 해 준다. 그래서 흔히 swapon 명령은 추가적인 스왑이 필요할 때만 사용되는 것이 보통이다.

free 명령을 쓰면 스왑의 사용 상황을 모니터 할 수 있다. 이것은 현재 얼마나 많은 용량의 스왑이 사용되고 있는지 알려준다.

$ free
total used free shared buffers
Mem: 15152 14896 256 12404 2528
-/+ buffers: 12368 2784
Swap: 32452 6684 25768

$

여기서 Mem: 이라고 쓰여진 첫째줄은 실제 물리적 메모리의 상황을 보여주는 것이다.커널은 물리적 메모리를 약 1 megabyte 정도 사용하는데, total이라고 쓰여진 세로줄에서 보여주는 전체메모리 양에는 이 커널이 차지하는 공간이 빠져 있다. used라는 세로줄은 현재 사용중인 메모리 양을 보여주고 있으며(두번째 가로줄은 버퍼 로 사용되는 부분을 제외하고 계산한 양이다), free란 세로줄에서는 전혀 사용되지 않은 양을 보여주고 있다. 또한 shared란 부분은 프로세스간에 공유되고 있는 메모리를 나타내고 있는 것이므로, 그 양이 많은 것은 기쁜 일이다. buffers는 현재 디스크 버퍼 캐쉬로 사용되는 메모리 양을 보여주고 있다.

마지막 줄인 Swap:은 위와 같은 항목을 스왑 공간에 똑같이 적용시킨 내용이다. 이 항목이 모두 제로라면, 스왑 공간이 아예 동작하고 있지 않다는 뜻이다.

같은 정보를 top 명령이나 /proc/meminfo 파일을 통해 얻을 수 있다. 그러나 어느 경우든, 특정한 스왑 공간에 대한 정보를 얻는 것은 좀 어렵다.

스왑 공간은 swapoff 명령으로 기능을 멎게 할 수 있다. 그러나 임시로 잡은 스왑 공간이 아니라면, 스왑을 끌 필요는 없다. 만약 스왑을 끄게되면, 스왑 공간에 들어있던 메모리 페이지들이 먼저 실제 메모리로 들어가야 되는데, 실제 메모리에 여유가 없는 경우에는 또 다른 스왑 공간으로 방출되게 된다. 그런데 이 메모리 페이지들을 모두 수용하기에 가상메모리마저도 부족하다면, 그때부터는 리눅스 시스템이 무진장 버벅대기 시작할 것이다. 시간이 아주 많이 걸린 후에는 좀 잠잠해지겠지만, 여전히 시스템은 사용불능 상태에 있게 된다. 따라서 스왑을 끄기 전에, 충분한 여유 메모리가 있는지 꼭 확인해 보아야만 한다(free 같은 것으로).

swapon -a 명령으로 자동적으로 사용되는 스왑 공간들은, 마찬가지로 swapoff -a 명령을 써서 끌 수 있다. 이것도 역시 /etc/fstab 파일에 나열되어 있는 스왑 공간만을 끄기 때문에, 나머지 수동으로 추가시킨 스왑들은 영향을 받지 않는다.

때 때로, 실제 메모리가 많이 비어 있는데도 불구하고 스왑을 아주 많이 쓰고 있는 경우를 보게 될 수가 있다. 보통 이런 일이 발생하는 경우는 이렇다. 어떤 덩치 큰 프로세스가 실제 메모리를 많이 점유하는 바람에 시스템이 스왑을 많이 사용하게 되었다고 하자. 이 프로세스가 종료되면 실제 메모리엔 여유 공간이 많이 남게 되지만, 스왑으로 한번 내려간 데이터는 그것이 당장 필요하지 않는 한 실제 메모리로 불려지지 않는다. 따라서 스왑 영역을 많이 사용하면서도 실제 메모리가 많이 비어있는 현상이 꽤 오래 지속될 수 있는 것이다. 그러므로 이런 현상에 특별히 신경쓸 필요는 없다. 하지만, 최소한 그 원리는 이해하고 있어야 나중에 불안하지 않을 것이다.

 


 

 

T

tar

사용법: tar [옵션]... [파일]...

 

주요 동작 모드 :

  -t, --list              아카이브의 내용물을 출력합니다

  -x, --extract, --get    아카이브에서 파일을 추출합니다

  -c, --create            새로운 아카이브를 만듭니다

  -d, --diff, --compare   아카이브와 파일 시스템간의 차이점을 비교합니다

  -r, --append            아카이브 끝에 파일을 추가합니다

  -u, --update            아카이브 안의 것보다 새로운 파일만 추가합니다

  -A, --catenate          아카이브에 tar 파일을 추가합니다

      --concatenate       -A와 같음

      --delete            아카이브로부터 제거합니다 (자기 테이프에선 안됨!)

 

동작 변경자:

  -W, --verify               아카이브를 기록한 다음 검증하도록 합니다

      --remove-files         아카이브에 파일을 추가한 다음 지웁니다

  -k, --keep-old-files       추출할 때 이미 존재하는 파일을 덮어쓰지 않습니다

:

 -U, --unlink-first         추출하기에 앞서 대상 파일을 지웁니다

      --recursive-unlink     디렉토리를 추출하기에 앞서 그 체계를 비웁니다

  -S, --sparse               스파스 파일을 효율적으로 처리합니다

  -O, --to-stdout            표준 출력으로 파일을 추출합니다

  -G, --incremental          오래된 GNU 형식의 점진적 백업 파일을 처리합니다

  -g, --listed-incremental   새로운 GNU 형식의 점진적 백업 파일을 처리합니다

      --ignore-failed-read   읽을 수 없는 파일에 대해 영 아닌 값으로 종료하지

                             않습니다

 장치 선택과 전환:

  -f, --file=ARCHIVE             아카이브 파일 또는 ARCHIVE 장치를 사용합니다

      --force-local              이름에 콜론이 있는 아카이브 파일도 지역 파일로

                                 인식합니다

      --rsh-command=COMMAND      rsh 대신 원격 COMMAND를 사용합니다

  -[0-7][lmh]                    드라이브와 기록 밀도를 지정합니다

  -M, --multi-volume             다중 볼륨 아카이브를 생성/출력/추출합니다

  -L, --tape-length=NUM          NUM x 1024 바이트를 쓴 뒤에 테이프를 바꿉니다

  -F, --info-script=FILE         각 테이프의 끝에서 스크립트를 실행합니다

                                 (-M을 포함함)

      --new-volume-script=FILE   -F FILE과 같음

      --volno-file=FILE          FILE 안에 있는 볼륨 번호를 사용/갱신합니다

 

장치 블럭 설정:

  -b, --blocking-factor=BLOCK    레코드당 BLOCK x 512 바이트

      --record-size=SIZE         레코드당 SIZE 바이트, 512의 배수

  -i, --ignore-zeros             아카이브에서 영으로 된 블럭을 무시합니다

                                 (EOF를 의미함)

  -B, --read-full-records        읽은 것을 재블럭화합니다 (4.2BSD 파이프용으로)

정보 출력에 관한 옵션:

      --help            이 도움말을 인쇄하고 끝냅니다

      --version         tar 프로그램의 버전 번호를 인쇄하고 끝냅니다

  -v, --verbose         처리되는 파일을 순서대로 출력합니다

      --checkpoint      아카이브를 읽을 동안 디렉토리 이름을 인쇄합니다

      --totals          아카이브를 만들 동안 쓰여진 총 바이트 수를 인쇄합니다

  -R, --block-number    각 메시지마다 아카이브내의 블럭 번호를 표시합니다

  -w, --interactive     모든 행동에 대해 확인을 요구합니다

      --confirm!ation    -w와 같음

 

  -s, --same-order             sort names to extract to match archive

      --preserve-order         same as -s

      --preserve               same as both -p and -s

  -z, --gzip, --ungzip               filter the archive through gzip

  -Z, --compress, --uncompress       filter the archive through compress

      --use-compress-program=PROG    filter through PROG (must accept -d)

 

ex) 디렉토리 SSS를 homepage.tar로 압축합니다.

$ tar cvf homepage.tar /SSS

SSS/            

 

권한 시간까지 출력합니다.

$ tar tvf homepage.tar

drwxr-xr-x hjh/linux         0 2000-10-07 17:11:51 SSS/

 

/etc 디렉토리를 aaa란 파일로 압축시킵니다.

$ tar -zcvf aaa /etc

 

압축된 aaa란 파일을 /etc디렉토리에 압축을 풉니다.

$ tar -zxvf aaa /etc

 

aaa bbb ccc 파일을 zzz 파일로 압축시킵니다.

$ tar -zcvf zzz aaa bbb ccc

 

 

tail

파일의 마지막 n개의 내용을 보고자할 때 사용하는 명령입니다.

 

ex)

$ tail .bash_history       

sdm

kdm

swapon

free

dmesg

dmesg |less

fsck

adduser

groupadd

exit..........

 

 

touch

touch [OPTION]... FILE...

  or : touch [-acm] MMDDhhmm[YY] FILE... (obsolescent)

Update the access and modification times of each FILE to the current time.

 

  -a                     change only the access time

  -c                     do not create any files

  -d, --date=STRING      parse STRING and use it instead of current time

  -f                     (ignored)

  -m                     change only the modification time

  -r, --reference=FILE   use this file's times instead of current time

  -t STAMP               use [[CC]YY]MMDDhhmm[.ss] instead of current time

      --time=WORD        access -a, atime -a, mtime -m, modify -m, use -a

      --help             display this help and exit

      --version          output version information and exit

 

STAMP may be used without -t if none of -drt, nor --, are used.

Note that the three time-date formats recognized for the -d and -t options

and for the obsolescent argument are all different.

 

 

 

 

U

 

umount

umount를 umount되어지는 파일 시스템에서 실행을 시키면 아직 그 파일 시스템은 사용중(busy)이게 되므로 언마운트시 에러가 발생하게 된다. 언마운트는 꼭 그 파일 시스템을 벗어나서 실행시켜야 한다.

unmount를 할 때는 단순히

    umount directory_name 또는 umount device_name

을 써주면 되고

    umount -a

라고 쓰면 현재 마운트 되어 있는 디스크장치들 중에서 /etc/fstab에 있는 모든 장치를 unmount한다. 그리고, 마운트된 디스크 장치들과 디렉토리의 리스트는 /etc/mtab에 저장되어 있다.

예를 들어, disk를 /zip라는 directory에 mount를 할려면 이런식으로 해야만 한다.

mkdir /zip

mount -t msdos /dev/sda4 /zip

이제 여러분들의 disk는 /zip에 마운트되어 보일 것이다. disk가 mount 되어 있는 동안에 여러분들은 그것을 제거하려 해서는 안된다. 여러분들이 disk를 가지고 작업이 끝났을 경우 그것을 umount 시키고 release 시켜 계층적인 directory로 부터 분리시키면 된다.

umount /zip

일단 여러분들이 mount되는 directory /zip를 만들고 나면 여러분들은 다시 이것을 할 필요는 없으며 후에 다시 어디선가 mount를 시키면 된다.

 

 

 

uptime

서버 부팅시간과 현재시간이 출력됩니다.

 

$ uptime

  5:33pm  up 5 days,  5:39,  4 users,  load average: 0.52, 0.58, 0.52

 

 

V

 vi

vi 에디터

유닉스 계열의 운영체제에서 가장 널리 쓰이는 에디터입니다.

vi 명령어 요약

 

1.시작

vi file

vi를 시작하여 지정한 파일 편집

vi -R file

읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집

view file

읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집


2.종료

:wq

데이터를 저장하고 종료

:q!

데이터를 저장하지 않고 종료


3. 시스템이 다운된 후에 되살리기

vi -r

되살릴 수 있는 모든 파일 이름 보여주기

vi -r file

vi를 시작하여 지정한 파일 되살리기


4. 디스플레이 제어하기

^L

현재 화면을 다시 디스플레이하기

:set number

내부 줄 번호 디스플레이

:set nonumber

배부 줄 번호 디스플레이 않기


5. 마지막으로 지운 것 복사하기

p

마지막으로 지워진 것을 커서의 뒤/아래에 삽입

P

마지막으로 지워진 것을 커서의 앞/위에 삽입

xp

두 문자를 바꿈

deep

두 단어를 바꿈

ddp

두 줄을 바꿈


6. 패턴 검색

/rexp

지정된 정규 표현식에 대해 앞으로 이동

/

이전의 패턴에 대해 앞으로 검색을 반복

?rexp

지정된 정규 표현식에 대해 뒤로 이동

?

이전의 패턴에 대해 뒤로 검색을 반복

n

/나 ?명령에 대해 같은 방향으로 반복

N

/나 ?명령에 대해 반대 방향으로 반복


7. 약어의 사용

:ab short long

short를 long에 대한 약어로 변경

:ab

현재 약어 목록을 표시

:una short

약어 short를 표시


8. 줄 길이의 조정

r

문자를 뉴라인으로 변경

J

줄의 결합

:set wm=n

오른쪽으로 n문자 위치에서 자동적으로 줄 나눔


9. 커서 이동

h

커서를 한 칸 왼쪽으로 이동

j

커서를 한 줄 아래로 이동

k

커서를 한 줄 위로 이동

l

커서를 한 칸 오른쪽으로 이동


커서를 한 칸 왼쪽으로 이동


커서를 한 칸 오른쪽으로 이동

-

커서를 이전 줄의 처음으로 이동

+

커서를 다음 줄의 처음으로 이동


커서를 다음 줄의 처음으로 이동

0

커서를 현재 줄의 맨 앞으로 이동

$

커서를 현재 줄의 맨 끝으로 이동

^

커서를 현재 줄의 첫글자(공백이나 탭이 아닌)로 이동

w

커서를 다음 단어의 첫 글자로 이동

e

커서를 다음 단어의 끝 글자로 이동

b

커서를 이전 단어의 첫 글자로 이동

W

w와 같음(문장 부호 무시)

E

e와 같음(문장 부호 무시)

B

b와 같음(문장 부호 무시)

(

다음 문장의 처음으로 이동

)

이전 문장의 처음으로 이동

{

다음 문단의 처음으로 이동

}

이전 문단의 처음으로 이동

H

커서를 화면 맨 위로 이동

M

커서를 중간으로 이동

L

커서를 맨 아래로 이동


10. 편집 버퍼를 통한 이동

^F

한 화면 아래로 이동

^B

한 화면 위로 이동

n^F

n화면 아래로 이동

n^B

n화면 위로 이동

^D

반 화면 아래로 이동

^U

반 화면 위로 이동

n^D

n줄만큼 아래로 이동

n^U

n줄만큼 위로 이동


11. 셸 명령 실행

:!command

vi를 중단하고 지정한 셸 명령을 실행

:!!

vi를 중단하고 이전의 셸 명령을 실행

:sh

vi를 중단하고 셸을 실행

:!csh

vi를 중단하고 새로운 C-셸을 실행


12. 패턴에 의한 치환

:s/pattern/replace/

현재 줄의 치환

:lines/pattern/replace/

지정한 줄의 치환

:line,lines/pattern/replace/

지정한 범위의 치환

:%s/pattern/replace/

모든 줄의 치환


13. 데이터 읽기

:liner file

file의 내용을 지정한 줄 다음에 삽입

:r file

file의 내용을 현재의 줄 다음에 삽입

:liner !command

command의 결과를 지정한 줄 다음에 삽입

:r !command

command의 결과를 현재의 줄 다음에 삽입

:r !look pattern

지정한 pattern으로 시작된 단어 삽입


14. 정규 표현식을 사용하기 위한 특수 기호

.

뉴라인을 제외한 모든 단일 문자와 대응

*

영 또는 그 이상의 선행 문자와 대응

^

줄의 시작과 대응

$

줄의 끝과 대응

\<

단어의 시작과 대응

\>

단어의 끝과 대응

[ ]

묶여진 문자중의 하나와 대응

[^ ]

묶여진 문자를 제외한 아무것하고나 대응

\

이어지는 기호를 문자 그대로 해석


15. 줄 번호

nG

줄번호 n으로 건너뛰기

1G

편집 버퍼의 첫 줄로 건너뛰기

G

편집 버퍼의 마지막 줄로 건너뛰기

:map g lG

g가 lG와 같도록 매크로 정의


16. 삽입

i

입력 모드로 전환, 커서 위치 앞에서 삽입

a

입력 모드로 전환, 커서 위치 뒤에서 삽입

I

입력 모드로 전환, 현재 줄의 앞에 삽입

A

입력 모드로 전환, 현재 줄의 끝에 삽입

o

입력 모드로 전환, 현재 줄의 아래에 전개

O

입력 모드로 전환, 현재 줄의 위에 전개


17. 편집하고 있는 파일을 바꾸기

:e file

지정한 파일의 편집

:e! file

지정한 파일의 편집, 자동 점검의 생략


18. 내용 고치기

r

단지 한 글자만 변경(입력 모드로 바뀌지 않음)

R

입력하는 대로 겹쳐 써서 변경

s

삽입에 의해 한 단어의 변경

C

커서의 위치로부터 줄 끝까지 삽입에 의한 변경

cc

전체 줄을 삽입에 의한 변경

S

전체 줄을 삽입에 의한 변경

cmove

커서부터 move까지 삽입에 의해 변경

~

대,소문자 바꾸기


19. 고치기의 취소 또는 반복

u

편집 버퍼를 수정했던 마지막 명령을 취소

U

현재 줄을 저장

.

편집 버퍼를 수정했던 마지막 명령 반복


20. 문자 삭제

x

커서가 있는 문자 삭제

X

커서의 왼쪽 문자 삭제

D

커서부터 줄의 끝까지 삭제

dd

현재 줄의 전체 삭제

dmove

커서부터 move까지 삭제

dG

커서부터 편집 버퍼의 끝까지 삭제

d1G

커서부터 편집 버퍼의 맨 앞까지 삭제

:lined

지정한 줄의 삭제

:linelined

지정한 범위의 삭제


21. 여러 줄의 복사와 이동

:linecotarget

지정한 줄을 복사하여 target 줄 밑에 삽입

:linelinecotarget

지정한 범위를 복사하여 target 줄 밑에 삽입

:linemtarget

지정한 줄로 이동하여 target 줄 밑에 삽입

:line, linemtarget

지정한 범위로 이동하여target 줄 밑에 삽입


22. 데이터를 처리하기 위한 셸 명령의 사용

n!!command

n번 줄에서 command의 실행

!move command

커서부터 move까지 command 실행

!move fmt

커서부터 move까지 줄들을 형식 맞추기


23. 데이터 저장하기

:w

원래의 파일로 데이터를 저장

:w file

지정한 파일로 데이터를 저장

:w>> file

지정한 파일에 데이터를 추가

 

 

W

w

현재 로그인한 사용자가 무엇을 하고 있는지 보여줍니다.
uptime의 정보가 헤더로 쓰입니다.
JCPU는 사용자가 사용한 CPU시간을 PCPU는 현재 작업에 쓰이는 CPU 사용 시간을 보여줍니다.

$ w

  4:36pm  up 5 days,  4:42,  4 users,  load average: 0.89, 0.41, 0.35

USER   TTY   FROM       LOGIN@   IDLE   JCPU   PCPU  WHAT

root     tty1     -                Fri 5pm 23:00m 25.77s  0.03s  startx

root     ttyp0    :0.0             Fri 5pm 22:39m  2:26m  2:26m  xlock

root     ttyp1    :0.0             Fri 5pm 22:39m  0.40s  0.22s  ztelnet

hjh      pts/0    linux5            4:17pm  0.00s  0.46s  0.06s  w

 

 

wc

Word Count, 명시된 파일 또는 표준 입력 안의 행, 단어, 문자의 수를 나타냅니다.

형식 :   wc [options] [file(s)]

옵션 :

    -l 행(line)수만 출력합니다.

    -c 문자(character)수만 출력합니다.

    -w 단어(word)수만 출력합니다.

 

ex)

파일속에 들어있는 단어의 수만을 보고자할 때 사용하는 명령입니다.

$ wc -w .bash_history

   2044 .bash_history

 

파일속에 들어있는 문자의 수만을 보고자할 때 사용하는 명령입니다.

$ wc -c .bash_history      

  10703 .bash_history

 

 

whereis

$PATH로 지정된 경로에서 찾아 전체 경로명을 보여준다.

ex)

$ whereis cat

cat: /bin/cat /usr/man/man1/cat.1

 

 

who

who 명령의 목적은 시스템에 로그인된 사람을 찾는 것입니다.

현재 로그인된 사용자들의 로그인 이름, 터미널 회선 및 로그인 시간을 나열합니다.

옵션  :  -u   현재 로그인된 사용자만을 나열합니다.

           -H   각 열 위에 헤더를 표시합니다.

 

$ who

root     tty1     Oct  6 17:34

root     ttyp0    Oct  6 17:36

root     ttyp1    Oct  6 17:36

hjh      pts/0    Oct  7 16:17

 

 

whoami

사용자의 ID를 출력합니다.

$ whoami

hjh

 

 

X

 

 

xdm

xdm는 X-Windows상에서의 login screen을 보여준다. 어떤 system은 특정 level로 가도록 지정하면 xdm을 시동시킨다(/etc/inittab를 보도록).

리눅스 부팅 스크립트에 넣어두면 리눅스를 처음 부팅할 때부터 엑스윈도우로 부팅할 수 있다.

Shadow Suite가 설치되면 xdm도 update될 필요가 있다. 이는 매우 쉽다.

xdm.tar.gz는 ftp://sunsite.unc.edu/pub/Linux/X11/xutils/xdm.tar.gz에 있다.

xdm.tar.gz를 구한 다음, /usr/src에서 푼다:

tar -xzvf xdm.tar.gz

 

/usr/X11R6/lib/X11/config/linux.cf에서 다음 line을 고친다:

#define HasShadowPasswd    NO

를 다음처럼

#define HasShadowPasswd YES

 

그리고 나서 실행 file을 만들자:

cd /usr/src/xdm
xmkmf
make depend
make

 

모든 걸 제자리로...:

cp xdm /usr/X11R6/bin/

 

xdm은 root 권한으로 실행되기에 permission을 바꿀 필요는 없다.

 

 

 

 

 

 

 

Z

 zcat

파일을 압축된 양식으로 보존하지만 데이터를 다른 명령에 파이프하려는 경우 사용할 수 있는 명령입니다.  zcat은  cat 명령과 똑같이 작업하지만 입력으로 압축된 파일이 필요합니다.  zcat은 파일을 압축 해제한 후 표준 출력 디바이스에 프린트합니다.

예를 들어, namelist라는 파일에 저장된 이름과 주소 목록을 압축한 경우, 압축된 파일의 이름은 namelist.gz입니다. 압축된 파일의 내용을 프로그램에 대한 입력으로 사용하려는 경우, 다음과 같이 zcat 명령을 사용하여 파이프라인을 시작할 수 있습니다.

 zcat namelist | program1 | program2 ...


'정리중' 카테고리의 다른 글

어셈블리 : 함수호출규약  (0) 2014.08.23
HTTP 응답코드 목록  (0) 2014.07.31
x86 Assembly  (0) 2014.07.25
x86 레지스터 목록  (0) 2014.07.23
ARM assembly 문법정리  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다

-

[어셈블리 스터디]


호출자와 피호출자간의 약속!

함수 호출 규약(Calling Convention)




함수 호출 규약(Calling Convention)이란 호출자(Caller)와 피호출자(Callee) 간에 '함수를 호출할 때 전달되는 인자의 순서나 사용이 끝나고 나서의 스택 정리 등'에 대한 약속이라고 할 수 있습니다. 크게 3가지가 있으며, 이 3가지는 각각 __cdecl, __stdcall, __fastcall 방식입니다. 오늘은 이 세가지 방식에 대해 알아보려고 합니다.


__cdecl 방식

__cdecl 방식은 C/C++ 함수에서 기본적으로 사용되는 호출 규약이며, 호출자가 스택을 정리합니다. 그리고 인자는 오른쪽에서 왼쪽으로 전달되며 호출자가 피호출자를 호출 시에 전달되는 인자의 개수를 알고있기 때문에 가변 인수 함수를 만들 수 있다는 장점을 지니고 있습니다. 우선 아래의 코드를 빌드하고 난 뒤의 바이너리를 디버거를 통해 살펴보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
int sum(int a, int b)
{
    return a + b;
}
 
int main(int argc, char* argv[])
{
    sum(5, 4);
    return 0;
}

위 코드에서는 5와 4를 sum 함수에 전달한 후에, sum 함수에서 전달된 값을 가지고 서로 더한 값을 반환하게 됩니다. main 함수의 어셈블리를 잠시 확인해보도록 합시다.

00401068  |. 6A 04          PUSH 4
0040106A  |. 6A 05          PUSH 5
0040106C  |. E8 94FFFFFF    CALL Consolas.00401005
00401071  |. 83C4 08        ADD ESP,8

위는 main 함수의 일부이며, 코드를 보시면 오른쪽에서 왼쪽으로 인자가 차례대로 스택에 올라가는 것을 볼 수 있으며, sum 함수(401005)를 호출하고 나서 아래를 보시면 ADD ESP, 8로 호출자(main 함수)에서 스택을 정리하는 것을 확인할 수 있습니다. 그리고 추가적으로 ADD ESP, 8과 PUSH문이 두번 쓰인것으로 봐서 4바이트를 차지하는 2개의 인자가 전달되었음을 확인할 수 있습니다. 이처럼, cdecl 방식은 호출자가 피호출자의 스택 프레임을 정리한다는 것을 알 수 있습니다.


__stdcall 방식 

__stdcall 방식은 Win32 API에서 사용되며, 피호출자가 스택을 정리합니다. 그리고 인자는 __cdecl 방식과 마찬가지로 오른쪽에서 왼쪽으로 전달되며 Win32 API에서는 가변 인수 함수가 없기 때문에, 매개변수의 개수가 고정적입니다. 이는 호출자에서 스택을 정리하는 것보다, 피호출자가 스택을 정리하는게 더욱 효율적입니다. 우선 아래의 코드를 빌드하고 난 뒤의 바이너리를 디버거를 통해 살펴보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
int __stdcall sum(int a, int b)
{
    return a + b;
}
 
int main(int argc, char* argv[])
{
    sum(5, 4);
    return 0;
}

위 예제는 제일 처음에 사용되었던 예제와 기능이 동일합니다. 단지 이번에는 __stdcall가 함수명 앞에 붙었을 뿐입니다. 한번 main 함수의 어셈블리를 확인해보도록 합시다.

00401068  |. 6A 04          PUSH 4
0040106A  |. 6A 05          PUSH 5
0040106C  |. E8 9EFFFFFF    CALL Consolas.0040100F

위는 main 함수의 일부이며, 코드를 보시면 오른쪽에서 왼쪽으로 인자가 차례대로 스택에 올라가는 것을 볼 수 있습니다. 그런데 이번에는 호출자가 아닌 피호출자에서 스택을 정리하는 것이기 때문에 호출자에 따로 스택을 정리하는 코드가 존재하지 않습니다. 피호출자를 살펴보아야 하죠.

00401020 >/> 55              PUSH EBP
00401021  |. 8BEC            MOV EBP,ESP
..
00401038  |. 8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
0040103B  |. 0345 0C         ADD EAX,DWORD PTR SS:[EBP+C]
..
00401041  |. 8BE5            MOV ESP,EBP
00401043  |. 5D              POP EBP
00401044  \. C2 0800         RETN 8

위에서 눈여겨보아야 할 부분이 함수의 마지막 부분인 401044입니다. 401044를 보시면 RETN 8 명령으로 sum 함수 내에서 스택을 정리함을 알 수 있습니다. 이렇게 반환이 끝나고 나서 ESP(스택 포인터)를 8만큼 증가시킵니다. 이처럼 __stdcall 방식은 __cdecl 방식과는 다르게 호출자에서 스택을 정리하지 않고, 피호출자에서 스택을 정리한다는 사실을 기억해두세요.


__fastcall 방식

__fastcall 방식은 이름부터가 정말 빨라보이지 않나요? 이 __fastcall 방식에선 스택이 아닌 가까운 레지스터를 사용함으로써 호출 속도가 빠르며 피호출자가 스택을 정리하나 스택을 사용하지 않고 레지스터를 이용하므로 정리할 내용이 없어 따로 정리를 하지 않습니다. 우선 아래의 코드를 빌드하고 난 뒤의 바이너리를 디버거를 통해 살펴보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
int __fastcall sum(int a, int b)
{
    return a + b;
}
 
int main(int argc, char* argv[])
{
    sum(5, 4);
    return 0;
}

위 예제는 제일 처음에 사용되었던 예제와 기능이 동일합니다. 단지 이번에는 __fastcall가 함수명 앞에 붙었을 뿐입니다. 한번 main 함수의 어셈블리를 확인해보도록 합시다.

00401068  |. BA 04000000     MOV EDX,4
0040106D  |. B9 05000000     MOV ECX,5
00401072  |. E8 98FFFFFF     CALL Consolas.0040100F

위는 main 함수의 일부이며, 코드를 보시면 EDX 레지스터와 ECX 레지스터를 사용하여 전달하고 있음을 알 수 있습니다. 이 __fastcall 방식을 사용하게 되면 앞에 두개의 매개변수는 ECX와 EDX 레지스터를 이용하지만, 나머지 매개변수는 위에서 설명드린 __cdecl 방식과 __stdcall 방식과 동일하게 오른쪽부터 왼쪽으로 인자가 스택에 올라갑니다. 우선 피호출자를 확인하여 어떻게 덧셈이 이루어지는지 살펴보도록 합시다.

00401020 >|> 55              PUSH EBP
00401021  |. 8BEC            MOV EBP,ESP
..
0040103A  |. 8955 F8         MOV DWORD PTR SS:[EBP-8],EDX
0040103D  |. 894D FC         MOV DWORD PTR SS:[EBP-4],ECX
00401040  |. 8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00401043  |. 0345 F8         ADD EAX,DWORD PTR SS:[EBP-8]
..
00401049  |. 8BE5            MOV ESP,EBP
0040104B  |. 5D              POP EBP
0040104C  \. C3              RETN

위의 코드에서는, EDX 레지스터의 값을 EBP-8에 넣고 ECX 레지스터의 값을 EBP-4에 넣습니다. 그리고 EBP-4의 값을 EAX 레지스터에 넣고, EAX 레지스터의 값과 EBP-8의 값을 서로 더한값이 EAX 레지스터에 들어갑니다. 이처럼 __fastcall 방식은 앞에 두개의 매개변수는 ECX와 EDX 레지스터를 이용하여 호출 속도가 빠른 방식입니다.

'정리중' 카테고리의 다른 글

리눅스 명령어 모음  (0) 2014.09.01
HTTP 응답코드 목록  (0) 2014.07.31
x86 Assembly  (0) 2014.07.25
x86 레지스터 목록  (0) 2014.07.23
ARM assembly 문법정리  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다

-


Status Code

Associated Message

Meaning

100

Continue

클라이언트로부터 일부 요청을 받았으니 나머지 요청 정보를 계속 보내 주시오. (HTTP 1.1에서 처음 등장)

101

Switching Protocols

서버는 클라이언트의 요청대로 Upgrade 헤더를 따라 다른 프로토콜로 바꿀 것임. (HTTP 1.1에서 처음 등
장)    

200

OK

모든 것이 정상적임. GET이나 POST 요청 뒤에 문서가 온다. 이것은 서블릿의 기본 상태다. setStatus를 사용하지 않으면 
이 상태코드를 얻게 된다.

201

Created

서버에서 문서를 만들었음. Location 헤더는 그 URL을 가리킨다.    

202

Accepted

요청이 수행되었지만 처리는 끝나지 않았음.

203

Non-Authoritative Information

문서는 정상적으로 반환되었지만 복사본이 사용되었으므로 응답 헤더중 일부가 정확하지 않을 수
도 있음. (HTTP 1.1에서 처음 등장)

204

No Content

새 문서 없음. 브라우저는 이전 문서를 계속 보여줘야 한다. 이것은 사용자가 페이지를 주기적으로 리로드를 하던 
중 이전 페이지가 이미 만료되었을 때 사용할 수 있다. 하지만 Refresh 응답 헤더나 <META HTTP-EQUIV="Refresh" ...> 같은 헤더를 사용
해서 페이지를 자동으로 리로드 시켰을 때는 동작하지 않는다. 왜냐하면 이 상태 코드를 반환하면 추후의 리로딩이 멈추기 때문이다. 하지
만 자바 스크립트로 리로드하게 해 주는 것은 작동한다.

205

Reset Content

새 문서 없음. 하지만 브라우저는 문서 창을 리셋해야 한다. 브라우저가 CGI 폼 필드를 전부 지우도록 할 때 사용
된다. (HTTP 1.1에서 처음 등장)

206

Partial Content

클라이언트가 Range 헤더와 함께 요청의 일부분을 보냈고 서버는 이를 수행했음. (HTTP 1.1에서 처음 등장)

300

Multiple Choices

요청된 문서가 여러 군데서 발견되었음. 이 때 서버는 해당하는 모든 문서들을 나열할 것이다. 만약 서버가 
선호하는 선택이 있으면 Location 응답 헤더에 나열해야 한다.

301

Moved Permanently

요청된 문서는 어딘가에 있고 그 문서에 대한 URL은 Location 응답 헤더에 주어졌음. 브라우저는 자동적
으로 새 URL의 링크를 따라가야 한다.

302

Found

301과 비슷하지만 새 URL은 임시 저장 장소로 해석된다. 이 메시지는 HTTP 1.0에서는 ‘Moved Temporarily’였다. 그리고 
HttpServletResponse의 상수는 SC_FOUND가 아니라 SC_MOVED_TEMPORARILY다. 이것은 매우 유용한 헤더인데 이 헤더를 통해 브라
우저가 자동적으로 새 URL의 링크를 따라가기 때문이다. 이 상태 코드는 아주 유용하기 때문에 이 상태 코드를 위해 sendRedirect 라는 
특별한 메소드가 있다.  response.sendRedirect(url)을 사용하는 것은 response.setStatus(response.SC_MOVED_TEMPORARILY)과 
response.setHeader("Location", url)를 쓰는 것에 비해 몇 가지 장점이 있다. 첫째, 더 쉽게 사용할 수 있다. 둘째, sendRedirect을 써서 
서블릿이 그 링크를 포함한 페이지를 자동으로 만들어 준다(자동으로 redirect를 따라갈 수 없는 오래 된 브라우저에서도 볼 수 있게 해 준
다). 마지막으로, sendRedirect에서는 상대 URL이 절대 URL로 해석되기 때문에 상대 URL도 다룰 수 있다.  이 상태 코드는 종종 301번과 
혼용된다. 예를 들어 <http://host/~user(> (맨 마지막에 ‘/’이 빠짐)과 같이 오류가 있는 요청에 대해 어떤 서버는 301을 어떤 서버는 302
를 보낸다.  기술적으로 브라우저는 원 요청이 GET이었다면 자동적으로 리다이렉션을 따라 가도록 되어 있다. 더 자세한 사항은 307 헤더
를 보라.      

303

See Other

301/302과 같지만 원래 요청이 POST였을 경우 리다이렉트 되는 문서(Location 헤더에 주어졌다) GET을 통해 받아
야 한다. (HTTP 1.1에서 처음 등장)

304

Not Modified

클라이언트의 캐시에 이 문서가 저장되었고 선택적인 요청에 의해 수행됨(보통 지정된 날짜보다 더 나중의 문서만
을 보여주도록 하는 If-Modified-Since 헤더의 경우). 서버는 클라이언트에게 캐시에 저장된 이전 문서를 계속 사용해야 한다고 말할 것이
다.

305

Use Proxy

요청된 문서는 Location 헤더에 나열된 프록시를 통해 추출되어야 함. (HTTP 1.1에서 처음 등장)

307

Temporary Redirect

Temporary Redirect      이것은 302 ("Found" 또는 "Temporarily Moved")와 같다. 많은 브라우저에서 메시지가 POST일 때 원래는 303 응답의 POST 요청의 리다이렉션을 따라 가야 함에도 불구하고 302의 응답을 따르기 때문에 HTTP 1.1에서 추가되었다. 303 응답은 모호하지 않도록 의도되었다. 303 응답의 경우에 대해서는 리다이렉트 된 GET과 POST 요청을 따르고 307 응답의 경우에는 GET  요청만 따른다. 몇 가지 이유로 HttpServletResponse에는 이 상태코드에 해당하는 상수가 없다. (HTTP 1.1에서 처음 등장)  

400

Bad Request

요청에 문법적으로 잘못된 부분이 있음.

401

Unauthorized

클라이언트가 올바른 허가를 받지 않고 허가가 필요한 페이지에 접근하려 함. 여기에 대한 응답으로 브라우저가 대화창을 열어 사용자 이름과 암호를 받아들이도록 하는 WWW-Authenticate 헤더를 포함해야 한다.    

403

Forbidden

사용 권한에 관계없이 내용을 볼 수 없음. 종종 파일 이름이 잘못되었거나 서버의 디렉터리 퍼미션이 잘못 되었을 때 나온다.  

404

Not Found

이 주소에서는 어떤 내용도 발견할 수 없음. 이것은 표준 ‘no such page’응답이다. 이 상태 코드는 아주 일반적인 응답이다. 그래서 이 상태코드를 위한 HttpServletResponse:sendError(message)라는 특별한 메소드가 있다. sendError는 serStatus에 비해 에러 메시지를 보여주는 에러 페이지를 자동적으로 만들어 준다는 장점이 있다.

405

Method Not Allowed

요청 메소드(GET, POST, HEAD, DELETE, PUT, TRACE 등) 를 특정 자원에 대해서는 쓸 수 없음. (HTTP 1.1에서 새로 등장)

406

Not Acceptable

지정된 자원이 클라이언트의 Accept 헤더에 명시된 것과 호환 되지 않는 MIME content-type을 생성함. (HTTP 1.1에서 새로 등장)

407

Proxy Authentication Required

401과 비슷하지만 서버가 Proxy-Authenticate 헤더를 반환해야 한다. (HTTP 1.1에서 새로 등장)

408

Request Timeout

클라이언트가 요청을 보내는 데 너무 오랜 시간이 걸림.(HTTP 1.1에서 새로 등장)

409

Conflict

보통 PUT 요청과 관계 있다. 보통 틀린 버전의 파일을 업로드할 경우 발생한다. (HTTP 1.1에서 새로 등장)

410

Gone

문서가 사라졌고 포워딩할 주소도 없음. 404와 다른 점은 이 경우 문서가 완전히 사라졌다는 것을 서버가 안다는 점이다. 
404는 어떤 이유인지는 모르는데 단지 요청한 것을 사용할 수 없다는 것을 의미한다. (HTTP 1.1에서 새로 등장)

411

Length Required

클라이언트가 Content-Length를 보내지 않으면 서버가 처리할 수 없음.(HTTP 1.1에서 새로 등장)

412

Precondition Failed

요청 헤더에 설정되어 있는 어떤 조건이 맞지 않음. (HTTP 1.1에서 새로 등장)

413

Request Entity Too Large

요청된 문서가 현재 서버가 다룰 수 있는 크기보다 큼. 만약 서버에서 나중에 다룰 수 있다고 생각
되면 Retry-After 헤더를 포함시켜야 한다. (HTTP 1.1에서 새로 등장)

414

Request URI Too Long

URI가 너무 길다. (HTTP 1.1에서 새로 등장)

415

Unsupported Media Type

요청이 알려지지 않은 형태임(HTTP 1.1에서 새로 등장)    

416

Requested Range Not Satisfiable

클라이언트가 요청에 적당하지 않은 Range 헤더를 포함시켰음 (HTTP 1.1에서 새로 등장)

417

Expectation Failed

Expect 요청 헤더의 값이 맞지 않음. (HTTP 1.1에서 새로 등장)    

500

Internal Server Error

일반적인 ‘server is confused’ 메시지. 종종 CGI 프로그램이나 서블릿의 결과가 잘못되거나 적절하지 않은 
헤더를 만들었을 때 발생한다.    

501

Not Implemented

요청한 것을 서버에서 지원하지 않음. 예를 들면 클라이언트가 서버에서 지원하지 않는 PUT과 같은 명령을 
내렸을 때 발생한다.         

502

Bad Gateway

프록시나 게이트웨이의 역할을 하는 서버에서 볼 수 있다. 초기 서버가 원격 서버로부터 부적절한 응답을 받았음
을 나타낸다.  

503

Service Unavailable

처리할 수 있는 한계를 벗어나 과도하게 요청이 들어와서 서버가 응답할 수 없음. 예를 들면 스레드나 데이
터베이스 연결이 가득 차 있을 때 서블릿에서 이런 헤더를 반환한다. 서버는 Retry-After 헤더를 낼 수 있다.

504

Gateway Timeout

프록시나 게이트웨이의 역할을 하는 서버에서 볼 수 있다. 초기 서버가 원격 서버로부터 응답을 받을 수 없
음을 나타낸다. (HTTP 1.1에서 새로 등장)

505

HTTP Version Not Supported

서버가 요청 라인에 지정된 HTTP 버전을 지원하지 않음. (HTTP 1.1에서 새로 등장)


'정리중' 카테고리의 다른 글

리눅스 명령어 모음  (0) 2014.09.01
어셈블리 : 함수호출규약  (0) 2014.08.23
x86 Assembly  (0) 2014.07.25
x86 레지스터 목록  (0) 2014.07.23
ARM assembly 문법정리  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다

-


어셈블리 명령어
 
INC(Increase)
피연산자에 1을 더한다.
연산 결과에 따라 ZF(Zero Flag)나 OF(Overflow Flag)가 세트될 수 있다.
    INC reg
    INC mem
위의 표기(reg, mem)는 피연산자가 레지스터나 메모리가 될 수 있다는 의미이다.
 
 
DEC(Decrease)
피연산자에 1을 빼는 명령이다.
션산 결과에 따라 ZF나 OF가 세트될 수 있다.
    DEC reg
    DEC mem
 
 
ADD(add)
Destination에 Source의 값을 더해서 Destination에 저장하는 명령이다.
연산 결과에 따라서 ZF, OF, CF가 세트될 수 있다.
    ADD destination, Source
    ADD reg, reg
    ADD reg, imm
    ADD mem, reg
    ADD mem, imm
    ADD reg, mem
 
    ADD eax, 123
위 명령은 eax 레지스터에 123을 더해서 eax 레지스터에 저장한다.
 
 
SUB(Subtract)
Destination에 Source의 값을 빼서 Destination에 저장하는 명령이다.
연산결과에 따라서 ZF, OF, CF가 세트될 수 있다.
    SUB destination, Source
    SUB reg, reg
    SUB reg, imm
    SUB mem, reg
    SUB mem, imm
    SUB reg, mem
 
    SUB eax, 123
위 명령은 eax 레지스터에 123을 빼해서 eax 레지스터에 저장한다.
 
 
MUL(Unsigned Integer Multiply)
부호 없는 al, ax, eax의 값을 피연산자와 곱한다. 피연산자가 8비트이면 al과 곱해서 ax에 저장되고 16비트이면 ax와 곱하고 dx:ax에 저장된다.
    MUL reg
    MUL mem
결과에 따라 OF, ZF 플래그가 세트될 수 있다.
 
 
IMUL(Integer Multiplication)
부호 있는 al, ax, eax의 값을 피연산자와 곱한다. 결과에 따라 CF, OF가 세트될 수 있다.
    IMUL r/m8
    IMUL r/m16
    IMUL r/m32
단일 피 연산자이고 피연산자를 al, ax, eax에 곱한다.
    IMUL destination, value
    IMUL r16, r/m16        IMUL r16, imm8
    IMUL r32, r/m32       IMUL r32, imm8
    IMUL r16, imm16        IMUL r32, imm32
value를 al, ax, eax와 곱해서 destination에 저장한다.
    IMUL destination, value, value
    IMUL r16, r/m16, imm8           IMUL r16, r/m16, imm16
    IMUL r32, r/m32, imm8          IMUL r32, r/m32, imm32
value끼리 곱해서 destination에 저장한다.
연산결과가 destination 레지스터의 크기보다 크다면 OF, CF가 세트된다.
 
 
DIV(Unsigned Integer Divide)
8, 16, 32비트 부호 없는 정수의 나눗셈을 수행한다.
    DIV reg
    DIV mem
결과에 따라서 CF, OF, ZF가 세트될 수 있다.
 
 
MOV(Move)
Source에서 Destintion으로 데이터를 복사한다.
    MOV Destination, Source
    MOV reg, reg
    MOV reg, imm
    MOV mem, reg
    MOV mem, imm
    MOV reg, mem
 
 
MOVS(Move String)
Source에서 Destination으로 데이터를 복사한다.
    MOVS Destination, Source
 
 
MOVSB, MOVSW, MOVSD(Move String)
SI 또는 ESI 레지스터에 의해 지정된 메모리 주소의 내용을 DI 또는 EDI 레지스터에 의해 지정되는 메모리 주소로 복사한다.
 
MOVSB는 BYTE 단위로 복사, MOVSW는 WORD 단위로 복사, MOVSD는 DWORD 단위로 복사한다. 방향 플래그(DF)가 1로 세트되어 있으면 ESI와 EDI는 복사 시에 감소하게 되고 DF가 0으로 세트되어 있으면 ESI와 EDI는 복사 시에 증가하게 된다.
 
방향 플래그(DF)를 설정할 수 있는 명령어는 잠시 후에 살펴보자.
    MOVSB
    MOVSW
    MOVSD
 
 
MOVSX(Move with Sign-Extend)
BYTE나 WORD 크기의 피연산자를 WORD나 DWORD 크기로 확장하고 부호는 그대로 유지한다.
    MOVSX reg32, reg16            MOVSX reg32, mem16
    MOVSX reg16, reg8              MOVSX reg16, mem8
 
 
MOVZX(Move with Zero-Extend)
BYTE나 WORD 크기의 피연산자를 WORD나 DWORD 크기로 확장하고 남은 비트는 0으로 채운다.
    MOVZX reg32, reg16            MOVZX reg32, mem16
    MOVZX reg16, reg8              MOVZX reg16, mem8
 
 
INT(interrupt)
소프트웨어 인터럽트를 발생시켜 운영체제의 서브루틴을 호출한다.
    INT imm
    INT 3
 

AND(Logical AND)
Destination과 Source 피연산자의 각 비트가 AND 연산된다.
AND 연산은 각 비트가 모두 1일 때만 결과 값이 1이 된다.
    Destination : 10011100
    Source       : 11001010
위의 두 피연산자를 AND 연산하면 결과는 10001000이 된다.
AND 연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수 있다.
    AND reg, reg            AND reg, imm
    AND mem, reg           AND mem, imm
    AND reg, mem
 
 
OR(Inclusive OR)
Destination과 Source 피연산자의 각 비트가 OR 연산된다.
OR 연산은 각 비트가 모두 0이면 결과는 0이고 모두 0이 아니면 결과는 1이 된다.
    Destination : 10011100
    Source       : 11001010
위의 두 피연산자를 OR 연산하면 결과는 11011110이 된다.
OR 연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수 있다.
    OR reg, reg            OR reg, imm
    OR mem, reg           OR mem, imm
    OR reg, mem
 
 
XOR(Exclusive OR)
Destination과 Source 피연산자의 각 비트가 XOR 연산된다.
XOR 연산은 각 비트가 서로 다른 값일 때만 결과가 1이다. 같은 값이라면 결과는 0이 된다.
    Destination : 10011100
    Source       : 11001010
위의 두 피연산자를 XOR 연산하면 결과는 01010110이 된다.
XOR 연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수 있다.
피연산자의 두 값이 같은 값이라면 결과는 항상 0이 된다.
레지스터를 0으로 초기화시킬 때 MOV 명령어를 사용하기보다는 XOR reg, reg으로 많이 사용한다.
    XOR reg, reg            XOR reg, imm
    XOR mem, reg           XOR mem, imm
    XOR reg, mem
 
※참고로 리버싱을 하다 보면 XOR EBX, EBX와 같이 XOR 연산자를 이용하여 EBX 같은 값들을 0으로 초기화시키는 경우가 있는데, 이는 자신과 같은 값을 XOR시키면 0이 되기 때문에 짧은 코드로 초기화가 가능하다.
 
 
TEST(Test)
두 피연산자 사이에 논리적인 AND 연산을 수행하여 플래그 레지스터에 영향을 주지만 결과값은 저장하지 않는다. OF, CF는 항상 0으로 세트되고 TEST 연산 결과값이 0이면 ZF가 1로 세트, 0이 아니면 ZF가 0으로 세트된다.
    TEST reg, reg            TEST reg, imm
    TEST mem, reg           TEST mem, imm
    TEST reg, mem
 
 
STC(Set Carry Flag)
캐리 플래그(CF)를 1로 세트한다.
    STC
 
 
CLC(Clear Carry Flag)
캐리 플래그(CF)를 0으로 세트한다.
    CLC
 
 
STD(Set Direction Flag)
방향 플래그(DF)를 1로 세트한다.
    STD
 
 
CLD(Clear Direction Flag)
방향 플래그(DF)를 0으로 세트한다.
    CLD
 
 
STI(Set Interrupt Flag)
인터럽트 플래그(IF)를 1로 세트한다.
    STI
 
 
CLI(Clear Interrupt Flag)
인터럽트 플래그(IF)를 0으로 세트한다
    CLI
 
 
SHL(Shift Left)
Destination 피연산자를 Source 피연산자의 크기만큼 왼쪽으로 각 비트를 시프트시킨다.
최상위 비트는 캐리 플래그(CF)로 복사되고 최하위 비트는 0으로 채워진다.
    SHL reg, imm8            SHL mem, imm8
    SHL reg, CL               SHL mem, CL
 
 
SHR(Shift Right)
Destination 피연산자를 Source 피연산자의 크기만큼 오른쪽으로 각 비트를 시프트시킨다.
최상위 비트는 0으로 채워지고 최하위 비트는 캐리 플래그(CF)로 복사된다.
    SHR reg, imm8            SHR mem, imm8
    SHR reg, CL               SHR mem, CL
 
 
PUSH(Push on Stack)
스택에 값을 넣는다.
ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다.
    PUSH reg16            PUSH reg32
    PUSH mem16           PUSH mem32
    PUSH imm16            PUSH imm32
 
 
PUSHAD(Push All)
EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터의 값을 스택에 PUSH한다.
레지스터들의 값을 보관해야 할 필요가 있을 때 사용한다.
    PUSHAD
 
 
PUSHFD(Push Flags)
플래그 레지스터를 스택에 PUSH한다.
플래그 레지스터의 값을 보관해야 할 필요가 있을 때 사용한다.
    PUSHFD
 
 
POP(Pop from Stack)
ESP 레지스터가 가리키고 있는 위치의 스택 공간에서 4byte 만큼을 Destination 피연산자에 복사하고 ESP 레지스터의 값에 4를 더한다.
    POP destination
    POP reg16            POP reg32
    POP mem16           POP mem32
 
 
POPAD(Pop All Flags from Stack)
스택에 존재하는 값을 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터로 POP한다.
PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용하려고 할 때 사용한다.
    POPAD
 
 
POPFD(Pop Flags from Stack)
스택에 존재하는 값을 플래그 레지스터로 POP한다.
PUSHFD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용하려고 할 때 사용한다.
    POPFD
 
 
XCHG(Exchange)
두 피연산자의 내용이 서로 교환된다.
XCHG 명령은 imm 값이 피연산자로 올 수 없다.
    XCHG reg, reg
    XCHG reg, mem
    XCHG mem, reg
 
 
NEG(Negate)
피연산자의 2의 보수를 계산하여 결과를 피연산자에 저장한다.
    NEG reg
    NEG mem
 
 
PTR
피연산자의 크기를 재설정한다.
    MOV eax, DWORD PTR value
위의 명령어는 value의 크기를 DWORD의 크기로 재설정하여 eax 레지스터에 복사하라는 의미이다.
 
 
OFFSET
세그먼트의 시작으로부터 변수가 위치한 거리까지의 상대적 거리를 리턴한다.
    MOV esi, OFFSET value
위 명령어는 value가 존재하는 위치를 세그먼트 시작 지점으로부터의 상대적 거리로 구해서 esi 레지스터에 복사하라는 의미이다.
 
 
LEA(Load Effective Address)
Source 피연산자의 유효 주소를 계산하여 Destination 피연산자에 복사한다.
간단히 주소를 알아내서 복사하는 명령어라고 생각하면 쉽다.
    LEA reg, mem
 
 
REP(Repeat String)
ECX 레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX > 0 인 동안 반복한다.
    REP MOVS destination, source
 
 
JMP(Jump Unconditionally to Lable)
피연산자의 위치로 실행 흐름이 변경된다. 피연산자가 가리키는 코드로 점프 뛰어서 실행한다고 생각하면 된다. 피연산자에는 레이블이나 레지스터, 메모리 값이 올 수 있다.
 
short 점프는 -127~127 바이트 범위 안에서 사용되고 near 점프는 같은 세그먼트 내부에서 사용된다. far 점프는 현재 세그먼트를 벗어날 때 사용되며 JMP 명령어는 되돌아올 리턴 어드레스 값을 저장하지 않는다. 이 명령어는 무조건 점프 명렁어인데 점프 명령은 어떤 형식에 맞을 때만 점프하는 조건 형식의 점프 명령도 있다. 이 명령어들은 잠시 후에 살펴보자.
    JMP shortlabel                JMP reg16
    JMP nearlabel                 JMP mem16
    JMP farlabel                   JMP mem32
 
 
CALL(Call a Procedure)
함수 호출시 사용된다. JMP 명령어 같이 프로그램의 실행 흐름이 변경되지만 JMP 명령어와 다른 점은 되돌아올 리턴 어드레스(CALL 다음 명령)를 스택에 저장한다는 것이다. 되돌아올 주소를 저장하기 때문에 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있다. 호출한 함수가 일을 다 마치면 원래 위치에서 다시 프로그램이 실행될 수 있음을 의미한다.
    CALL nearlable                CALL farlabel
    CALL mem16                CALL mem32                CALL reg
    (디버깅을 하면서 보게 되는 Call 형식들)
    Call 함수 주소
    Call DWORD PTR[EAX+5]
    Call <JMP to API> 특정 api 지목
 
 
CMP(Compare)
두 피연산자를 비교하는 작업을 한다. Destination 피연산자에서 Source 피연산자를 묵시적으로 빼서 값을 비교한다. 두 피연산자의 값이 같다면 결과는 0이 되고 제로 플래그(ZF)가 1로 세트된다. 다르다면 제로 플래그(ZF)는 0으로 세트된다.
    CMP reg, reg            CMP reg, imm
    CMP mem, reg           CMP mem, imm
    CMP reg, mem
 
 
NOP(No Operation)
아무 일도 하지 않는 명령어이다. 리버싱 작업에서 목적에 따라 유용하게 사용될 수 있다.
    NOP
 
 


조건 점프 명령
조건 점프 명령은 JMP 명령어와는 다르게 CMP 명령같이 특정 플래그 레지스터를 변경시킬 수 있는 명령어를 통해서 특정 조건이 만족하게 된다면 점프를 수행하게 되는 명령어이다. 명령어 자체가 처음 볼땐 어떤 일을 하는지 이해하기가 힘들게 되어 있다. 다음에 여러 조건 형식의 점프 명령과 명령의 의미, 그리고 어떤 조건(플래그 레지스터의 상태)을 만족해야 명령어가 수행되는지 표로 정리하였다.
명령어
명령어의 의미
명령어가 수행되기 위한 플래그
레지스터와 범용 레지스터의 상태
 JA
Jump if (unsigned) above
CF=0 and ZF=0
 JAE
Jump if (unsigned) above or equal
CF=0
 JB
Jump if (unsigned) below
CF=1
 JBE
Jump if (unsigned) below or eqaul
CF=1 or ZF=1
 JC
Jump if carry flag set
CF=1
 JCXZ
Jump if CX is 0
CX=0
 JE
Jump if equal
ZF=1
 JECXZ
Jump if ECX is 0
ECX=0
 JG
Jump if (signed) greater
ZF=0 and SF=0
JGE
Jump if (signed) greater or equal
SF=OF
 JL
Jump if (signed) less
SF!=OF
JLE
Jump if (signed) less or equal
ZF=1 and OF!=OF
 JNA
Jump if (unsigned) not above
CF=1 or ZF=1
 JNAE
Jump if (unsigned) not above or equal
CF=1
 JNB
Jump if (unsigned) not below
CF=0
 JNBE
Jump if (unsigned) not below or equal
CF=0 and ZF=0
 JNC
Jump if carry flag not set
CF=0
 JNE
Jump if not equal
ZF=0
 JNG
Jump if (signed) not greater
ZF=1 or SF!=OF
 JNGE
Jump if (signed) not greater or equal
SF!=OF
 JNL
Jump if (signed) not less
SF=OF
JNLE
Jump if (signed) not less or equal
ZF=0 and SF=OF
 JNO
Jump if oeverflow flag not set
OF=0
JNP
Jump if parity flag not set
PF=0
 JNS
Jump if sign flag not set
SF=0
 JNZ
Jump if not zero
ZF=0
 JO
Jump if overflow flag is set
OF=1
 JP
Jump if parity flag set
PF=1
 JPE
Jump if parity is equal
PF=1
 JPO
Jump if parity if odd
PF=0
 JS
Jump if sign flag is set
SF=1
 JZ
Jump is zero
ZF=1


Ctrl + F


'정리중' 카테고리의 다른 글

어셈블리 : 함수호출규약  (0) 2014.08.23
HTTP 응답코드 목록  (0) 2014.07.31
x86 레지스터 목록  (0) 2014.07.23
ARM assembly 문법정리  (0) 2014.07.23
x86 호출 규약 목록  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다

-






12.1.1. 연산자 우선 순위

 

연산자 우선 순위는 아래와 같으며가장 낮은 것에서부터 가장 높은 것 순서로 되어 있다동일한 라인에 나와 있는 연사자들은 같은 우선 순위를 갖는 것들이다.
:=
 
||, OR, XOR
 
&&, AND
 
NOT
 
BETWEEN, CASE, WHEN, THEN, ELSE
 
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
 
|
 
&
 
<<, >>
 
-, +
 
*, /, DIV, %, MOD
 
^
 
- (unary minus), ~ (unary bit inversion)
 
!
 
BINARY, COLLATE
NOT에 대한 우선 순위는 MySQL 5.0.2 이후에 존재한다이전 버전또는HIGH_NOT_PRECEDENCE SQL 모드가 활성화 되어 있는 경우의 5.0.2 까지는NOT의 우선 순위는 ! 연산자의 우선 순위와 같다. Section 5.2.5, “서버 SQL 모드” 를 참조.
 
연산자의 우선 순위는 수식에 있는 항(term)의 계산 순서를 결정한다위의 순서를 무시하고 그룹 항을 명확하게 지정하고자 한다면괄호를 사용하면 된다예를 들면:
mysql> SELECT 1+2*3;
 
        -> 7
 
mysql> SELECT (1+2)*3;
 
        -> 9


다른 카테고리의 글 목록

Study 카테고리의 포스트를 톺아봅니다

-
x86레지스터

eax : 어큐뮬레이터라는 호칭으로 불리며 연산에 사용되는 레지스터입니다.
ebx : 베이스 레지스터라는 호칭으로 불리며 메모리 어드레스를 저장하는 레지스터입니다.
ecx : 카운트 레지스터라는 호칭으로 불리며 반복 회수를 카운트합니다.
edx : 데이터 레지스터라는 호칭으로 불리며 데이터를 저장합니다.
esi : 소스 인덱스라는 호칭으로 불리며 데이터를 전송하는 곳의 메모리 어드레스를 저장합니다.
edi : 데스티네이션 인덱스라고 불리며 데이터가 전송되는 곳의 메모리 어드레스를 저장합니다.
ebp : 베이스 포인터라고 불리며 데이터 저장 영역의 메모리 어드레스를 저장합니다.
esp : 스택 포인터라고 불리며 스택 영역의 메모리 어드레스를 저장합니다.

16bit 레지스터
1) 일반 레지스터 (AX, BX, CX, DX) 
- 실제로는 명령에 따라서 특수하게 쓰이기도 한다.
- 상위 8비트(AH, BH, CH, DH)와 하위 8비트(AL, BL, CL, DL)를 따로 접근할 수도 있다.
 
2) 세그먼트 레지스터(CS, DS, SS, ES) 
- 메모리 주소의 기준을 정하는 데 사용된다.
- 메모리 영역들의 시작위치를 보관하기 위해 존재한다. 이 영역들의 프로그램 명령어들과 데이터, 스택에 사용된다.
  메모리의 모든 위치는 세그먼트 레지스터가 가리키는 메모리 위치를 기준으로 계산되며 4가지 세그먼트 레지스터가 있다.
 
  ① CS(코드 세그먼트)       
    : 프로그램의 실행 명령어들이 내장되는 메모리 영역의 시작되는 위치를 보관
  ② DS(데이터 세그먼트)     ? 
    : 데이터가 내장되는 메모리 영역의 시작 위치를 보관 
  ③ SS(스택 세그먼트)       
    : 스택으로 사용되는 메모리 영역의 시작 위치를 보관
  ④ ES(엑스트라 세그먼트) 
    : 변수들을 위한 추가 메모리 영역의 시작 위치를 보관
 
3) 인덱스 레지스터?  
- 데이터와 명령어들의 오프셋 주소를 갖는다. 오프셋 주소란 세그먼트 주소에서 떨어진 거리이다.
- 문자열, 배열, 다수의 데이터를 포함하는 데이터 구조체의 처리를 빠르게 한다.
 
 ① BP(Base Pointer)
 : SS 레지스터로부터의 오프셋 주소를 갖는다. 서브루틴을 호출할 때 서브루틴에 변수들을 넘겨주는데 서브루틴은 흔히 BP 레지스터를
  사용하여 변수들을 찾아낸다.
 ② SP(Stack Pointer)
 : 스택 최상부의 오프셋 주소를 갖는다. SP와 SS레지스터와 결합하여 스택 최상부의 위치 주소가 만들어진다.
 ③ SI(Source Index)
 : 문자열 이동 명령어들에서 따온 이름이다. 이 명령어들에서 소스 문자열이 사용되며 SI 레지스터가 이 문자열을 가리킨다.
 ④ DI(Destination Index)
 : 문자열 이동 명령어에서 목적지를 가리킨다. 상태 및 제어 레지스터.
 ⑤ IP(Instruction Pointer)
 : 현재 코드 세그먼트 내의 다음 실행될 명령어의 오프셋 주소를 갖는다. IP와 CS 레지스터가 결합하여 다음 실행될 명령어의 메모리 주소를 결정한다. 


*DR0 ~ DR3 레지스터
각각의 32비트 레지스터들은 각각의 하드웨어 브레이크 포인트 주소를 말해준다. DR7 레지스터와 함께 사용되고, 4개의 하드웨어 브레이크 포인터를 사용할 수 있다.
만약 이 레지스터들이 활성화 해 있을 경우, 프로세서가 주소를 엑세스 할 때마다 이 레지스터에 저장되어 있는 주소 값과 비교해 같을 경우 인터럽트 1(Exception 1)이 발생한다.



*DR6(Debug Status Register)
이 레지스터는 인터럽트 1(Exception 1)이 발생한 여러가지 이유를 알려준다. 프로세서에 의해 세트되고, 자동으로 클리어 되지 않으므로 직접 지워줘야 한다.
하위 0~4비트는 엑세스 된 레지스터 주소값에 관련된 내용을 알려준다. 예를들어 DR0이엑세스 되었다면, B0가 1로 세트되어 있을 것이다.



BD(Break for Debug register access,Bit,13) 비트는 하드웨어 브레이크 포인터랑은 상관 없고, 오로지 DR7의 GD 비트에 의해 디버그 레지스터가 잠김(Lock)되었을 시, 디버그 레지스터를 엑세스하면 인터럽트 1(Exception 1)이 발생하고 이 비트가 세트된다.


BS(Break for Single-step,Bit 14)비트는 EFLAGS 레지스터의 TF 비트가 세트되어 인터럽트 1이 발생하였음을 나타내 준다.


BT(Break for Task switch, Bit 15)비트는 태스크 변환 시 트레이싱(Tracing)을 가능하게 하는 TSS의 T 비트가 세트되어 인터럽트 1이 발생하였음을 알려준다.


*DR7(Debug Control Register)
이 레지스터는 4개의 하드웨어 브레이크 포인터에 대해 조건을 지정해 준다.
L0(Local enable,Bit 0)비트는 세트되어 있을 때 DR0에 저장되어 있는 주소에 대하여 현재의 테스크 기간 동안만 하드웨어 브레이크 포인트가 작동한다. 다음 태스크 변환이 발생하면 이 비트는 자동으로 클리어된다. L3번까지 동일하다.


G0(Global Enable,Bit,1)비트는 DR0에 저장되어 있는 주소에 대하여 태스크 변환에 상관 없이 모든 시간 동안 하드웨어 브레이크 포인트가 작동하게 한다.(G1,G2,G3)동일
LE(Local Exact,Bit,8),GE(Global Exact,Bit 9)이 비트는 데이터 엑세스 브레이크 포인터를 지정할 경우에 반드시 설정해야하는 비트로, 이 비트가 설정해 있지 않으면 데이터에 대한 엑세스가 끝난 후에도, 몇 개의 명령어를 수행한 후, 인터럽트가 발생한다.
이유는 80386에서는 '파이프 라인(Pipe Line)' 구조를 사용해 한 명령어의 실행이 끝나기 전에 다른 명령어가 동시에 처리되는데, 프로세서가 이 명령어가 끝난 후에야 인터럽터를 발생하기 때문이다.


GD(Global Debug access,Bit,13) 이 비트는 G0~G3레지스터와는 상관 없다.
다만, 이 비트가 세트되어 있는 상태에서 디버그 레지스터에 대한 엑세스가 이루어지면 인터럽트 1이 발생하여 이 비트는 자동으로 리셋된다.



RW0(Read/Write access,Bit 16 and 17) 이 비트는 DR0에 저장되 있는 주소에 대하여 아래의 엑세스 방법 중 어떠한 엑세스가 발생했을 때 하드웨어 브레이크 포인트가 작동할지 지시해 준다.(RW1,RW2,RW3) 동일하다.
RW
내용
00
명령어 실행 시에만 브레이크 포인트가 작동(Code fetch)
01
데이터에 대한 쓰기 작업이 있을 때 브레이크 포인트가 작동(Data Write)
10
펜티엄 이전의 프로세서는 사용하지 않는다. 그 이상부터는 CR4 레지스터에 있는 DE(Debug Extentions) 플래그가 세트되어 있을 경우 I/O 포트에 대한 읽기 혹은 쓰기 작업 시 프레이크 포인트가 작동하게 되며, 이 경우 관련된 DR 레지스터의 주소 역시 포트의 번지로 해석되어지게 된다.
11
데이터에 대한 모든 엑세스 시 브레이크 포인트 작동(Date Read or Write)
LEN0(break-point LENgth,Bit 18 and 19) 이 비트는 DR0에 저장되어 이쓴 브레이크 포인트 주소의 유효 범위를 나타내 주며, 유효 범위는 아래 표와 같다.
이 때 명령의 실행에 대한 브레이크 포인트 지정 시 LEN 필드는 항상 00을 지정해야 하고, 데이터 엑세스 브레이크 포인터 지정 시, 그 브레이크 포인트의 시작 번지가 ㄷ아래 표와 같은 주소 위치어야 한다.(LEN1,LEN2,LEN3)동일.
LEN
브레이크 포인의 유효 범위 길이
브레이크 포인트의 시작 번지
00
1바이트
임의
01
2바이트
짝수 번지
10
미사용
-
11
4바이트
4의 정수배



플래그 레지스터
조건분기명령은 비교명령이나 연산명령의 결과에 따라서 분기합니다.
그러나, 정확히 말하자면 비교명령이나 연산명령의 결과에 의해 세트된 플래그 레지스터의 값에 따라서 분기하는 것입니다. 플래그 레지스터는 여러 가지 상태를 기억하기 위한 레지스터입니다. 
+------------------------------------------------------------------+
*플래그 레지스터의 각 비트의 명칭 
공백인 비트는 사용하지 않읍니다. 
비트 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 
 OF DF  IF TF SF ZF AF PF CF 
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 
+------------------------------------------------------------------+
스테이터스 플래그(status flag)
연산의 결과에 따라서 세트 혹은 리셋되는 플래그로 다음과 같은 것이 있읍니다.
-CF : 캐리플래그 (carry flag)
연산한 결과,최상의 비트로 부터의 높은 자리로 자리올림(캐리) 
혹은 최상의 비트로 부터의 빌림이 발생한 경우에 1로 세트되고
그 이외의 경우 0으로 세트됩니다.
-PF :패리티 플래그(parity flag)
연산한 결과, 1로된 비트의 수가 짝수개(EVEN)일 때 1로 세트되
고 그 이외의 경우 0으로 리셋됩니다.
-AF : 보조 캐리플래그(auxiliary carry flag)
8(16)비트 연산에서,하위 4(8) 비트로 부터 상위 4 비트로 자리
올림 혹은 빌림이 발생한 경우에 1로 리셋된다. 10진 보정 명령에
있어서도 사용 됩니다.
-ZF : 제로 플래그(zero flag)
연산한 결과가 0으로 되었을 때에 1로 세트되고,그이외일 때는
0으로 리셋됩니다.
-SF :사인 플래래그(sign flag)
연산한 결과,최상의 비트가 1이 되었을 때(즉,보수표현으로
음수가 되었을 때) 1로 세트되고,그이외일 때는 0으로 리셋됩니다.
-OF : 오버플로우 플래그(overflow flag)
연산을 부호가 달린 숫자로 했을때,오버 플로우 혹은 언더 플로우
가 발생한 경우에 1로 세트되고,그 이외일 때는 0으로 리셋됩니다.
콘트롤 플래그(control flag)
CPU의 동작 상태 를 제어하는 레지스터로 플래그 제어 명령이나 플래그 전송명령을 사용하여 프로그램 중에서 세트 혹은 리셋됩니다.
-DF : 디렉션 플래그(direction flag)
스트링 조작을 할 때에 이 플래그가 0이면 번지를 나타내는
레지스터값이 자동으로 증가하고 1이면 레지스터값은 자동적으로
감소합니다.
-IF : 인터럽트 플래그(interrupt flag)
이 플래그가 0 일 때 INTR단자로 부터의 외부 인터럽트 요구는
무시되고,1 일 때에는 외부 인터럽트 요구를 받아 들일 수 있게
됩니다.
-TF : 트랩 플래그(trap flag)
이 플래그가 0일 때 CPU 는 보통대로 명령을 실행한다.이 플래그가
1일 때 CPU 는 한 명령을 실행할 때마다 자동적으로 내부 인터럽트
(INT1)가 발생하고,인터럽트 처리 루틴으로 들어간다.(단, 이 처리
루틴의 실행중에는 트랩플래그는 0으로 클리어 된다).이 플래그는
프로그램의 추적에 사용됩니다.
플래그 레지스터 제어 명령 과 전송 명령
STC (Set Carry flag) 캐리플러그를 1로 세트한다.
CLC (CLear Carry flag) 캐리플러그를 0으로 리셋한다.
CMC (CoMplement Carry flag) 캐리플래그가 0이면 1로 1이면 0으로 
세트한다.
STD(Set Direction flag) 디렉션 플래그를 1로 세트한다.
CLD(CLear Direction flag) 디렉션 플래그를 0으로 리셋한다
STI(Set Interrupt-enable flag) 인터럽트 플래그를 1로 세트한다.
CLI(CLear Interrupt-enable flag) 인터럽트 플래그를 0으로 세트한다.
LAHF(Load AH from Flags) 플래그 레지스터의 하위 8비트를 AH레지
스터로 전송한다.사용하지 않는 비트의 
값은 정해져 있지 않다.
SAHF(Store AH into Flags) AH레지스터의 내용을 플래그레지스터의
하위 8비트에 전송한다.
PUSHF (PUSH Flas onto stack) 플래그 레지스터의 내용을 스택(stag)상
에 푸쉬(PUSH:삽입)한다.
POPF (POP Flags off stack) 스택 위의 워드데이터를 플래그레지스터
에 POP한다.

FS 레지스터
Ring3에서는 TEB 위치를 가르킨다.

FS:[0x00] Win9x and NT Current SEH frame
FS:[0x04] Win9x and NT Top of stack
FS:[0x08] Win9x and NT Current bottom of stack
FS:[0x10] NT Fiber data
FS:[0x14] Win9x and NT Arbitrary data slot
FS:[0x18] Win9x and NT Linear address of TIB
FS:[0x20] NT Process ID
FS:[0x24] NT Current thread ID
FS:[0x2C] Win9x and NT Linear address of the thread local storage array
FS:[0x30] Pointer to PEB
FS:[0x34] NT Current error number
FS:[0x38] CountOfOwnedCriticalSections
FS:[0x3c] CsrClientThread
FS:[0x40] Win32ThreadInfo
FS:[0x44] Win32ClientInfo[0x1f]
FS:[0xc0] WOW32Reserved
FS:[0xc4] CurrentLocale
FS:[0xc8] FpSoftwareStatusRegister
FS:[0xcc] SystemReserved1[0x36]
FS:[0x1a4] Spare1
FS:[0x1a8] ExceptionCode
FS:[0x1ac] SpareBytes1[0x28]
FS:[0x1d4] SystemReserved2[0xA]
FS:[0x1fc] GDI_TEB_BATCH
FS:[0x6dc] gdiRgn
FS:[0x6e0] gdiPen
FS:[0x6e4] gdiBrush
FS:[0x6e8] CLIENT_ID
FS:[0x6f0] GdiCachedProcessHandle
FS:[0x6f4] GdiClientPID
FS:[0x6f8] GdiClientTID
FS:[0x6fc] GdiThreadLocaleInfo
FS:[0x700] UserReserved[5]
FS:[0x714] glDispatchTable[0x118]
FS:[0xb74] glReserved1[0x1A]
FS:[0xbdc] glReserved2
FS:[0xbe0] glSectionInfo
FS:[0xbe4] glSection
FS:[0xbe8] glTable
FS:[0xbec] glCurrentRC
FS:[0xbf0] glContext
FS:[0xbf4] NTSTATUS
FS:[0xbf8] StaticUnicodeString
FS:[0xc00] StaticUnicodeBuffer[0x105]
FS:[0xe0c] DeallocationStack
FS:[0xe10] TlsSlots[0x40]
FS:[0xf10] TlsLinks
FS:[0xf18] Vdm
FS:[0xf1c] ReservedForNtRpc
FS:[0xf20] DbgSsReserved[0x2]
FS:[0xf28] HardErrorDisabled
FS:[0xf2c] Instrumentation[0x10]
FS:[0xf6c] WinSockData
FS:[0xf70] GdiBatchCount
FS:[0xf74] Spare2
FS:[0xf78] Spare3
FS:[0xf7c] Spare4
FS:[0xf80] ReservedForOle
FS:[0xf84] WaitingOnLoaderLock
FS:[0xf88] StackCommit
FS:[0xf8c] StackCommitMax
FS:[0xf90] StackReserve

[출처] 레지스터 정리|작성자 오타해커


'정리중' 카테고리의 다른 글

HTTP 응답코드 목록  (0) 2014.07.31
x86 Assembly  (0) 2014.07.25
ARM assembly 문법정리  (0) 2014.07.23
x86 호출 규약 목록  (0) 2014.07.23
레지스터 목록 및 설명  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다

-
니모닉간단한 설명페이지아키텍처[1]
ADCADDcarry 포함 더하기, 더하기ADD, SUB, RSB, ADC, SBC 및 RSC모두
ADR프로그램 또는 레지스터 기준 주소 로드(짧은 범위)ADR모두
ADRL 의사 명령어프로그램 또는 레지스터 기준 주소 로드(중간 범위)ADRL 의사 명령어x6M
AND논리 ANDAND, ORR, EOR, BIC 및 ORN모두
ASR오른쪽으로 산술 시프트ASR, LSL, LSR, ROR 및 RRX모두
B분기B, BL, BX, BLX 및 BXJ모두
BFCBFI비트 필드 지우기 및 삽입BFC 및 BFIT2
BIC비트 지우기AND, ORR, EOR, BIC 및 ORN모두
BKPT브레이크포인트BKPT5
BL링크 포함 분기B, BL, BX, BLX 및 BXJ모두
BLX링크 포함 분기 및 변경 명령어 세트B, BL, BX, BLX 및 BXJT
BX분기, 변경 명령어 세트B, BL, BX, BLX 및 BXJT
BXJ분기, Jazelle로 변경B, BL, BX, BLX 및 BXJJ, x7M
CBZ, CBNZ0인 경우(0이 아닌 경우) 비교 및 분기CBZ 및 CBNZT2
CDP보조 프로세서 데이터 처리 연산CDP 및 CDP2x6M
CDP2보조 프로세서 데이터 처리 연산CDP 및 CDP25, x6M
CHKA배열 검사CHKAEE
CLREX단독 지우기CLREXK, x6M
CLZ선행 0 수 계산CLZ5, x6M
CMNCMP음수 비교, 비교CMP 및 CMN모두
CPS프로세서 상태 변경CPS6
CPY복사MOV 및 MVN6
DBG디버그DBG, DMB, DSB 및 ISB7
DMBDSB데이터 메모리 장벽, 데이터 동기화 장벽DBG, DMB, DSB 및 ISB7, 6M
ENTERXLEAVEXThumbEE로 또는 ThumbEE에서 상태 변경ENTERX 및 LEAVEXEE
EOR배타적 ORAND, ORR, EOR, BIC 및 ORN모두
HBHBLHBLPHBP처리기 분기, 지정된 처리기로 분기HB, HBL, HBLP 및 HBPEE
ISB명령어 동기화 장벽DBG, DMB, DSB 및 ISB7, 6M
ITIf-ThenITT2
LDC보조 프로세서 로드LDC, LDC2, STC 및 STC2x6M
LDC2보조 프로세서 로드LDC, LDC2, STC 및 STC25, x6M
LDM다중 레지스터 로드LDM 및 STM모두
LDR레지스터 로드 명령어메모리 액세스 명령어모두
LDR 의사 명령어레지스터 로드 의사 명령어LDR 의사 명령어모두
LDREX단독 레지스터 로드LDREX 및 STREX6, x6M
LDREXBLDREXH바이트 및 하프워드 단독 레지스터 로드LDREX 및 STREXK, x6M
LDREXD더블워드 단독 레지스터 로드LDREX 및 STREXK, x7M
LSLLSR왼쪽으로 논리 시프트, 오른쪽으로 논리 시프트ASR, LSL, LSR, ROR 및 RRX모두
MAR레지스터에서 40비트 누산기로 이동MAR 및 MRAXScale
MCR레지스터에서 보조 프로세서로 이동MCR, MCR2, MCRR 및 MCRR2x6M
MCR2레지스터에서 보조 프로세서로 이동MCR, MCR2, MCRR 및 MCRR25, x6M
MCRR여러 레지스터에서 보조 프로세서로 이동MCR, MCR2, MCRR 및 MCRR25E, x6M
MCRR2여러 레지스터에서 보조 프로세서로 이동MCR, MCR2, MCRR 및 MCRR26, x6M
MIAMIAPHMIAxy내부 40비트 누산으로 곱하기MIA, MIAPH 및 MIAxyXScale
MLA곱하기 누산MUL, MLA 및 MLSx6M
MLS곱하기 및 빼기MUL, MLA 및 MLST2
MOV이동MOV 및 MVN모두
MOVT맨 위로 이동MOVTT2
MOV32 의사 명령어레지스터로 32비트 상수 이동MOV32 의사 명령어T2
MRA40비트 누산기에서 레지스터로 이동MAR 및 MRAXScale
MRC보조 프로세서에서 레지스터로 이동MRC, MRC2, MRRC 및 MRRC2모두
MRC2보조 프로세서에서 레지스터로 이동MRC, MRC2, MRRC 및 MRRC25, x6M
MRSPSR에서 레지스터로 이동MRS모두
MSR레지스터에서 PSR로 이동MSR모두
MUL곱하기MUL, MLA 및 MLS모두
MVN이동하지 않음MOV 및 MVN모두
NOP연산 없음NOP, SEV, WFE, WFI 및 YIELD모두
ORN논리 OR NOTAND, ORR, EOR, BIC 및 ORNT2
ORR논리 ORAND, ORR, EOR, BIC 및 ORN모두
PKHBTPKHTB하프워드 패킹PKHBT 및 PKHTB6, x7M
PLD데이터 사전 로드PLD 및 PLI5E, x6M
PLI사전 로드 명령어PLD 및 PLI7
PUSHPOP레지스터 푸시, 팝PUSH 및 POP모두
QADDQDADDQDSUBQSUB포화 산술QADD, QSUB, QDADD 및 QDSUB5E, x7M
QADD8QADD16QASXQSUB8QSUB16,QSAX병렬 부호 있는 포화 산술병렬 더하기 및 빼기6, x7M
REVREV16REVSH바이트 순서 반전REV, REV16, REVSH 및 RBIT6
RBIT비트 반전REV, REV16, REVSH 및 RBITT2
RFE예외에서 복귀RFET2, x7M
ROR레지스터를 오른쪽으로 회전ASR, LSL, LSR, ROR 및 RRX모두
RSB역방향 빼기ADD, SUB, RSB, ADC, SBC 및 RSC모두
RSCcarry 포함 역방향 빼기ADD, SUB, RSB, ADC, SBC 및 RSCx6M
SBCcarry 포함 빼기ADD, SUB, RSB, ADC, SBC 및 RSC모두
SADD8SADD16SASX병렬 부호 있는 산술병렬 더하기 및 빼기6, x7M
SBFXUBFX부호 있는 및 부호 없는 비트 필드 추출SBFX 및 UBFXT2
SDIV부호 있는 나누기SDIV 및 UDIV7M, 7R
SELAPSR GE 플래그에 따라 바이트 선택SEL6, x7M
SEV이벤트 설정NOP, SEV, WFE, WFI 및 YIELDK, 6M
SETEND메모리 액세스에 엔디안 설정SETEND6, x7M
SHADD8SHADD16SHASXSHSUB8,SHSUB16SHSAX병렬 부호 있는 양분 산술병렬 더하기 및 빼기6, x7M
SMC보안 모니터 호출SMCZ
SMLAD이중 부호 있는 곱하기 누산SMLAD 및 SMLSD6, x7M
 (32 <= 32 + 16 x 16 + 16 x 16)  
SMLAL부호 있는 곱하기 누산(64 <= 64 + 32 x 32)UMULL, UMLAL, SMULL 및 SMLALx6M
SMLALxy부호 있는 곱하기 누산(64 <= 64 + 16 x 16)SMLALxy5E, x7M
SMLALDlong에 대한 이중 부호 있는 곱하기 누산SMLALD 및 SMLSLD6, x7M
 (64 <= 64 + 16 x 16 + 16 x 16)  
SMLSD이중 부호 있는 곱하기 빼기 누산SMLAD 및 SMLSD6, x7M
 (32 <= 32 + 16 x 16 - 16 x 16)  
SMLSLDlong에 대한 이중 부호 있는 곱하기 빼기 누산SMLALD 및 SMLSLD6, x7M
 (64 <= 64 + 16 x 16 - 16 x 16)  
SMMUL부호 있는 상위 워드 곱하기(32 <= TopWord(32 x 32))SMMUL, SMMLA 및 SMMLS6, x7M
SMUADSMUSD이중 부호 있는 곱하기 및 결과 더하기 또는 빼기SMUAD{X} 및 SMUSD{X}6, x7M
SMULL부호 있는 곱하기(64 <= 32 x 32)UMULL, UMLAL, SMULL 및 SMLALx6M
SMULxy부호 있는 곱하기(32 <= 16 x 16)SMULxy 및 SMLAxy5E, x7M
SMULWy부호 있는 곱하기(32 <= 32 x 16)SMULWy 및 SMLAWy5E, x7M
SRS반환 상태 저장SRST2, x7M
SSAT부호 있는 포화SSAT 및 USAT6, x6M
SSAT16부호 있는 포화, 병렬 하프워드SSAT16 및 USAT166, x7M
SSUB8SSUB16SSAX병렬 부호 있는 산술병렬 더하기 및 빼기6, x7M
STC보조 프로세서 저장LDC, LDC2, STC 및 STC2x6M
STC2보조 프로세서 저장LDC, LDC2, STC 및 STC25, x6M
STM다중 레지스터 저장LDM 및 STM모두
STR레지스터 저장 명령어메모리 액세스 명령어모두
STREX단독 레지스터 저장LDREX 및 STREX6, x6M
STREXBSTREXH단독 레지스터 저장 바이트, 하프워드LDREX 및 STREXK, x6M
STREXD더블워드 단독 레지스터 저장LDREX 및 STREXK, x7M
SUB빼기ADD, SUB, RSB, ADC, SBC 및 RSC모두
SUBS pc, LR스택 없이 예외에서 반환SUBS pc, LRT2, x7M
SVC(이전 SWI)관리자 호출SVC모두
SWPSWPB레지스터와 메모리 스왑(ARM에만 해당)SWP 및 SWPB모두, x7M
SXT부호 있는 확장SXT, SXTA, UXT 및 UXTA6
SXTA더하기 포함 부호 있는 확장SXT, SXTA, UXT 및 UXTA6, x7M
TBBTBH테이블 분기 바이트, 하프워드TBB 및 TBHT2
TEQTST동등 테스트, 테스트TST 및 TEQ모두
UADD8UADD16UASX병렬 부호 없는 산술병렬 더하기 및 빼기6, x7M
UDIV부호 없는 나누기SDIV 및 UDIV7M, 7R
UHADD8UHADD16UHASXUHSUB8,UHSUB16UHSAX병렬 부호 없는 양분 산술병렬 더하기 및 빼기6, x7M
UMAALlong에 대한 부호 없는 곱하기 누산UMAAL6, x7M
 (64 <= 32 + 32 + 32 x 32)  
UMLALUMULL부호 없는 곱하기 누산, 곱하기UMULL, UMLAL, SMULL 및 SMLALx6M
 (64 <= 32 x 32 + 64), (64 <= 32 x 32)  
UQADD8UQADD16UQASXUQSUB8,UQSUB16UQSAX병렬 부호 없는 포화 산술병렬 더하기 및 빼기6, x7M
USAD8부호 없는 절대차의 합USAD8 및 USADA86, x7M
USADA8부호 없는 절대차의 합 누산USAD8 및 USADA86, x7M
USAT부호 없는 포화SSAT 및 USAT6, x6M
USAT16부호 없는 포화, 병렬 하프워드SSAT16 및 USAT166, x7M
USUB8USUB16USAX병렬 부호 없는 산술병렬 더하기 및 빼기6, x7M
UXT부호 없는 확장SXT, SXTA, UXT 및 UXTA6
UXTA더하기 포함 부호 없는 확장SXT, SXTA, UXT 및 UXTA6, x7M
V*자세한 내용은 Chapter 5 NEON 및 VFP 프로그래밍을 참조하십시오.  
WFEWFIYIELD이벤트 대기, 인터럽트 대기, 양도NOP, SEV, WFE, WFI 및 YIELDT2, 6M


'정리중' 카테고리의 다른 글

HTTP 응답코드 목록  (0) 2014.07.31
x86 Assembly  (0) 2014.07.25
x86 레지스터 목록  (0) 2014.07.23
x86 호출 규약 목록  (0) 2014.07.23
레지스터 목록 및 설명  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다

-

이 규약들은 주로 C/C++ 컴파일러용으로 고안되었다. 기타 언어는 구현에 따라 다른 형식과 규약을 갖출 수도 있다.

아키텍처호출 규약 이름운영 체제, 컴파일러레지스터 내 매개변수스택 위 매개변수 순서스택 정리 주체
8086cdeclRTL (C)호출자
파스칼LTR (파스칼)피호출자
fastcall마이크로소프트 (비 멤버)AX, DX, BXLTR (파스칼)피호출자
fastcall마이크로소프트 (멤버 함수)AX, DXLTR (파스칼)피호출자
fastcall볼랜드 컴파일러[8]AX, DX, BXLTR (파스칼)피호출자
왓콤 컴파일러AX, DX, BX, CXRTL (C)피호출자
IA-32cdeclGCCRTL (C)호출자
cdecl마이크로소프트RTL (C)호출자
stdcallRTL (C)피호출자
GCCRTL (C)호출자/피호출자
fastcall마이크로소프트ECX, EDXRTL (C)피호출자
fastcallGCCECX, EDXRTL (C)피호출자
fastcall볼랜드/엠바카데로 컴파일러EAX, EDX, ECXLTR (파스칼)피호출자
thiscall마이크로소프트ECXRTL (C)피호출자
왓콤 컴파일러EAX, EDX, EBX, ECXRTL (C)피호출자
x86-64마이크로소프트 x64 호출 규약[9]윈도 (마이크로소프트 비주얼 C++인텔 C++ 컴파일러, 엠바카데로 컴파일러), UEFIRCX/XMM0, RDX/XMM1, R8/XMM2, R9/XMM3RTL (C)호출자
시스템 V AMD64 ABI[10]GNU/리눅스BSDOS X (GCC인텔 C++ 컴파일러)RDI, RSI, RDX, RCX, R8, R9, XMM0–7RTL (C)호출자


'정리중' 카테고리의 다른 글

HTTP 응답코드 목록  (0) 2014.07.31
x86 Assembly  (0) 2014.07.25
x86 레지스터 목록  (0) 2014.07.23
ARM assembly 문법정리  (0) 2014.07.23
레지스터 목록 및 설명  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다

-

eax 리턴값 저장

ebx 간접주소 저장

ecx 반복카운터 저장

edx eax 초과분

ebp 스택프레임 기준점

esp 스택 최상단

esi 출발주소

edi 도착주소

eip 다음 실행될 주소

efl 상태값 저장 1:셋팅 0:클리어


'정리중' 카테고리의 다른 글

HTTP 응답코드 목록  (0) 2014.07.31
x86 Assembly  (0) 2014.07.25
x86 레지스터 목록  (0) 2014.07.23
ARM assembly 문법정리  (0) 2014.07.23
x86 호출 규약 목록  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다