R136A1
어셈블리어 본문
구조
명령어 피연산자1, 피연산자2, 상수
opcode operand1, operand2, immediately
데이터 크기 표현
[부호X]
BYTE 1 BYTE
WORD 2 BYTE
DWORD 4 BYTE
QWORD 8 BYTE
[부호O]
SBYTE 1 BYTE
SWORD 2 BYTE
SDWORD 4 BYTE
SQWORD 8 BYTE
피연산자 종류
mem (memory) 메모리
label 지정된 레이블(특정 구간을 만들 수 있다)
imm (immediately) 즉시 값(상수) 0x__
reg (register) 범용 레지스터
명령어 opcode
INC increase 피연산자 +1
DEC decrease 피연산자 -1
ADD Destination에 Source값을 더해서 Destination에 저장
ADC ADD+CARRY, Carry에 있는 값까지 더하기 (뭐지...)
SUB Destination에 Source값을 빼서 Destination에 저장
SBB SUB-CARRY, Carry에 있는 값까지 빼기
MUL 피연산자에 따라 (부호없이) 특정 레지스터 값을 곱함 / 결과에 따라 OF, ZF가 세트
8bit × AL => AX 저장
16bit × AX => DX:AX 저장 //최대 32bit로 상위 16bit는 DX에, 하위 16bit는 AX에 저장
m.blog.naver.com/shackerz/220441094174
MOV Destination에 Source 데이터를 복사
MOVZX Destination에 Source 데이터를 복사하고 도착지의 남은 비트를 0으로 채운다 (*단, 부호 없을 때만 사용)
MOVSX Destination에 Source 데이터를 복사하고 도착지의 남은 비트를 부호비트로 채운다 (*단, 부호 있을 때만 사용)
LEA Destination에 Source 주소를 복사
CMP Compare ZF와 세트로 두 피연산자를 비교하여 같으면 CMP값은 0 ZF는 1 / 다르면 CMP값은 1 ZF는 0
CF와 세트로 두 피연산자를 비교하여 앞이 크면 0 작으면 1
비교: 첫번째 피연산자 - 두번째 피연산자
TEST Test 피연산자끼리 AND연산하여 플래그를 세팅, 보통 해당 값의 참, 거짓을 판별 시 사용
보통 함수의 리턴값과 특정 값 0, 1 을 연산하여 같은지 비교할 때 씀 (CMP와 달리 값 저장 없이 ZF만 세팅)
ZF와 세트로 두 피연산자를 비교하여 같으면 ZF는 1 / ZF는 0
// CMP, TEST는 FLAG를 세팅하기때문에 분기문에 영향을 줄 수 있는 것이다.
JMP jump 원하는 레이블로 이동 //일종의 분기문. FLAG를 참조해 IF의 역할을 함
JA jump if above CMP로 두 값 비교 시 > 면 JMP
JB jump if below
JE jump if equal == JZ jump zero // CMP의 값이 같아서 ZF(Zero Flag)가 1로 셋팅된 경우
JAE == JNB
JBE == JNA
JNE == JNZ
CALL 함수 호출 시 사용, JMP와 같이 프로그램 실행 흐름이 변경되지만
return address 를 스택에 저장해 호출 후 원래 위치로 되돌릴 수 있음
LEAVE
mov esp, ebp
pop ebp
RET
pop eip
jmp eip
플래그 flag
1 setting / 0 clear
ZF Zero Flag 연산 결과가 0인가 표시( 0이면 1, ZR(zero) / 1이면 0, NZ(not zero) )
OF Overflow Flag 음수 연산에서 연산 결과가 주어진 레지스터 길이를 초과할 때 1
CF Carry Flag 양수 연산에서 연산 결과가 주어진 레지스터 길이를 초과할 때 1
- - - - -
AF Anxiliary carry Flag 10진수 덧셈, 뺄셈 연산에서 보정이 필요할 때 자리 올림/내림
PF Parity Flag 연산 결과 1(binary)이 짝수개임
SF Sign Flag 연산 결과가 음수일 때
DF Direction Flag 문자열 관련 명령에 사용 - enable 역방향 접근 / disable 순방향 접근
제어 플래그 Control Flag CPU동작 제어, 문자열 처리명령의 제어
범용 레지스터 (4byte)
일반 레지스터_데이터 저장
일반 레지스터는 위와 같이 나누어 사용 가능(효율성, 호환성)
EAX 산술, 논리연산, 또는 함수의 반환값 저장
EDX 부호 확장 명령 - 큰 수의 곱셈 또는 나눗셈 연산 (EAX와 함께)
ECX 카운터 레지스터. 반복 명령어 시 횟수 저장
EBX 메모리 주소를 저장 (ESI, EDI 레지스터와 결합하여 사용)
ㄴ주소 지정 방식 1. 직접지정(JMP 1000) 2. 간접지정(JMP EBX)
- - - - - - - - - - -
일반 주소 레지스터
Pointer Register(포인터 레지스터) 스택 관련
EBP 스택 프레임의 처음 메모리 주소 저장
ESP 스택 프레임의 끝 메모리 주소 저장 *PUSH POP 명령에 따라 4Byte씩 유동
스택: 지역 변수가 할당되는 곳 / 스택프레임: 함수를 호출하면 생기는 프레임
Index Register(인덱스 레지스터) 문자열 관련
ESI 데이터 조작하거나 복사 시 원본 데이터의 메모리 주소 저장
EDI 데이터 조작하거나 복사 시 목적지의 메모리 주소 저장
Segment Register(세그먼트 레지스터) 세그먼트 주소 담겨있음
CS Code Segment 코드 세그먼트의 시작번지
IP(Instrunction Pointer) 레지스터가 가진 offset값과 함께 실행을 위한 명령어의 주소를 참조하게 됨
SS Stack Segment 스택 세그먼트의 시작번지
SP 혹은 BP 레지스터가 가진 offset값과 함께 스택 영역의 주소를 참조하게 됨
DS Data Segment 데이터 세그먼트의 시작번지
AX, CX, DX, SI, DI 레지스터가 가진 offset값과 함께 데이터 영역의 주소를 참조하게 됨
m.blog.naver.com/shackerz/220464261071
배열
char ch[6] = "hello";
DWORD PTR DS:[주소]
- DWORD: 4byte 공간 / PTR / DS:[주소]
- data 영역 해당 주소에 있는 4 byte 공간의 값
WORD PTR SS:[주소]
- WORD: 2byte 공간 / PTR / SS:[주소]
- stack 영역 해당 주소에 있는 4 byte 공간의 값
MOV ①,②
①공간에 ②값을 저장
*DWORD 4byte 크기면 E□X *WORD 2byte 크기면 □X