Por lo tanto, estoy confundido acerca de cómo funcionan las instrucciones de salto en un sistema operativo. Pensé que la instrucción de salto establecía el valor en el contador del programa del procesador. Pero los programas se pueden ejecutar en varias ubicaciones de la memoria. Veo que en x86, está la instrucción JMP EAX
, pero mi código C++ no parece usar esto. He compilado algo de código C++ en VC++:¿Cómo funciona la instrucción de salto en el ensamblaje con múltiples procesos?
int main()
{
int i = 0;
while (i < 10)
{
++i;
if (i == 7)
{
i += 1;
continue;
}
}
}
Esto se traduce en:
int main()
{
00411370 push ebp
00411371 mov ebp,esp
00411373 sub esp,0CCh
00411379 push ebx
0041137A push esi
0041137B push edi
0041137C lea edi,[ebp-0CCh]
00411382 mov ecx,33h
00411387 mov eax,0CCCCCCCCh
0041138C rep stos dword ptr es:[edi]
int i = 0;
0041138E mov dword ptr [i],0
while (i < 10)
00411395 cmp dword ptr [i],0Ah
00411399 jge main+47h (4113B7h)
{
++i;
0041139B mov eax,dword ptr [i]
0041139E add eax,1
004113A1 mov dword ptr [i],eax
if (i == 7)
004113A4 cmp dword ptr [i],7
004113A8 jne main+45h (4113B5h)
{
i += 1;
004113AA mov eax,dword ptr [i]
004113AD add eax,1
004113B0 mov dword ptr [i],eax
continue;
004113B3 jmp main+25h (411395h)
}
}
004113B5 jmp main+25h (411395h)
}
004113B7 xor eax,eax
004113B9 pop edi
004113BA pop esi
004113BB pop ebx
004113BC mov esp,ebp
004113BE pop ebp
004113BF ret
Así que estoy confundido, para el comando jmp 411395h
, implica esto el programa se carga siempre en el mismo lugar en ¿memoria? Porque eso parece ilógico.
Tenga en cuenta que las CPU modernas tienden a ser compatibles con la memoria virtual, lo que significa que cada programa tiene su propio espacio de direcciones. Es decir, el byte en 0x12345678 en un proceso puede ser un punto diferente en la memoria real que el byte en 0x12345678 en otro proceso. –