[libasm] 어셈블리 명령어(opcode) 정리
Opcode로 사용하는 어셈블리 명령어는 엄청나게 많다. 자주 사용한다는 몇 가지 명령어만 정리해봤다
Opcode로 사용하는 어셈블리 명령어는 엄청나게 많다. 자주 사용한다는 몇 가지 명령어만 정리해봤다. 추가 예정...
1. 조작 명령어
call : 함수 호출
ret : call로 호출된 함수를 종료하고 그 다음 명령줄로 이동
nop : 아무것도 하지 않음
jmp : 분기(라벨) 실행.
조건 점프 명령어 : cmp 연산 결과에 따라 jmp
je : cmp A B 에서 A = B 일때 특정 라벨로 jmp
jne : cmp A B 에서 A != B 일때 특정 라벨로 jmp
ja : cmp A B 에서 A > B 일때 특정 라벨로 jmp
jb : cmp A B 에서 A < B 일때 특정 라벨로 jmp
jae : A >= B
jbe : A <= B
플래그 점프 명령어 :
2. 데이터 전송 명령어
push : 스택에 값을 넣음
pop : 스택에서 값을 가져옴
mov : 인자2 값을 인자1에 대입(전달)
lea : 인자2 주소를 인자1에 대입(전달)
3. 산술 명령어
inc : 인자의 값을 1 증가
dec : 인자의 값을 1 감소
add : 인자2 값을 인자1에 더함
sub : 인자2 값을 인자1에서 뺌
cmp : 인자1,2의 값을 비교. 주로 위의 조건점프 명령어와 세트로 사용한다.
test : 인자1과 인자2를 AND 연산한다. 이 연산의 결과는 ZF(zero flag)에만 영향을 미치고 Operand 자체에는 영향을 미치지 않는다.
보통 rax의 값이 0인지 확인할 때
rax 0, 0
이런 식으로 사용된다.만약 TEST의 연산결과가 0이라면 ZF는 1로, 연산결과가 1이라면 ZF는 0으로 세트된다.
명령어와 레지스터에 대한 이해가 있다면 어셈블리 프로그램을 작성할 수 있다. 다음 글 [libasm] strlen 함수를 어셈블리어로 짠다면?에서 실제 프로그램을 작성해보자.
Last updated