Поведение компилятора msvc после использования всех регистров

Я пытаюсь проникнуть в концепции ASM и, наблюдая за разборкой, генерируемой MSVC, есть кое-что, что я не могу полностью понять. Вот мой тестовый пример:

#include <tchar.h>
#include <conio.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int v1 = 1;
int v2 = 2;
int v3 = 3;
int v4 = 4;
int v5 = 5;
int v6 = 6;
int v7 = 7;
int v8 = 8;
int v9 = 9;
int v10 = 10;
int v11 = 11;
int v12 = 12;
int v13 = 13;
int v14 = 14;
int v15 = 15;
int v16 = 16;

int sum = v1+v2 * (v3+v4 * (v5+v6 * (v7+v8 * (v9+v10 * (v11+v12 * (v13+v14 * (v15+v16)))))));

_getch();
return 0;
}

который генерирует что-то вроде:

    mov eax, v1
mov edx, v3
mov ecx, v5
mov ebx, v7
mov esi, v9
mov edi, v11 // all 6 available registers are filled
mov dword ptr [ebp-60h), eax // free eax   <<<<<<
mov eax, v15 // fill it again
add eax, v16
imul eax, v12
(...)

Итак, мой вопрос:
Что делает компилятор в строке, помеченной «<<<<<<«? Мой
Предположим, что он создал переменную для хранения значения регистра
в. Это выглядит он находится в стеке, поскольку он использует ebp, но это
что-то вроде «глобальной переменной», или это переменная в текущем
только область (рамка)?

Заранее спасибо.

5

Решение

MSVC будет передавать регистры в соответствующую память: в стек, когда он проливает регистр, который содержал переменную с областью блока, или в фиксированное смещение, когда регистр содержал глобальное значение. В любой момент компилятор знает, какие переменные находятся в каком регистре.

Вы не можете пролить локальные переменные в глобальную память, потому что их может быть непредсказуемое количество, из-за потоков и повторного входа. Компилятор может временно пролить глобальную переменную в слот стека, но это довольно сложно в присутствии потоков.

4

Другие решения

Других решений пока нет …