Вам нужно завершить строку, которую вы пишете в $ buffer, нулевым символом, вместо того, чтобы писать поверх одного слова три раза. Кроме того, wallyk прав: вы уверены, что CRT инициализируется?
Честно говоря, вам действительно гораздо лучше написать эту программу, которая вызывает функцию библиотеки C, на C. Записать код CPUID как встроенную сборку внутри функции __cdecl, сделать так, чтобы он записал свой результат в строковый указатель, а затем эта функция из программы на Си.
void GetCPUID( char *toStr )
{
// inline assembly left as exercise for the reader..
// write ebx to *toStr, ecx to *toStr+4, edx to *toStr+8, and 0 to *toStr+12
}
void PrintCPUID()
{
char cpuidstr[16];
GetCPUID( cpuidstr );
printf( "cpuid: %s\n", cpuidstr );
}