2016-09-15 1 views
-2

업데이트, 미안 :어 번역 작은 코드 조립 - 코드와> C

어셈블리 :

01: cmp edi, 5 
02: ja   short loc_10001141 
03: jmp ds:off_100011A4[edi*4] 
04: loc_10001125: 
05: mov esi, 40h 
06: jmp short loc_10001145 
07: loc_1000112C: 
08: mov esi, 20h 
09: jmp short loc_10001145 
10: loc_10001133: 
11: mov esi, 38h 
12: jmp short loc_10001145 
13: loc_1000113A: 
14: mov esi, 30h 
15: jmp short loc_10001145 
16: loc_10001141: 
17: mov esi, [esp+0Ch] 
18: … 
19: off_100011A4 dd offset loc_10001125 
20:  dd offset loc_10001125 
21:  dd offset loc_1000113A 
22:  dd offset loc_1000112C 
23:  dd offset loc_10001133 
24:  dd offset loc_1000113A 

의사 C : 나는 작은 어셈블리 코드를 변환 할 필요가

switch(edi) { 
case 0: 
case 1: 
// goto loc_10001125; 
    esi = 0x40; 
    break; 
case 2: 
case 5: 
// goto loc_1000113A; 
    esi = 0x30; 
    break; 
case 3: 
// goto loc_1000112C; 
    esi = 0x20; 
    break; 
case 4: 
// goto loc_10001133; 
    esi = 0x38; 
    break; 
default: 
// goto loc_10001141; 
    esi = *(esp+0xC) 
    break; 
} 

C로, 그리고 어셈블리 프로그래밍의 총 멍청한 놈으로, 나는 너의 도움이 필요해.

연습 문제가 책에서 나 왔기 때문에 이미 해결책을 찾았지만 이해하는 데 도움이되지 않습니다.

그래서 솔루션의 어셈블리 코드와 스위치 사이의 관계를 이해하려고 노력했습니다. 이것은 코드가 어셈블리 코드로 어떻게 실행되는지 정확히 알 수 없기 때문입니다.

(업데이트 : 좀 더 명확/특정 질문 ^^ 만들려고 노력) : 점프 테이블 작동 않습니다 어떻게, 어떻게 코드가 실행 - 어셈블리 코드가 아닌 C를 -;)

내가하지 내가 충분히 분명하면, 내가 말했듯이, 난 여기 초보자이고, 영어는 제 모국어가 아닙니다! ^^

+5

질문에 코드를 게시하십시오. – Banex

+0

a) 코드를 게시하고 b) 사용하는 플랫폼을 알려준 경우 도움이 될 수 있습니다. 링크를 제공하지 마십시오 ... – 4386427

+2

당신이 링크 한 책이 합법적으로 무료로 제공되지 않는다고 합리적으로 확신합니다 (링크를 불법과 비도덕적인 사이에 연결하는 것). – UnholySheep

답변

1

다음은 코드입니다. 조립

01: cmp  edi, 5 
02: ja  short loc_10001141  
03: jmp  ds:off_100011A4[edi*4] 
04: loc_10001125:     
05: mov  esi, 40h    
06: jmp  short loc_10001145 
07: loc_1000112C:     
08: mov  esi, 20h    
09: jmp  short loc_10001145 
10: loc_10001133:     
11: mov  esi, 38h    
12: jmp  short loc_10001145 
13: loc_1000113A:     
14: mov  esi, 30h    
15: jmp  short loc_10001145 
16: loc_10001141:     
17: mov  esi, [esp+0Ch]  
18: ... 
19: off_100011A4 dd offset loc_10001125 
20: dd offset loc_10001125   
21: dd offset loc_1000113A 
22: dd offset loc_1000112C 
23: dd offset loc_10001133 
24: dd offset loc_1000113A 

의사 C

switch(edi) { 
    case 0: 
    case 1: 
    // goto loc_10001125; 
    esi = 0x40; 
    break; 
    case 2: 
    case 5: 
    // goto loc_1000113A; 
    esi = 0x30; 
    break; 
    case 3: 
    // goto loc_1000112C; 
    esi = 0x20; 
    break; 
    case 4: 
    // goto loc_10001133; 
    esi = 0x38; 
    break; 
    default: 
    // goto loc_10001141; 
    esi = *(esp+0xC) 
    break; 
} 
... 

어셈블리 코드를 분석함으로써, 당신은 EDI == 1과 EDI == 0에 대한 것을 볼 수 있습니다, 당신은 동일한 명령으로 이동합니다. edi == 2 및 edi == 5에도 동일하게 적용됩니다. Pseudo C에서는 이상한 명령문 순서를 사용하지만 그 중 일부는 끝에 깰 수 있습니다.

edi == 2로 상상해보십시오. 의사 C의 사례 2로 이동 한 다음 의사 C의 사례 5로 이동하여 0x30을 esi에 할당합니다. edi == 5라고 상상해보십시오, 의사 C의 사례 5로 가서 0x30을 esi에 할당하십시오. Pseudo C는 명령어가 적기 때문에 이렇게 만들어지며 마지막에는 실행 파일을 작게 만듭니다.