10진수 |
16진수 |
8진수 |
2진수 |
ASCII |
10진수 |
16진수 |
8진수 |
2진수 |
ASCII |
0 |
0×00 |
000 |
0000000 |
NULL |
64 |
0×40 |
100 |
1000000 |
@ |
1 |
0×01 |
001 |
0000001 |
SOH |
65 |
0×41 |
101 |
1000001 |
A |
2 |
0×02 |
002 |
0000010 |
STX |
66 |
0×42 |
102 |
1000010 |
B |
3 |
0×03 |
003 |
0000011 |
ETX |
67 |
0×43 |
103 |
1000011 |
C |
4 |
0×04 |
004 |
0000100 |
EOT |
68 |
0×44 |
104 |
1000100 |
D |
5 |
0×05 |
005 |
0000101 |
ENQ |
69 |
0×45 |
105 |
1000101 |
E |
6 |
0×06 |
006 |
0000110 |
ACK |
70 |
0×46 |
106 |
1000110 |
F |
7 |
0×07 |
007 |
0000111 |
BEL |
71 |
0×47 |
107 |
1000111 |
G |
8 |
0×08 |
010 |
0001000 |
BS |
72 |
0×48 |
110 |
1001000 |
H |
9 |
0×09 |
011 |
0001001 |
HT |
73 |
0×49 |
111 |
1001001 |
I |
10 |
0×0A |
012 |
0001010 |
LF |
74 |
0×4A |
112 |
1001010 |
J |
11 |
0×0B |
013 |
0001011 |
VT |
75 |
0×4B |
113 |
1001011 |
K |
12 |
0×0C |
014 |
0001100 |
FF |
76 |
0×4C |
114 |
1001100 |
L |
13 |
0×0D |
015 |
0001101 |
CR |
77 |
0×4D |
115 |
1001101 |
M |
14 |
0×0E |
016 |
0001110 |
SO |
78 |
0×4E |
116 |
1001110 |
N |
15 |
0×0F |
017 |
0001111 |
SI |
79 |
0×4F |
117 |
1001111 |
O |
16 |
0×10 |
020 |
0010000 |
DLE |
80 |
0×50 |
120 |
1010000 |
P |
17 |
0×11 |
021 |
0010001 |
DC1 |
81 |
0×51 |
121 |
1010001 |
Q |
18 |
0×12 |
022 |
0010010 |
SC2 |
82 |
0×52 |
122 |
1010010 |
R |
19 |
0×13 |
023 |
0010011 |
SC3 |
83 |
0×53 |
123 |
1010011 |
S |
20 |
0×14 |
024 |
0010100 |
SC4 |
84 |
0×54 |
124 |
1010100 |
T |
21 |
0×15 |
025 |
0010101 |
NAK |
85 |
0×55 |
125 |
1010101 |
U |
22 |
0×16 |
026 |
0010110 |
SYN |
86 |
0×56 |
126 |
1010110 |
V |
23 |
0×17 |
027 |
0010111 |
ETB |
87 |
0×57 |
127 |
1010111 |
W |
24 |
0×18 |
030 |
0011000 |
CAN |
88 |
0×58 |
130 |
1011000 |
X |
25 |
0×19 |
031 |
0011001 |
EM |
89 |
0×59 |
131 |
1011001 |
Y |
26 |
0×1A |
032 |
0011010 |
SUB |
90 |
0×5A |
132 |
1011010 |
Z |
27 |
0×1B |
033 |
0011011 |
ESC |
91 |
0×5B |
133 |
1011011 |
[ |
28 |
0×1C |
034 |
0011100 |
FS |
92 |
0×5C |
134 |
1011100 |
\ |
29 |
0×1D |
035 |
0011101 |
GS |
93 |
0×5D |
135 |
1011101 |
] |
30 |
0×1E |
036 |
0011110 |
RS |
94 |
0×5E |
136 |
1011110 |
^ |
31 |
0×1F |
037 |
0011111 |
US |
95 |
0×5F |
137 |
1011111 |
_ |
32 |
0×20 |
040 |
0100000 |
SP |
96 |
0×60 |
140 |
1100000 |
. |
33 |
0×21 |
041 |
0100001 |
! |
97 |
0×61 |
141 |
1100001 |
a |
34 |
0×22 |
042 |
0100010 |
" |
98 |
0×62 |
142 |
1100010 |
b |
35 |
0×23 |
043 |
0100011 |
# |
99 |
0×63 |
143 |
1100011 |
c |
36 |
0×24 |
044 |
0100100 |
$ |
100 |
0×64 |
144 |
1100100 |
d |
37 |
0×25 |
045 |
0100101 |
% |
101 |
0×65 |
145 |
1100101 |
e |
38 |
0×26 |
046 |
0100110 |
& |
102 |
0×66 |
146 |
1100110 |
f |
39 |
0×27 |
047 |
0100111 |
' |
103 |
0×67 |
147 |
1100111 |
g |
40 |
0×28 |
050 |
0101000 |
( |
104 |
0×68 |
150 |
1101000 |
h |
41 |
0×29 |
051 |
0101001 |
) |
105 |
0×69 |
151 |
1101001 |
i |
42 |
0×2A |
052 |
0101010 |
* |
106 |
0×6A |
152 |
1101010 |
j |
43 |
0×2B |
053 |
0101011 |
+ |
107 |
0×6B |
153 |
1101011 |
k |
44 |
0×2C |
054 |
0101100 |
' |
108 |
0×6C |
154 |
1101100 |
l |
45 |
0×2D |
055 |
0101101 |
- |
109 |
0×6D |
155 |
1101101 |
m |
46 |
0×2E |
056 |
0101110 |
. |
110 |
0×6E |
156 |
1101110 |
n |
47 |
0×2F |
057 |
0101111 |
/ |
111 |
0×6F |
157 |
1101111 |
o |
48 |
0×30 |
060 |
0110000 |
0 |
112 |
0×70 |
160 |
1110000 |
p |
49 |
0×31 |
061 |
0110001 |
1 |
113 |
0×71 |
161 |
1110001 |
q |
50 |
0×32 |
062 |
0110010 |
2 |
114 |
0×72 |
162 |
1110010 |
r |
51 |
0×33 |
063 |
0110011 |
3 |
115 |
0×73 |
163 |
1110011 |
s |
52 |
0×34 |
064 |
0110100 |
4 |
116 |
0×74 |
164 |
1110100 |
t |
53 |
0×35 |
065 |
0110101 |
5 |
117 |
0×75 |
165 |
1110101 |
u |
54 |
0×36 |
066 |
0110110 |
6 |
118 |
0×76 |
166 |
1110110 |
v |
55 |
0×37 |
067 |
0110111 |
7 |
119 |
0×77 |
167 |
1110111 |
w |
56 |
0×38 |
070 |
0111000 |
8 |
120 |
0×78 |
170 |
1111000 |
x |
57 |
0×39 |
071 |
0111001 |
9 |
121 |
0×79 |
171 |
1111001 |
y |
58 |
0×3A |
072 |
0111010 |
: |
122 |
0×7A |
172 |
1111010 |
z |
59 |
0×3B |
073 |
0111011 |
; |
123 |
0×7B |
173 |
1111011 |
{ |
60 |
0×3C |
074 |
0111100 |
< |
124 |
0×7C |
174 |
1111100 |
| |
61 |
0×3D |
075 |
0111101 |
= |
125 |
0×7D |
175 |
1111101 |
} |
62 |
0×3E |
076 |
0111110 |
> |
126 |
0×7E |
176 |
1111110 |
~ |
63 |
0×3F |
077 |
0111111 |
? |
127 |
0×7F |
177 |
1111111 |
DEL |
Security/Assembly
- ASCII 코드표 2008.04.29
- Programming from the Ground Up 2008.04.25
- 어셈 명령어 | 2008.04.24
- 어셈 자료 모두 영문 자료이다.. 2008.04.23
- 어셈블리어 강좌 2008.04.23
- 시스템프로그래밍(어셈블리어) 자료 2008.04.23
- 어셈블리어 명령어 2008.04.22
- [RevErSe] 어셈블리 명령어에 대해 공부합시다... :) 2008.04.22
ASCII 코드표
Programming from the Ground Up
한번쯤 시간 내서 읽어 보도록 하자..
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Assembly/Documents/ProgrammingGroundUp/index.html
어셈 명령어 |
명 령 어 |
설 명 | |
Data Transfer | ||
MOV |
Move |
데이터 이동 (전송) |
PUSH |
Push |
오퍼랜드의 내용을 스택에 쌓는다 |
POP |
Pop |
스택으로부터 값을 뽑아낸다. |
XCHG |
Exchange Register/memory with Register |
첫 번째 오퍼랜드와 두 번째 오퍼랜드 교환 |
IN |
Input from AL/AX to Fixed port |
오퍼랜드로 지시된 포트로부터 AX에 데이터 입력 |
OUT |
Output from AL/AX to Fixed port |
오퍼랜드가 지시한 포트로 AX의 데이터 출력 |
XLAT |
Translate byte to |
BX:AL이 지시한 데이블의 내용을 AL로 로드 |
LEA |
Load Effective Address to Register |
메모리의 오프셋값을 레지스터로 로드 |
LDS |
Load Pointer to DS |
REG←(MEM), DS←(MEM+2) |
LES |
Load Pointer ti ES |
REG←(MEM), ES←(MEM+2) |
LAHF |
Load AH with Flags |
플래그의 내용을 AH의 특정 비트로 로드 |
SAHF |
Store AH into Flags |
AH의 특정 비트가 플래그 레지스터로 전송 |
PUSHF |
Push Flags |
플래그 레지스터의 내용을 스택에 쌓음 |
POPF |
Pop Flags |
스택으로부터 플래그 레지스터로 뽑음 |
Arithmetic | ||
ADD |
Add |
캐리를 포함하지 않은 덧셈 |
SBB |
Subtract with Borrow |
캐리를 포함한 뺄셈 |
DEC |
Decrement |
오퍼랜드 내용을 1 감소 |
NEG |
Change Sign |
오퍼랜드의 2의 보수, 즉 부호 반전 |
CMP |
Compare |
두 개의 오퍼랜드를 비교한다 |
ADC |
Add with Carry |
캐리를 포함한 덧셈 |
INC |
Increment |
오퍼랜드 내용을 1 증가 |
AAA |
ASCII adjust for Add |
덧셈 결과 AL값을 UNPACK 10진수로 보정 |
DAA |
Decimal adjust for Add |
덧셈 결과의 AL값을 PACK 10진수로 보정 |
SUB |
Subtract |
캐리를 포함하지 않은 뺄셈 |
AAS |
ASCII adjust for Subtract |
뺄셈 결과 AL값을 UNPACK 10진수로 보정 |
DAS |
Decimal adjust for Subtract |
뺄셈 결과의 AL값을 PACK 10진수로 보정 |
MUL |
Multiply (Unsigned) |
AX와 오퍼랜드를 곱셈하여 결과를 AX 또는 DX:AX에 저장 |
IMUL |
Integer Multiply (Signed) |
부호화된 곱셈 |
AAM |
ASCII adjust for Multiply |
곱셈 결과 AX값을 UNPACK 10진수로 보정 |
DIV |
Divide (Unsigned) |
AX 또는 DX:AX 내용을 오퍼랜드로 나눔. 몫은 AL, AX 나머지는 AH, DX로 저장 |
IDIV |
Integer Divide (Signed) |
부호화된 나눗셈 |
AAD |
ASCII adjust for Divide |
나눗셈 결과 AX값을 UNPACK 10진수로 보정 |
CBW |
Convert byte to word |
AL의 바이트 데이터를 부호 비트를 포함하여 AX 워드로 확장 |
CWD |
Convert word to double word |
AX의 워드 데이터를 부호를 포함하여 DX:AX의 더블 워드로 변환 |
Logic | ||
NOT |
Invert |
오퍼랜드의 1의 보수, 즉 비트 반전 |
SHL/SAL |
Shift logical / arithmetic Left |
왼쪽으로 오퍼랜드만큼 자리 이동 (최하위 비트는 0) |
SHR |
Shift logical Right |
오른쪽으로 오퍼랜드만큼 자리 이동 (최상위 비트 0) |
SAR |
Shift arithmetic Right |
오른쪽 자리이동, 최상위 비트는 유지 |
ROL |
Rotate Left |
왼쪽으로 오퍼랜드만큼 회전 이동 |
ROR |
Rotate Right |
오른쪽으로 오퍼랜드만큼 회전 이동 |
RCL |
Rotate through Carry Left |
캐리를 포함하여 왼쪽으로 오퍼랜드만큼 회전 이동 |
RCR |
Rotate through Carry Right |
캐리를 포함하여 오른쪽으로 오퍼랜드만큼 회전 이동 |
AND |
And |
논리 AND |
TEST |
And function to Flags, no result |
첫 번째 오퍼랜드와 두 번째 오퍼랜드를 AND하여 그 결과로 플래그 세트 |
OR |
Or |
논리 OR |
XOR |
Exclusive Or |
배타 논리 합 (OR) |
String Manipulation | ||
REP |
Repeat |
REP 뒤에 오는 스트링 명령을 CX가 0이 될 때까지 반복 |
MOVS |
Move String |
DS:SI가 지시한 메모리 데이터를 ES:DI가지시한 메모리로 전송 |
CMPS |
Compare String |
DS:SI와 ES:DI의 내용을 비교하고 결과에 따라 플래그 설정 |
SCAS |
Scan String |
AL 또는 AX와 ES:DI가 지시한 메모리 내용 비교하고 결과에 따라 플래그 설정 |
LODS |
Load String |
SI 내용을 AL 또는 AX로 로드 |
STOS |
Store String |
AL 또는 AX를 ES:DI가 지시하는 메모리에 저장 |
Control Transfer | ||
CALL |
Call |
프로시저 호출 |
JMP |
Unconditional Jump |
무조건 분기 |
RET |
Return from CALL |
CALL로 스택에 PUSH된 주소로 복귀 |
JE/JZ |
Jump on Equal / Zero |
결과가 0이면 분기 |
JL/JNGE |
Jump on Less / not Greater or Equal |
결과가 작으면 분기 (부호화된 수) |
JB/JNAE |
Jump on Below / not Above or Equal |
결과가 작으면 분기 (부호화 안 된 수) |
JBE/JNA |
Jump on Below or Equal / not Above |
결과가 작거나 같으면 분기 (부호화 안 된 수) |
JP/JPE |
Jump on Parity / Parity Even |
패리티 플레그가 1이면 분기 |
JO |
Jump on Overflow |
오버플로가 발생하면 분기 |
JS |
Jump on Sign |
부호 플레그가 1이면 분기 |
JNE/JNZ |
Jump on not Equal / not Zero |
결과가 0이 아니면 분기 |
JNL/JGE |
Jump on not Less / Greater or Equal |
결과가 크거나 같으면 분기 (부호화된 수) |
JNLE/JG |
Jump on not Less or Equal / Greater |
결과가 크면 분기 (부호화된 수) |
JNB/JAE |
Jump on not Below / Above or Equal |
결과가 크거나 같으면 분기 (부호화 안 된 수) |
JNBE/JA |
Jump on not Below or Equal / Above |
결과가 크면 분기 (부호화 안 된 수) |
JNP/JPO |
Jump on not Parity / Parity odd |
패리티 플레그가 0이면 분기 |
JNO |
Jump on not Overflow |
오버플로우가 아닌 경우 분기 |
JNS |
Jump on not Sign |
부호 플레그가 0이면 분기 |
|
Loop CX times |
CX를 1감소하면서 0이 될 때까지 지정된 라벨로 분기 |
LOOPZ/LOOPE |
|
제로 플레그가 1이고 CX≠0이면 지정된 라벨로 분기 |
LOOPNZ/LOOPNE |
|
제로 플레그가 0이고 CX≠0이면 지정된 라벨로 분기 |
JCXZ |
Jump on CX Zero |
CX가 0이면 분기 |
INT |
Interrupt |
인터럽트 실행 |
INTO |
Interrupt on Overflow |
오버플로우가 발생하면 인터럽트 실행 |
IRET |
Interrupt Return |
인터럽트 복귀 (리턴) |
Processor Control | ||
CLC |
Clear Carry |
캐리 플레그 클리어 |
CMC |
Complement Carry |
캐리 플레그를 반전 |
CLD |
Clear Direction |
디렉션 플레그를 클리어 |
CLI |
Clear Interrupt |
인터럽트 플레그를 클리어 |
HLT |
Halt |
정지 |
LOCK |
Bus Lock prefix |
|
STC |
Set Carry |
캐리 플레그 셋 |
NOP |
No operation |
|
STD |
Set Direction |
디렉션 플레그 셋 |
STI |
Set Interrupt |
인터럽트 인에이블 플레그 셋 |
WAIT |
Wait |
프로세서를 일지 정지 상태로 한다 |
ESC |
Escape to External device |
이스케이프 명령 |
Push: sp 레지스터를 조작하는 명령어중의 하나이다.
스택에 데이터를 저장하는데 쓰인다.
ex:) Push eax
:스택에 Eax의 값을 스택에 저장한다.
ex:) Push 20
:즉석값인 20을 스택에 저장한다.
ex:) Push 401F47
:메모리 오프셋 401F47의 값을 스택에 저장한다.
Pop: 이또한 sp 레지스터를 조작하는 명령어중 하나
이다. 스택에서 데이터를 꺼내는데 쓰인다.
ex:) Pop eax
:스택에 가장 상위에 있는 값을 꺼내애서 eax에 저장
주의점: Push 의 역순으로 값은 스택에서 Pop 된다.
Moo 메모리나 레지스터의 값을 옮길떄[로 만들떄]
쓰인다.
ex:) Mov eax,ebx
:ebx 레지스터의 값을 eax로 옮긴다[로 만든다].
ex:) Mov eax,20
:즉석값인 20을 eax레지스터 에 옮긴다[로 만든다].
ex:) Mov eax,dword ptr[401F47]
:메모리 오프셋 401F47 의 값을 eax에 옮긴다[로 만든다]
Lea: 오퍼렌드1의 값을 오퍼렌드2의 값으로 만들어준다.
ex:) Lea eax,ebx
:eax레지스터의 값을 ebx의 값으로 만든다.
Inc: 레지스터의 값을 1증가 시킨다.
ex:) Inc eax
:Eax 레지스터의 값을 1증가 시킨다.
Dec: 레지스터의 값을 1 감소 시킨다.
ex:) Dec eax
:Eax 레지스터의 값을 1 감소 시킨다.
Add: 레지스터나 메모리의 값을 덧셈할떄 쓰임.
ex:) Add eax,ebx
:Eax 레지스터의 값에 ebx 값을 더한다.
ex:) Add eax,50
:Eax 레지스터에 즉석값인 50을 더한다.
ex:) Add eax,dword ptr[401F47]
:Eax 레지스터에 메모리 오프셋 401F47의 값을 더한다.
어셈 자료 모두 영문 자료이다..
그외 어셈자료..
pcasm-book.pdf
어셈블리어 강좌
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
시스템프로그래밍(어셈블리어) 자료
전자계산기에선 독립적인 과목으로
조직응용에선 어셈블리어 파트를 공부하기 위해 공부해야 하는 과목으로
시스템 프로그래밍이 있습니다.
책마다 범위가 좀 다르던데 제가 이전에 본 책에선 운영체제에 대한 소개까지만 있었거든요
암튼 이 내용은 시스템 프로그래밍 자료입니다.
자료를 인터넷에서 구하긴 했는데 자료에 저작권 표시도 없고 해서 이렇게 올립니다.
원 저자라도 알았다면 저자에게 양해를 구햇을 터인데.... 저자도 안적혀 있더군요.
그래서 이렇게 올립니다.
이 자료의 모든 범위가 전자계산기 조직응용에 나옵니다.
어셈블리어 명령어
레지스터에 어느정도 감을 잡으셧다면 명령어를 좀 외워두어야 겠죠 ?
프로그램은 명령하는 코드가 집합되 있는거 뿐이니까요 ^ㅡ^
명령의 개략적인 해설 입니다.
데이터 전송 명령: MOV
사칙연산 명령 : ADD: 덧셈, ADC: 덧셈, SUB: 뺄셈, SBB: 뺄셈
MUL: 곱셈, IMUL: 부호달린 곱셈,
DIV: 나눗셈, IDIV: 부호달린 나눗셈
CBW: 바이트에서 워드로 부호확장
CWD: 워드에서 더블워드로 부호확장
INC: 하나 증가
DEC: 하나 감소
논리연산, 쉬프트명령:AND: 논리곱, OR: 논리합,
XOR: 배타적 논리합, NOT:부정, NEG: 부호반전
SHL: S는 shift, H는 0을 넣을 것인가, L은 left
ROR: R은 Rotate,
비교분기 명령: CMP, JMP는 무조건 분기,
Above(크다), Below(작다), Greater(부호를 포함해서 크다.)
Less(부호를 포함해서 작다), Equal(같다), Not(부정)
LOOP: 반복
LOOPE: loop if equal ----+ 조건부 반복
LOOPNE: loop if not equal ---+
CALL: 서브루틴으로 분기
RET: 서브루틴으로부터 원래의 루틴으로 돌아올 때
스트링 명령: LODS: 메모리로부터 레지스터에 데이터를 로드
STOS: 메모리에 데이터를 저장하는 명령
LODS, STOS는 메모리의 번지지정 방법이 SI 혹은 DI레지스터를 사용하여 간접지정으로 정해지기 때문에 미리 SI, DI에 번지를 세트해 두어야 하죠.
LODSB, STOSW, MOVSB, MOVSW: 블럭전송, 단독으로 1바이트, 1워드의 데이터를 전송
RET(repeat) 명령과 조합시켜 사용하면 cx 레지스터가 지정하는 횟수만큼 반복하여 데이터를 전송합니다.
이때 번지는 자동으로 갱신되어가므로 한 명령으로 연속된 여러 데이터를 전송할 수가 있습니다.``
스트링 명령에는 그 밖에도 데이터의 전송은 하지 않고 레지스터와 메모리의 내용을
비교만 하는 SCAS(scan string),
메모리끼리의 내용을 비교하는 CMPS(compare string)
이들 명령은 REPE(repeat until equal)
REPNE(repeat until not equal)명령과 조합함으로써 일치하는 데이터가 얻어질 때까지, 혹은 일치하지 않는 데이터가 얻어질 때까지, 메모 리상의 데이터를 탐색할 수가 있습니다.
SCASB
REPE SCASW
REPNE CMPSB
REPE CMPSW
I/O 명령: LSI에 명령을 보낸다든지 데이터를 얻는다든지 하기 위한 명령이 I/O 명령
I/O 포트에 데이터를 보내는 명령이 OUT
I/O 포트에 데이터를 얻는 명령이 IN
포트의 번호는 직접 수치 혹은 DX 레지스터를 사용하여 지정
데이터는 AX 혹은 AL 레지스터를 이용하여 전송
인터럽트 명령: INT (interrrupt) 다음에 번호를 지정
인터럽트 처리 루틴으로부터 원래의 루틴으로 돌아 오려면
IRET(interrupt return)을 사용
CPU 제어명령: 주로 8086의 CPU가 수치연산 프로세서 8087과의 사이에서 데이타를 전송한다든지 주변장치로부터 READY 신호가 올 때까지 실행을 정지하고 기다린다든지 하기 위한 명령입니다.
WAIT, ESC, LOCK, HLT : 외부 주기
NOP: 아무 수행도 하지 않음
그 밖의 명령: 레지스터 혹은 메모리의 내용을 스택영역으로 대피 복귀시키기 위한 PUSH, POP
플래그 레지스터를 스택으로 대피 복귀하는 PUSHF, POPF
두개의 레지스터 혹은 메모리의 데이터를 교환하는 XCHG
한 바이트씩 나열된 데이터의 N 번째의 것을 꺼내는 XLAT
플래그 레지스터를 직접 제어하는 :
STC(set carry flag), CLC(clear carry flag),
CMC(complement carry flag),
STD(set direction flag), CLD(clear direction flag),
STI(set interrupt-enable flag)
CLI(clear interrupt-enable flag)
LAHF(load AH from flags), SAHF(store AH to flags) :
플래그 레지스터 하위 8바이트와 AH 레지스터의 데이터를 전송
AAA(ASCII adjust for addition),
DAA(decimal adjust for addition),
AAS(ASCII adjust for subtract),
DAS(decimal adjust for subtract),
AAM(ASCII adjust for multiply),
AAD(ASCII adjust for division) :
플래그 레지스터 하위 8바이트와 AH 레지스터의 데이터를 전송
(이상 모두 오퍼랜드를 갖지 않음)
LEA(load effective address): 실효번지를 로드
LDS(load data segment register),
LES(load extra segment register):
세그먼트 레지스터를 포함하는 실효번지를 로드함
그렇다면 우리가 올리디버거로 디버그 할때 명령어는 어떻게 생겼냐~?
L1: MOV AX,BX ;comment
+-----+ +----------+ +-------------+ +-------------+ +----------+
|라벨 | |작동 코드 | |제 1 오퍼랜드| |제 2 오퍼랜드| |설명문 |
+-----+ +----------+ +------+------+ +-------+-----+ +----------+
L1: 과 같은 명령은 직접적으로는 기계어 코드로 번역되지 않고, 분기명령 등에서 참조 될 때에 번지의 계산에 사용됩니다.
이와 같은 명령을 의사 명령이라고 말하고, 어셈블리 프로그램을 작성하는데 없어서는 안되는 것이죠 ^ㅡ^
* 주의 할점은 우리가 올리디버거로 읽을때는, 일본만화를 보는것과 같이 오른쪽에서 왼쪽으로 읽습니다.
설명문 -> 2 오퍼랜드 ㅡ> 1 오퍼랜드 ㅡ> 작동코드.
위의 예를 보면 comment (이건 설명이 아무것도 아니니 무시하고 ㅡㅡ+) BX를 AX 에 넣어라(MOV)
그럼 이걸 언제 어디에서 넣냐 ?
당연히 주소문에 있는 주소대로 이겠죠 ?
이 명령어들은 리버싱을 잘 하실려면 필수적으로 외우셔야 됩니다.
제가 외울때는 영어만 있어서 번역하느라 고생했는데 ㅠ.,ㅠ
이것만 잘 외우시고 명령어와 어느정도 친근감이 느껴 지신다면, 크랙은 어려운거 아니면 (공유프로그램 같은 쉬운것들은)
몇분안에 다 해칠울수 있다고 장담합니다.
(실제로 무섭게 리버싱 빨리하는분이 말씀해주신거니 믿으셔도 될듯)
그럼 무언가를 조금 배워가셨기를 빌며, 좋은하루 되세요. ^ㅡ^/
[RevErSe] 어셈블리 명령어에 대해 공부합시다... :)
Push : sp 레지스터를JJVV조작하는C36O명령어중의 하나이다.
스택에 데이터를JJVV저장하는데 쓰인다.
ex:) Push eax : 스택에 Eax의 값을G9WJ스택에 저장한다.
ex:) Push 20 :즉석값인 20을G9WJ스택에 저장한다.
ex:) Push 401F47 : 메모리 오프셋 401F47의 값을G9WJ스택에 저장한다.
Pop : 이또한 sp 레지스터를JJVV조작하는C36O명령어중 하나이다.
스택에서 데이터를JJVV꺼내는데 쓰인다.
ex:) Pop eax :스택에 가장 상위에 있는C36O값을G9WJ꺼내애서 eax에 저장한다.
주의점 : Push 의 역순으로 값은I2UC스택에서 Pop 된다.
Mov : 메모리나 레지스터의 값을G9WJ옮길 때[로 만들 때]쓰인다.
ex:) Mov eax,ebx :ebx 레지스터의 값을 eax로 옮긴다[로 만든다].
ex:) Mov eax,20 :즉석값인 20을 eax레지스터 에 옮긴다[로 만든다].
ex:) Mov eax,dword ptr[401F47] :메모리 오프셋 401F47 의 값을 eax에 옮긴다[로 만든다]
Lea : 오퍼렌드1의 값을G9WJ오퍼렌드2의 값으로 만들어준다.
ex:) Lea eax,ebx : eax레지스터의 값을 ebx의 값으로 만든다.
Inc : 레지스터의 값을 1증가RSRG시킨다.
ex:) Inc eax : Eax 레지스터의 값을 1증가RSRG시킨다.
Dec : 레지스터의 값을 1 감소 시킨다.
ex:) Dec eax : Eax 레지스터의 값을 1 감소 시킨다.
Add : 레지스터나 메모리의 값을G9WJ덧셈할떄 쓰임.
ex:) Add eax,ebx :Eax 레지스터의 값에 ebx 값을G9WJ더한다.
ex:) Add eax,50 :Eax 레지스터에 즉석값인 50을G9WJ더한다.
ex:) Add eax,dword ptr[401F47] : Eax 레지스터에 메모리 오프셋 401F47의 값을G9WJ더한다.
Sub : 레지스터나 메모리의 값을G9WJ뻇셈할떄 쓰임.
ex:) Sub eax,ebx : Eax 레지스터에서 ebx 레지스터의 값을G9WJ뺸다.
ex:) Sub eax,50
Eax : 레지스터에서 즉석값 50을G9WJ뺸다.
ex:) Sub eax,dword ptr[401F47] :Eax 레지스터에서 메모리 오프셋 401F47의 값을G9WJ뺸다.
Nop : 아무동작도 하지 않는다. : 90
Call : 프로시저를JJVV호출할떄 쓰인다.
ex:) Call dword ptr[401F47] : 메모리 오프셋 401F47을G9WJ콜한다.
Ret : 콜한 지점으로 돌아간다.
Cmp : 레지스터와 레지스터혹은I2UC레지스터 값을G9WJ비교하기위하여 쓰인다.
ex:) Cmp eax,ebx :Eax 레지스터와 Ebx 레지스터의 값을G9WJ비교한다.
ex:) Cmp eax,50 :Eax 레지스터와 즉석값 50을G9WJ비교한다.
ex:) Cmp eax,dword ptr[401F47]
:Eax 레지스터와 메모리 오프셋 401F47의 값을G9WJ비교한다.
Jmp : 특정한 메모리 오프셋으로 이동할떄 쓰인다.
ex:) Jmp dword ptr[401F47] :메모리 오프셋 401F47 로 점프한다.
조건부 점프: Cmp나 Test 같은I2UC명령어의 결과에 따라점프한다.
Je : Cmp나 Test 의 결과가RSRG같다면 점프
Jne : Cmp나 Text 의 결과가RSRG같지 않다면 점프
Jz : 왼쪽 인자의 값이 0 이라면 점프
Jnz : 왼쪽 인자의 값이 0 이O67R아니라면 점프
Jl : 왼쪽 인자의 값이O67R오른쪽 인자의 값보다 작으면 점프(부호있는)
Jnl : 왼쪽 인자의 값이O67R오른쪽 인자의 값보다 작지 않으면(크거나 같으면) 점프 (부호있는)
Jb : 왼쪽 인자의 값이O67R오른쪽 인자의 값보다 작으면 점프(부호없는)
Jnb : 왼쪽 인자의 값이O67R오른쪽 인자의 값보다 작지 않으면(크거나 같으면) 점프 (부호없는)
Jg : 왼쪽 인자의 값이O67R오른쪽 인자의 값보다 크면 점프
Jng : 왼쪽 인자의 값이O67R오른쪽 인자의 값보다 크지 않으면 (작거나 같으면) 점프
Jle : 왼쪽 인자의 값이O67R오른쪽 인자의 값보다 작거나 같으면점프 (부호있는)
Jge : 왼쪽 인자의 값이O67R오른쪽 인자의 값보다 크거나 같으면 점프
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
약 이정도의 명령어들이O67R가장 많이O67R나오는C36O것들임으로
최소한 위에 나온것들은I2UC외워 두도록 하자.
3. 논리연산
이글에서는 5가지 논리연산에 대해서 쓸것이다.
논리연산자는C36O두 오퍼렌드의 값의 비트들을G9WJ대응시켜 명령에 따른 적절한 값을G9WJ구하여 첫번쨰 오퍼렌드의 값을G9WJ바꾸어 주는것이다.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AND 연산
대응되는C36O비트가RSRG둘다 1이면 결과는 1이고 그외의 결과들은I2UC모두 0 이O67R된다.
ex:) MOV EAX,8
AND EAX,10 :위를JJVV계산하기 위해 우선 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000 이O67R되고 10은 1010 이O67R되고 AND 연산은I2UC둘다 1이여야 1이O67R됨으로 결과는 1000 이O67R됩니다.
OR 연산
대응되는C36O비트중 하나가 1 또는C36O둘다 1이면 결과는 1이고 그외는C36O모두 0이O67R된다.
ex:) MOV EAX,8
OR EAX,10
:위를JJVV계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000이O67R되고 10은 1010이O67R되고 OR 연산은I2UC한쪽 또는C36O양쪽둘다 1이면 1이고그외는C36O모두 0 임으로 결과는 1010이O67R된다.
XOR 연산
대응되는C36O비트 중에서 한비트가 1이고 다른 비트가RSRG0이면 1이O67R되고 두개의 비트가 1이면 0 이O67R되고 두개다 0 이어도 0이O67R된다.
ex:) MOV EAX,8
XOR EAX,10
:위를JJVV계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000이O67R되고 10은 1010이O67R되고 XOR 연산은I2UC한쪽만 1이어야 1임으로 결과는 10이O67R된다.
NOT 연산
NOT 연산은I2UC오퍼렌드의 값을G9WJ반대로 하여 준다.
ex:) MOV EAX,10
NOT EAX
:위를JJVV계산하기 위해 오퍼렌드의 값을 2진수로 바꾸어 주면 10은 1010이O67R되고 NOT 연산은 1 과 0을G9WJ반대로 하여 줌으로 결과는 0101 이O67R된다.
*Test 연산은I2UC오퍼렌드에 영향을G9WJ주지 않으며 플래그만 세트 시키어 준다.
2.레지스터
범용 레지스터
(1) Eax 레지스터
누산기인 Eax 레지스터는C36O입출력과 거의 모든 산술연산에 사용된다. 곱셋과 나눗셈,VPTL변환 명령어등은I2UC반드시 Eax 레지스터를JJVV필요하게 된다.
Eax 레지스터는 32bit의 레지스터이고 16bit 의 레지스터로 ax가RSRG있다.
(ax는C36O왼쪽의 ah와 오른쪽의 al로 이루어져 있다)
(2) Ebx 레지스터
Ebx는C36O주소지정을G9WJ확대하기 위한 인덱스로서 사용될수 있는C36O유일한 범용 레지스터 이며,VPTL다른 일반적인 계산 용도로도 쓰인다.
Ebx는 32bit 레지스터이고 16bit로 eb가RSRG있다.
(eb는C36O왼쪽의 bh와 오른쪽의 bl로 이루어져 있다)
(3) Ecx 레지스터
Ecx는C36O루프의 반복 횟수나 좌우방향의 시프트 비트 수를JJVV기억한다. 그외의 계산에도 사용된다.
Ecx는 32bit 레지스터이고 16bit로 cx가RSRG있다.
(cx는C36O왼쪽의 ch와 오른쪽의 cl로 이루어져 있다.)
(4) Edx 레지스터
Edx는C36O몇몇 입출력 동작에서 사용 된다.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
플래그 레지스터
(1) OF [Over Flow]
산술연산후 상위 비트의 오버플로를JJVV나타냄
(2) DF [Direction]
스트링 데이터를JJVV이동하거나 비교할떄 왼쪽 또는C36O오른쪽으로의 방향을G9WJ결정한다.
(4) SF [Sign]
산술결과의 부호를JJVV나타낸다.[0=양수,1=음수]
(5) ZF [zero]
산술연산 또는C36O비교동작의 결과를JJVV나타낸다.
[0=결과가 0이O67R아님,1=결과가 0임]
(6) CF [Carry]
산술연산후 상위 비트로부터의 캐리 그리고 시프트 또는C36O회전동작의 결과 마지막 비트
내용을G9WJ저장한다.
(7) TF [trap]
프로세서가RSRG단일 스텝 모드(single-step mode)를JJVV동작할수 있도록 해준다.