この記事は諸般の事情により、2015/07/01の勉強会のまとめです。
hotasm.connpass.com
PowerPC(64ビット)
32ビットと大して変わらない
LP64 ‐ 通信用語の基礎知識
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命令の本体プログラムから利用するとか、その逆のような使い方