2011-10-14 2 views
3

잠시 동안 REP STOS DWORD PTR ES:[EDI] 디버깅되었습니다 지금어셈블리 REP STOS를 C 코드로 변환하는 방법

내 결론에서 항상

ECX 카운터로 사용합니다. 그래서 EDI

의 의 뾰족한 덤프 퍼팅 후 전용으로 ECX를 사용하여 항상 보인다 무엇과 EDI의 뾰족한 데이터를 덮어 보인다

다음 EDI을 통해 복사됩니다 값으로 의 EAXECX 번 추가 EDI를 4 바이트 씩 변경하면서 카운터. 는 카운터가

0 그래서 코드

while(regs.d.ecx != 0) 
{ 
    *(unsigned int *)(regs.d.edi) = regs.d.eax; 
    regs.d.edi += 4; 
    regs.d.ecx--; 
} 

의이 종류를 내놓았다 명중 작동하는 것 같다 때 작동을 멈 춥니 다 ..하지만 난 그냥 운에 의해 이런 짓을하고 일을 생각하기 때문에 나는 걱정. 견고한가요? 항상 그것 ECX 카운터로, EAX 데이터로, 그리고 항상 4 바이트 절대 복사하지?

+0

중복 된 발견 http://stackoverflow.com/questions/3818856/what-does-this-assembly-do 조금 늦었습니다. 모든 것이 유효하다고 보입니다. – SSpoke

+1

필자는 AMD의 프로그래머 매뉴얼 (intro 용 1 권, 범용 지침 용 3 권)과 Intel의 것을 권장합니다. 어쨌든 나는 AMD의 구조와 테이블에 대해 더 좋아한다. Intel이 좀 더 자세하게 나타납니다. –

답변

8

거의 정확합니다. 유일한 차이는 4가 추가 또는 EDI에서 차감되어 있는지 여부를 방향 플래그 (DF)를 제어하는 ​​(그리고 그것이 실제로 ES 세그먼트베이스에서 오프셋,하지만 당신은 아마 그것에 대해 걱정하지 않는다) :

for (; regs.d.ecx != 0; regs.d.ecx--) 
{ 
    *(unsigned int *)(regs.d.edi) = regs.d.eax; 
    regs.d.edi += regs.eflags.df ? -4 : 4; 
} 

for (; regs.d.ecx != 0; regs.d.ecx--) { }REP 접두사의 동작이고 루프의 본문은 STOS DWORD...의 동작입니다.

이러한 질문을 많이하므로, Intel 64 and IA-32 Architectures Software Developer’s Manual, Volumes 2A and 2B이 유용 할 것입니다. 여기에는 의사 코드 설명을 포함하여 각 명령어 및 접두사에 대한 설명이 포함됩니다.

+1

DF 이상입니다. CPU 모드에 따라 STOSD는 요소 크기 (16 비트 대 32 비트, AX 대 EAX), 주소 크기 접두어 (67h)를 제어하는 ​​피연산자 크기 접두사 (66h)가 필요할 수도 있고 없을 수도 있습니다. EDI와 ECX 비트가 사용됩니다 (16 대 32). 마지막으로 ES 세그먼트 레지스터를 사용합니다. 즉, 가상 주소는 ES.base + (E) DI입니다. 아, 그리고 메모리가 쓰여질 수 없거나 페이지 변환이 가능하다면 읽기 전용이거나 매핑되지 않았거나 권한 (CPL & RPL)이 세그먼트 나 기본 페이지에 충분하지 않은 경우 예외가 발생할 수 있습니다). :) –

+0

blah 나는 플래그가 어떻게 생성되는지 이해하지 못합니다. 물론 제 에뮬레이터에는 플래그가 없습니다 .. 그리고 지금까지는 그렇게 좋았습니다!. : P, 그 스택 + 레지스터가 충분해야한다. – SSpoke

+0

@SSpoke :'EFLAGS'는 다른 레지스터로 모델화 될 수 있으며, 그 중 일부 비트는 다른 명령어에 의해 설정된다. 'DF' 플래그의 경우 특정 명령이 있습니다. - STD는 그것을 설정하고,'CLD'는 그것을 지 웁니다. – caf

관련 문제