2017-10-06 67 views
2

질문이 있었는데 괜찮은 대답을 찾을 수 없었습니다. [ebp+0x08]의 값이 0x82 인 경우x86 어셈블리 레지스터와 mov 명령어 및 점프 오프셋

0020 mov eax, [ebp+0x0c]; value inside = 0x000000ff 
0023 mov cl, [ebp+ox08]; value inside- 0x82 
0026 cmp al, cl 
0028 jl label    ;label is at address 003c, jl is signed 
002a nop 
002b 
... 
003c label:sub al,cl 

ecx이 코드를 실행하기 전에 0xabcd1234입니다 이 코드를 실행 한 후 eax의 값은 무엇인가 :
이 나는이 코드를 부여하고있어?
ecx이 0x00000082이거나 ecx이 0xabcd1282가되도록 상위 비트를 지우시겠습니까?

또한 jl 명령어에 대한 오프셋이 계산되는 주소는 무엇입니까?
jl 명령어의 오프셋 값은 어떻게 결정됩니까?

al의 값이 cl보다 크지 않습니까? 그래서 jl이 아니라 점프? 미리

+0

'jl'은 * signed * less-than입니다. 부호있는 2의 보수로 숫자를 해석해야합니다. 즉 '0xff - 256'과 '0x82 - 256'은 둘 다 부호 비트가 설정되어 있기 때문입니다. –

+1

low8/low16 레지스터를 쓰는 것은 상위 바이트를 수정하지 않습니다. 이는 전체 64 비트 레지스터를 0으로 만드는 32 비트 레지스터를 쓰는 것과는 다릅니다. https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register –

+0

최소한 3 가지 질문이 있습니다. 제발하지 마시고, [ask]를보십시오. 어셈블러가 명령의 끝에서 jmp 변위를 계산하는 방법을 보려면 해당 코드를 어셈블 한 다음 기계 코드 바이트의 디스 어셈블리 + hexdump를 확인하십시오. 설명서 및 안내서 링크는 https://stackoverflow.com/tags/x86/info를 참조하십시오. Intel의 x86 설명서는 명령 인코딩의 모든 세부 사항을 다루고 있습니다. –

답변

3

덕분 cl 로딩 후 ecx의 값은 0xabcd1282이다.

cl (부호 -126/부호없는 130)은 al (부호 -1/부호없는 255)보다 작습니다. 부호가 있거나 부호가없는 것으로 취급됩니다. (이 경우 jl으로 서명 된 것으로 처리됩니다.) 따라서 점프가 수행되지 않습니다. 0x2b와 0x3c 사이의 명령어가 무엇인지 모르기 때문에 eaxecx의 최종 값을 알 수있는 방법이 없습니다.

점프 오프셋은 0x12 (0x3c - 0x2a, 대상 주소에서 다음 명령어 주소 빼기)입니다.

+0

대단히 감사합니다! – Monica