질문이 있었는데 괜찮은 대답을 찾을 수 없었습니다. [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
이 아니라 점프? 미리
'jl'은 * signed * less-than입니다. 부호있는 2의 보수로 숫자를 해석해야합니다. 즉 '0xff - 256'과 '0x82 - 256'은 둘 다 부호 비트가 설정되어 있기 때문입니다. –
low8/low16 레지스터를 쓰는 것은 상위 바이트를 수정하지 않습니다. 이는 전체 64 비트 레지스터를 0으로 만드는 32 비트 레지스터를 쓰는 것과는 다릅니다. https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register –
최소한 3 가지 질문이 있습니다. 제발하지 마시고, [ask]를보십시오. 어셈블러가 명령의 끝에서 jmp 변위를 계산하는 방법을 보려면 해당 코드를 어셈블 한 다음 기계 코드 바이트의 디스 어셈블리 + hexdump를 확인하십시오. 설명서 및 안내서 링크는 https://stackoverflow.com/tags/x86/info를 참조하십시오. Intel의 x86 설명서는 명령 인코딩의 모든 세부 사항을 다루고 있습니다. –