어셈블리

어셈블리로 보는 산술연산 과정

우대비 2022. 8. 16. 13:47
반응형
a = b + 3; // 덧셈 add
    1. 00F9182B  mov         eax,dword ptr [b (0F9A004h)]  
    2. 00F91830  add         eax,3  
    3. 00F91833  mov         dword ptr [a (0F9A000h)],eax

1. 레지스터 eax에 b의 값을 넣음
2. eax에 3을 더함
3. a에 eax의 값을 넣음

 

a = b - 3; // 뺄셈 sub
    1. 00F91838  mov         eax,dword ptr [b (0F9A004h)]  
    2. 00F9183D  sub         eax,3  
    3. 00F91840  mov         dword ptr [a (0F9A000h)],eax

1. 레지스터 eax에 b의 값을 넣음
2. eax에 3을 뺌
3. a에 eax의 값을 넣음

 

a = b * 3;// 곱셈 mul
    1. 00F91845  imul        eax,dword ptr [b (0F9A004h)],3  
    2. 00F9184C  mov         dword ptr [a (0F9A000h)],eax

1. b의 값에 3을 곱해서 eax에 넣음
2. a에 eax의 값을 넣음

 

a = b / 3; // 나눗셈 div
    1. 00F91851  mov         eax,dword ptr [b (0F9A004h)]  
    2. 00F91856  cdq  
    3. 00F91857  mov         ecx,3  
    4. 00F9185C  idiv        eax,ecx  
    5. 00F9185E  mov         dword ptr [a (0F9A000h)],eax

1. eax에 b의 값을 넣음
2. 나눗셈을 위해 피젯수(eax)의 사이즈를 확장
     (제수(3)가 32bit이면 피젯수(eax)는 64bit여야 32bit 값을 가지는 몫을 얻을 수 있음 )
3. ecx에 3을 넣음
4. eax를 ecx로 나눔
5. 나머지값을 제외한 나눈값을 a에 넣음

 

a = b % 3;// 나머지 div
    1. 00F91863  mov         eax,dword ptr [b (0F9A004h)]  
    2. 00F91868  cdq  
    3. 00F91869  mov         ecx,3  
    4. 00F9186E  idiv        eax,ecx  
    5. 00F91870  mov         dword ptr [a (0F9A000h)],edx

1. eax에 b의 값을 넣음
2. 나눗셈을 위해 피젯수(eax)의 사이즈를 확장
      (제수(3)가 32bit이면 피젯수(eax)는 64bit여야 32bit 값을 가지는 몫을 얻을 수 있음 )
3. ecx에 3을 넣음
4. eax를 ecx로 나눔
5. 나눈값을 제외한 나머지 값만 a에 넣음

 

a += 3; // a = a + 3;

a -= 3;

a *= 3;

a /= 3;

a %= 3;
// 증감 연산자

a = a + 1; // add eax, 1 -> inc eax

b = 3 + a++;
    1. 00CF18CE  mov         eax,dword ptr [a (0CFA000h)]  
    2. 00CF18D3  add         eax,3  
    3. 00CF18D6  mov         dword ptr [b (0CFA004h)],eax  
    4. 00CF18DB  mov         ecx,dword ptr [a (0CFA000h)]  
    5. 00CF18E1  add         ecx,1  
    6. 00CF18E4  mov         dword ptr [a (0CFA000h)],ecx

1. 레지스터 eax에 a의 값을 넣음
2. eax에 3을 더함 (3 + a)
3. b에 eax의 값을 넣음 (b = 3 + a)
4. ecx에 a의 값을 넣음
5. ecx에 1을 더함
6. a에 ecx의 값을 넣음 (a += 1)

 

b = 3 + ++a;
    1. 00CF18EA  mov         eax,dword ptr [a (0CFA000h)]  
    2. 00CF18EF  add         eax,1  
    3. 00CF18F2  mov         dword ptr [a (0CFA000h)],eax  
    4. 00CF18F7  mov         ecx,dword ptr [a (0CFA000h)]  
    5. 00CF18FD  add         ecx,3  
    6. 00CF1900  mov         dword ptr [b (0CFA004h)],ecx

1. eax에 a의 값을 넣음
2. eax에 1을 더함
3. a에 eax의 값을 넣음 (a += 1)
4. ecx에 a의 값을 넣음
5. ecx에 3을 더함
6. b에 ecx의 값을 넣음 (b = 3 + a)

 

b = 3 + a--;
    1. 00C11906  mov         eax,dword ptr [a (0C1A000h)]  
    2. 00C1190B  add         eax,3  
    3. 00C1190E  mov         dword ptr [b (0C1A004h)],eax  
    4. 00C11913  mov         ecx,dword ptr [a (0C1A000h)]  
    5. 00C11919  sub         ecx,1  
    6. 00C1191C  mov         dword ptr [a (0C1A000h)],ecx

1. 레지스터 eax에 a의 값을 넣음
2. eax에 3을 더함 (3 + a)
3. b에 eax의 값을 넣음 (b = 3 + a)
4. ecx에 a의 값을 넣음
5. ecx에 1을 뺌
6. a에 ecx의 값을 넣음 (a -= 1)

 

b = 3 + --a;
    1. 00C11922  mov         eax,dword ptr [a (0C1A000h)]  
    2. 00C11927  sub         eax,1  
    3. 00C1192A  mov         dword ptr [a (0C1A000h)],eax  
    4. 00C1192F  mov         ecx,dword ptr [a (0C1A000h)]  
    5. 00C11935  add         ecx,3  
    6. 00C11938  mov         dword ptr [b (0C1A004h)],ecx

1. eax에 a의 값을 넣음
2. eax에 1을 뺌
3. a에 eax의 값을 넣음 (a += 1)
4. ecx에 a의 값을 넣음
5. ecx에 3을 더함
6. b에 ecx의 값을 넣음 (b = 3 + a)

반응형
LIST

'어셈블리' 카테고리의 다른 글

어셈블리로 보는 비트연산  (0) 2022.08.16
어셈블리로 보는 비교연산  (0) 2022.08.16
어셈블리 함수 기초  (0) 2022.08.11
어셈블리 배열과 주소  (0) 2022.08.11
어셈블리 반복문  (0) 2022.08.11