농소
어셈블리 사칙연산(ADD, SUB, MUL, IMUL, DIV, IDIV), 비트연산, 논리연산 본문
ADD : 덧셈
어셈블에서는 c와는 다르게 +연산자를 사용하지 않고, add명령어를 통해 덧셈을 한다.
mov를 통해 레이블 num의 메모리값에 10을 넣어주고 레지스터 eax에 20을 넣어준다.
그 후 add명령어를 통해 ( [num] = [num] + eax ) 덧셈을 해준다.
즉, 결과는 10 + 20 = 30이 나오게된다.
SUB : 뺄셈
add와 마찬가지로 매커니즘은 동일하고 +연산이 -연산의 차이밖에 없다.
위 코드는 좀전에 했던 코드의 add 명령어를 sub로 변경한 코드이다
즉 [num] = [num] - eax => -10의 결과값이 나온다.
MUL : 곱셈
- MUL( Unsigned ) 부호가 없는 곱셈 처리
- IMUL( Signed ) 부호가 있는 곱셈 처리
1). MUL
만약 2바이트를 곱했을때 결과값이 2바이트 크기를 넘어가게 되면
상위2바이트는 dx에, 하위 2바이트는 ax에 저장이된다.
ex) 10000 * 10000
dx = 1525
ax = 57600
dx = 0000 0101 1111 0101
ax = 1110 0001 0000 0000
즉 0000 0101 1111 0101 1110 0001 0000 0000 = 10000 * 10000 이 된다
2). IMUL
- 피연산자가 1부터 3개까지 올수 있고 나머지는 MUL과 동일
DIV : 나눗셈
- DIV( Unsigned ) 부호가 없는 나눗셈 처리
- IDIV( Signed ) 부호가 있는 나눗셈 처리
1). DIV
오퍼레이션을 참고하면 크기에따라서 몫과 나머지가 저장되는곳이 다름을 알 수 있다.
|
몫 |
나머지 |
Word/Byte = 8bit |
AL |
AH |
Dword/Word = 16bit |
AX |
DX |
Quadword/Dword = 32bit |
EAX |
DAX |
Doublequadword/Quadword = 64bit |
RAX |
RDX |
< 몫과 나머지 >
위 표중에 Word/Byte 를 한번 표현해 보겠습니다.
2바이트인 256 과 1바이트인 5 를 나눴더니 307이라는 결과값이 나왔다.
이 10진수를 2진수로 변환 해 보면
0000 0001 0011 0011
AH | AL
즉, 몫은 0011 0011 = 51이 나오고
나머지는 0000 0001 = 1이 나오게된다.
2). IDIV
비트 연산 : shift
논리연산 : and, or, xor
앞서 나눗셈에 대하여 작성했던 코드를 볼때 몫과 나머지를 보기위해서 2진수로 변환 한 뒤 결과를 확인했다.
하지만 그렇게 보기엔 너무 불편하므로 논리연산을 통한 마스킹기법과 shift를 이용하여
몫과 나머지를 구해본다.
'Security > System Hacking' 카테고리의 다른 글
nasm 반복문 연습 (0) | 2018.01.19 |
---|---|
asm 형변환, 관계연산, 제어문 (0) | 2018.01.18 |
레지스터, INTEL 명령어 (0) | 2018.01.16 |
3. ELF파일 구조, nasm 데이터표현 (0) | 2018.01.13 |
2. 컴파일 과정, ELF 실행파일 (0) | 2018.01.12 |