일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- NODE_VERSION
- ERR_PNPM_NO_GLOBAL_BIN_DIR
- Error:error:0308010C:digital envelope routines::unsupported
- netlify variables
- credential error
- SASS
- react
- AWS CodeBuild
- S3
- expo
- 이미지 맵
- nodejs
- Unable to find the global bin directory
- EC2
- 김골라
- 어셈블리어
- ogr2ogr
- AWS CodePipeline
- AWS
- Sequelize Error: Dialect needs to be explicitly supplied as of v4.0.0
- GeoJSON object too complex/large
- 반응형 페이지 좌표 변환
- can't getting credentials
- 이미지 좌표 추출
- CSS
- aws ec2
- C언어
- 설치완료안됨
- rwdImageMaps
- node
- Today
- Total
ImFe's study
어셈블리어 본문
MOV)
전에 포스팅 한 글에도 나와있지만
mov a, b 는 b를 a에 넣는것을 의미합니다
mov 목적지, 값 으로 생각하면 되겠네요
EX)
AX를 56h와 같게 하려면
MOV AX,56h //AX의 값이 56h가 된다.
값으로 다른 레지스터를 사용할수도있습니다.
MOV AX,BX //AX의 값이 BX로 바뀐다. BX의 값이 nn이라면 AX또한 nn이 됩니다.
XCHG)
XCHG연산자는 두 레지스터를 바꾸는 역할을 합니다. (exchange)
EX)
MOV DX,56h
MOV AX,3Fh
XCHG DX,AX // 값을 교환함으로써 DX는 3Fh, AX는 56h가 됩니다.
+8비트 레지스터와 16비트가 교환되지 않도록 해야합니다. 해당 코드는 의미가 없습니다.
INC(increase)와DEC(decrease) // 피연산자(operand)의 값을 1만큼 변경시킵니다.
MOV DX,50h //DX의 값을 50h로 설정
INC DX //DX의 값을 1만큼 증가 51h가 되었음. (=DX++)
MOV DX,50h //DX의 값을 50h로 설정
DEC DX //DX의 값을 1만큼 감소, 4F가 되었음. (=DX--)
스택 조작에 관련된 연산자)
스택 조작에 사용되는 스택 연산자는 6개가 있으며, 그중 2개가 가장 많이 사용됩니다. (POP과 PUSH)
만약에 스택에 있는 AX에 값을 일시적으로 저장한다고 가정하면
PUSH AX
라고 입력하면 됩니다.
또 원래 값으로 돌아가려면 POP을 이용하면 됩니다.
POP AX
주의할점은 스택이 16비트 레지스터만 받아들인다는 점입니다.
다음 예제를 통해 위에서 서술한 항목들을 다시 확인해보겠습니다.
MOV AX,51h //AX에 51h값을 넣습니다.
MOV BX,4Fh //BX에 4Fh값을 넣습니다.
XCHG AX,BX //AX와 BX값을 교환합니다.
PUSH AX // AX를 스택에 지정해줍니다.
MOV AX,34h // AX의 값을 34h로 지정합니다.
POP BX // 원래의 BX값으로 돌아감
PUSH BX //BX값은 4Fh
POP AX //원래의 AX값으로 돌아갑니다. 4Fh가 됩니다.
어셈블리 사칙연산)
사칙연산을 하는 어셈블리어는 ADD,SUB,MUL,DIV가 있습니다. (더하기, 빼기, 곱하기, 나누기)
ADD)
ADD의 문장 구조는 다음과 같습니다.
ADD 레지스터1, 레지스터2
ADD 레지스터, 값
EX)
MOV AX,5h //AX의 값은 5h
MOV BX,4h //BX의 값은 4h
ADD AX,BX //AX에 BX를 더하고, 그 값을 AX에 저장(5h+4h = 9h = AX)
+)ADD AX,4h //AX=5h, 여기에 4h를 더합니다. 최종 AX의 값은 5h+4h=9h
SUB)
SUB의 문장 구조는 다음과 같습니다.
SUB 레지스터1, 레지스터2
SUB 레지스터, 값
MOV BX,4Fh //BX의 값은 4Fh
SUB BX,5h //BX의 값에서 5h를 뺌. 최종 BX의 값은 4A
MUL)
MUL 레지스터는 하나의 피연산자(operand)만 필요로 합니다. 프로세스가 레지스터를 AX또는 AH와 곱하기를 원한다고 추정하기 때문이라네요.(+ AL, AX, EAX)
MUL의 문장 구조는 다음과 같습니다.
MOV AX,5h
MOV BX,4Fh
MUL BX
AX값은 결국 18B(4Fh * 5h)가 됩니다.
DIV)
DIV는 MUL과 동일하게 하나의 피연산자만 필요로합니다.
DIV의 문장 구조는 다음과 같습니다.
MOV AX,5h
MOV BX,4Fh
DIV BX
AX의 값은 Fh입니다. (4Fh / 5h = Fh)
4Fh = 79
5h = 5
79 / 5 = 15.8
Fh=15
비트 연산자들에 대한 정보는 추후 추가하겠습니다.
'Reversing' 카테고리의 다른 글
스택, 함수에필로그, 프롤로그 (0) | 2020.05.19 |
---|---|
InstructionCycle, 레지스터, 함수호출규약, DataSize, FLAGS, Instruction Format (0) | 2020.05.14 |
리버스 엔지니어링이란 (0) | 2020.05.14 |
어셈블리 코드 해석 (0) | 2020.04.12 |
어셈블리어로 Hello world 출력하고 디버깅해보기 (0) | 2020.04.11 |