家に帰ったら Ruby で CPUID

Shibuya.lisp Tech Talk #4 LT発表資料 「さあ家に帰ったらSchemeのコード書いてみよう」

気付いたら Ruby 使ってる!

Lisp が生かされる部分

これは挑戦と見た!(違


というわけで Ruby で CPUID。
RXbyak 最新版( http://github.com/shuyo/cpp/tree/master/rxbyak/ )。

require 'RXbyak'

def get_cpuid(reg)
  rx = RXbyak.new
  rx.push :ebx
  rx.mov :eax, [:esp, 8]
  rx.cpuid
  rx.mov :eax, reg
  rx.pop :ebx
  rx.ret
  rx
end

ca = get_cpuid(:eax)
cb = get_cpuid(:ebx)
cc = get_cpuid(:ecx)
cd = get_cpuid(:edx)

result = []
eax = -0x7ffffffe # 80000002h
result << ca.int_call(eax) << cb.int_call(eax) << cc.int_call(eax) << cd.int_call(eax)
eax = -0x7ffffffd # 80000003h
result << ca.int_call(eax) << cb.int_call(eax) << cc.int_call(eax) << cd.int_call(eax)
eax = -0x7ffffffc # 80000004h
result << ca.int_call(eax) << cb.int_call(eax) << cc.int_call(eax) << cd.int_call(eax)

puts result.pack('l12')
$ ruby cpuid.rb
Quad-Core AMD Opteron(tm) Processor 2378

ま、まだ配列が扱えないから 32bit×4 を一度に返せないんだ……