2016-11-20 11 views
0

이 코드는 C에서 기본적으로 배열에 대한 포인터와 인덱스의 배열 값을 변경하는 함수를 포함하는 구조체입니다 0인라인 어셈블리를 사용하여 구조체에 포함 된 배열에 대한 포인터 변경 ia32

typedef struct archivo 
{ 
    unsigned char *info; 
} FILE; 

void funct(FILE *arch) { 
    arch->info[0] = 'b'; 
} 

그래서 funct 함수를 인라인 어셈블리로 변환해야합니다. 나는 다음을 시도했다

void funct(FILE *arch) { 
    _asm { 
    mov eax, 0 
    mov ebx, arch.info[eax] 
    mov ecx, [ebx] 
    mov ecx, 'b' 
    } 
} 

그러나 출력을 인쇄 할 때 정보는 계속 동일한 값을 갖는다. 그래서 나는 다음과 같은 코드

void funct(ARCHIVO *arch) 
{ 
    printf("\n--%c--\n", arch->info[0]); 

    _asm { 
     mov eax, 0 
     mov ebx, arch.info[eax] 
     mov ecx, [ebx] 
     mov ecx, 'b' 
     } 

    printf("\n--%c--\n", arch->info[0]); 
} 

와 출력을 시도하고

--P-- 

--P-- 

가 어떻게 위치 0에서 C 배열 값을 변경 관리 할 수있는 출력으로 나는거야?

+0

"구조체에 포함되어 변경 배열을"사용할 수 있습니다 - 귀하의'struct'에는 배열이 없습니다. 포인터가 배열이 아닙니다. 그리고'char *'는 배열에 대한 포인터가 아니라'char'에 대한 포인터입니다. – Olaf

+0

'mov ecx, 'b''는'info'에 아무 것도 쓰지 않을 것입니다. ecx 레지스터에 값을 지정하려고합니다. –

+0

@DavidWohlferd 어떻게 정보 값을 변경할 수 있습니까? – ravelinx

답변

1

당신은

void funct(FILE *arch) { 
    _asm{ 
     mov eax, arch 
     mov eax,[eax]archivo.info 
     mov byte ptr [eax],'b' 
    } 
} 

이상

__declspec(naked) void __fastcall funct2(FILE * /*arch*/) { 
    _asm{ 
     mov eax,[ecx]archivo.info 
     mov byte ptr [eax],'b' 
     ret 
    } 
} 
+0

감사합니다 남자, 매력처럼 작동합니다. – ravelinx