명령어 정리
(본 명령어는 AT&T를 기준으로 작성됨)
Movsbl :부호 없는 1byte 정수를 4byte 정수로 변환하는 명령어
ex) movesbl 0xffffffff(%ebp), %eax ==> [ebp-1]위치의 부호없는 1byte정수를 eax(4바이트레지스터)로 이동 시킨다(변환시킨다.)
MOVZX(Move with Zero-Extend)
BYTE나 WORD크기의 피연산자를 WORD나 DWORD크기로 확장하고 남은 비트는 0으로 채운다.
ex. MOVZX reg32, reg16
TEST Vs CMP
if문을 예로 들때 비교대상이 있을 경우 (if(a<10))와 비교 대상이 없을 경우(if(a))가 있다.
test명령어는 조건대상의 현재 상태를 모르기 때문에 값이 뭔지를 알아내기 위해 AND연산을 이용해 참인지 거짓인지를 판별한다.
REP(Repeat String)
ECX레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX>0 동안 반복한다.
ex) REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] :ECX가 0보다 작을때까지 ESI가 가르키는 위치의 4바이트 데이터를 EDI가 가르키는 위치로 옴기는 과정을 반복한다.
IMUL(Integer Multiplication)
부호 있는 al, ax, eax의 값을 피연산자와 곱한다. 연산결과에 따라 CF, OF가 세트될 수 있다.
ex. IMUL r/m8 : 단일 피연산자이고 피연산자를 al, ax, eax에 곱한다.
IMUL r16(destination), r/m16(value) : value를 al, ax, eax와 곱해서 destination에 저장
IMUL r16(destination), r/m8(value), imm8(value) : value끼리 곱해서 destination에 저장
(연산 결과가 destination 레지스터의 크기보다 크다면 OF, CF가 세트된다.)
source 자리에는 레지스터나 주소가 올 수 있으며, 즉시값(상수)은 올 수 없다.
source에 1바이트가 오면 AL(1바이트)과 곱해서 AX(2바이트)에 저장된다. source에 2바이트가 오면 AX와 곱해서 DX:AX에 저장한다. source가 4바이트라면, EAX와 곱해서 EDX:EAX에 저장된다.
(1자리의 숫자 두개를 곱하면 최고 2자리의 숫자가 나올 수 있다. 따라서 1바이트를 2개 곱하면 2바이트의 저장공간이 필요하다.)
leave:
mov esp,ebp //형성했던 스택에서 해당 스택프레임을 해제하기전 esp값을 ebp위치의 주소로 바꾼다.(스택프레임을 끝(?) 위해서)
pop ebp //
ret
pop eip
jmp eip