C++ とアセンブラでベンダー名を読み出す

CPUのベンダー名を読み出し、それを表示してみましょう。
arques.hatenablog.com
のアゼンブラーバージョンです。

C++ソースリスト

#include <iostream>

using namespace std;

extern "C" void myCpuid(char*); // assembler function

int main()
{
    char CPUString[(sizeof(int)) * 3 + 1]{};
    CPUString[sizeof CPUString - 1] = '\0';
    myCpuid(CPUString);
    cout << "Vender Id: " << CPUString << endl;
}

アセンブリ関数ソースリスト

__cpuidイントリンシックを、アセンブリ言語の関数で実装します。関数名はmyCpuidです。基本的にmyCpuidは__cpuidイントリンシックと互換があります。

include ksamd64.inc

_TEXT       segment

;
; rcx = stringの先頭アドレス。
; rdx = function #
;
        public  myCpuid
        align   16

myCpuid proc    frame           ; prologを使う時はproc frame
        ; prolog
        rex_push_reg    rbx     ; マクロでrbxをpush
        .endprolog              ; end of prolog

        mov     r9, rcx         ; addr

        xor     eax, eax
        cpuid
        mov     [r9+0],  ebx
        mov     [r9+4],  edx
        mov     [r9+8],  ecx

        ; epilog
        pop     rbx             ; restore
        ret

myCpuid endp

_TEXT   ends
        end


実行例:Vender Id: GenuineIntel