この記事は諸般の事情により、2015/07/01の勉強会のまとめです。
PowerPC(64ビット)
32ビットと大して変わらない
- LP64I32
- LPI64
52993 – gomp_init_nest_lock_25: possible bad call to memset
add命令について。extswがあるだけ違う。
MIPS(64ビット)
仕様がほぼ同じ、命令もほぼ同じ。
# 32ビット 00fe1400 <null>: fe1400: 03e00008 jr ra fe1404: 00000000 nop 00fe1408 <return_zero>: fe1408: 03e00008 jr ra fe140c: 00001021 move v0,zero # 64ビット 00fe1400 <null>: fe1400: 03e00008 jr ra fe1404: 00000000 nop 00fe1408 <return_zero>: fe1408: 03e00008 jr ra fe140c: 0000102d move v0,zero
SH(64ビット)
64ビットと32ビットでは全然違う。命令体系がもう違う。これもうわかんねえな
# 32ビット 00fe1400 <_null>: fe1400: 00 0b rts fe1402: 00 09 nop 00fe1404 <_return_zero>: fe1404: 00 0b rts fe1406: e0 00 mov #0,r0 # 64ビット 0000000000fe1400 <_null>: fe1400: 6bf14a00 ptabs/l r18,tr0 fe1404: 4401fff0 blink tr0,r63 0000000000fe1408 <_return_zero>: fe1408: 6bf14a00 ptabs/l r18,tr0 fe140c: cc000020 movi 0,r2 fe1410: 4401fff0 blink tr0,r63 # 32ビット 00fe1440 <_return_arg1>: fe1440: 00 0b rts fe1442: 60 43 mov r4,r0 00fe1444 <_return_arg2>: fe1444: 00 0b rts fe1446: 60 53 mov r5,r0 # 64ビット 0000000000fe148c <_return_arg1>: fe148c: 6bf14a00 ptabs/l r18,tr0 fe1490: 4401fff0 blink tr0,r63 0000000000fe1494 <_return_arg2>: fe1494: 6bf14a00 ptabs/l r18,tr0 fe1498: 0039fc20 add r3,r63,r2 fe149c: 4401fff0 blink tr0,r63
レジスタの数が増えている。
読む気がなくなる長い機械語…
x86-64
qは64ビット用のreturn
# 32ビット 00fe140d <return_int_size>: fe140d: b8 04 00 00 00 mov $0x4,%eax fe1412: c3 ret 00fe1413 <return_pointer_size>: fe1413: b8 04 00 00 00 mov $0x4,%eax fe1418: c3 ret 00fe1419 <return_short_size>: fe1419: b8 02 00 00 00 mov $0x2,%eax fe141e: c3 ret 00fe141f <return_long_size>: fe141f: b8 04 00 00 00 mov $0x4,%eax fe1424: c3 ret # 64ビット 0000000000fe140e <return_int_size>: fe140e: b8 04 00 00 00 mov $0x4,%eax fe1413: c3 retq 0000000000fe1414 <return_pointer_size>: fe1414: b8 08 00 00 00 mov $0x8,%eax fe1419: c3 retq 0000000000fe141a <return_short_size>: fe141a: b8 02 00 00 00 mov $0x2,%eax fe141f: c3 retq 0000000000fe1420 <return_long_size>: fe1420: b8 08 00 00 00 mov $0x8,%eax fe1425: c3 retq
int *get_static_value_addr() { return &static_value; }
int get_static_value() { return static_value; }
32ビット
00fe14af <get_static_value_addr>: fe14af: b8 00 18 fe 00 mov $0xfe1800,%eax fe14b4: c3 ret
00fe14b5 <get_static_value>: fe14b5: a1 00 18 fe 00 mov 0xfe1800,%eax fe14ba: c3 ret
64ビット
0000000000fe1483 <get_static_value_addr>: fe1483: b8 00 18 fe 00 mov $0xfe1800,%eax fe1488: c3 retq
0000000000fe1489 <get_static_value>: fe1489: 8b 05 71 03 00 00 mov 0x371(%rip),%eax # fe1800 <static_value> fe148f: c3 retq
アドレスを即値で書かないような方針に変わっている ### PIC * Position Independent Code [https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%BD%AE%E7%8B%AC%E7%AB%8B%E3%82%B3%E3%83%BC%E3%83%89:title] * ものすごく読みづらくなる > 共有ライブラリは仮想アドレス上のどのアドレスにマッピングされても動作可能なように、PIC(Position Independent Code)と呼ばれる機械語コードが生成される必要があります.このような機械語コードは「リロケータプル」などとも呼ばれます ## IA-64 x86とは全然互換性のなく、高い、スピードもないので絶滅寸前 * VLIWというRISCともCISCともちがう体系。ひとつの体系が長い。 [https://ja.wikipedia.org/wiki/VLIW:title] * MIBとMIIという単位 * VLIW(Very Long Instruction Word) ## MMIX * ドナルド・クヌースによる設計 * 教育用といいつつ、pop0,0がよくわからない * 仕様書見ないとよくわからないところがある [f:id:shigemk2:20150701205228p:plain] [f:id:shigemk2:20150701205732p:plain] ## M32R 三菱32ビットRISCCPU * パイプと矢印が特長 * 区切りが4バイトなのに2命令入っている * 命令が2個入っているが、固定長 [f:id:shigemk2:20150701205931p:plain] ## AVR * マイコン向け * 8ビットマイコン でもint型は16ビットで扱われる * 命令によって使えないレジスタ [f:id:shigemk2:20150701211039p:plain] * 加算はキャリーフラグ [f:id:shigemk2:20150701211402p:plain] * Zは決め打ちのインデックスレジスタ [f:id:shigemk2:20150701211640p:plain] * スタック周りは読みたくないくらい長い * 周辺ペリフェラルが持つレジスタをI/O ポートというメモリアドレスとは独立したアドレス体系 ## 68HC11 * Z80なんかを拡張したやつ [f:id:shigemk2:20150701212045p:plain] * i386と同じような感じ * 8ビットマイコンは簡単な制御用なので、これをもって低機能とかそういうのはアレだと思われる ## 68000 * 32ビットアセンブラ * 4バイトの即値を直接扱える [f:id:shigemk2:20150701212716p:plain] [f:id:shigemk2:20150701213228p:plain] ## S/390 * メインフレーム用に使われるアーキのアセンブラ * リターン命令がわからん * nopにオペランド * basrは関数呼び出し [f:id:shigemk2:20150701213905p:plain] [f:id:shigemk2:20150701214449p:plain] * スタックが大量に獲得されている * VAXやPDP-11に似たCISC系の命令セット * 20世紀中盤で完成されたCPU ## MIPS16 * 2バイト固定長命令も持っている [f:id:shigemk2:20150701215611p:plain] ## Thumb(ARMの16ビット命令) * 即値が詰め込まれている [f:id:shigemk2:20150701220152p:plain] [f:id:shigemk2:20150701220259p:plain] ## 縮小命令セットの呼び出しかた 巨大なライブラリはMIPS16でコンパイルしておいてMIPS命令の本体プログラムから利用するとか、その逆のような使い方