2010-04-26 4 views
3

일부 코드를 assmebly로 변환하려고하는데 도움이 필요합니다.기본 ASM에 대한 도움이 필요합니다.

char encode(char plain){ 
    __asm{ 
     mov eax, plain 
     add eax, 2  
     ret 
    } 
    //C code 
    /* 
    char code; 
    code = plain+2; 

    return code;*/ 
} 

첫 번째 문제는 비주얼 스튜디오 즉 EAX도/작은 문자에 대한 큰 레지스터의 크기가 일치하지 않음을 불평이다. 나는 그들이 모두 DWORD라고 인상을 받고있었습니다. 또한 변수를 eax에두고 어셈블리에서 ret를하면 실제로 변수가 반환됩니다. 맞습니까?

+0

eax는 32 비트입니다. 너의 문자는 8 비트입니까? * eax *를 * al *로 변경하면 여전히 불평하고 있습니까? – slugster

+0

아니요, 알로 변경하면 불평하지 않습니다. 숯불은 C – Malfist

답변

1

예, [이론적으로는 보장되지 않지만] 적어도 [[e] a]에 넣은 x는 1/2/4 바이트 반환 값으로 처리됩니다.

아니요. char는 (일반적으로) dword가 아니며 바이트가됩니다.

char encode(char plaintext) { 
    __asm { 
     mov al, plaintext 
     add al, 2 
     leave 
     ret 
    } 
} 
+0

에서 온 것입니다 (분명히'mov al, plaintext'을 의미합니까?) – susmits

+0

@susmits : 예, 그렇습니다. 그 점을 지적 해 주셔서 감사합니다. –

1
  1. 일반적으로 1 바이트이므로 EAX 대신 AL을 사용하십시오 (동일한 레지스터의 최하위 바이트를 나타냄).
  2. 엄밀히 말하면, RET 명령은 스택의 리턴 주소를 간단히 팝하고 거기에서 제어를 전달합니다. 표준 x86 호출 규칙에서는 반환 값을 EAX에 배치해야한다고 말합니다.
2

언제든지 c 파일의 어셈블러 출력에서 ​​변환 방법에 대한 힌트를 찾을 수 있습니다. 일반적으로 활성화해야하는 단일 플래그입니다.

+1

+1 : 이것은 중요한 포인트입니다. 예를 들어를 사용하여 asm을 코딩 할 때 많은 어려움을 줄일 수 있습니다. 'gcc -S'는 빌드 할 작업 템플릿 코드를 얻습니다. –

0

char는 8 비트 또는 1 바이트입니다. 레지스터 eax는 32 비트 또는 4 바이트 또는 두 개의 16 비트 워드 또는 한 개의 32 비트 워드입니다. 반환되는 것으로 인식되는 것은 컴파일러와 코드에 따라 달라 지지만 eax에 값을 넣으면 해당 32 비트 값이 반환됩니다.

관련 문제