by shigemk2

当面は技術的なことしか書かない

熱血!アセンブラ入門 読書会(18) 最終回 まとめ

この記事は諸般の事情により、2015/07/01の勉強会のまとめです。

hotasm.connpass.com

PowerPC(64ビット)

f:id:shigemk2:20150701200753p:plain

32ビットと大して変わらない

  • LP64I32
  • LPI64

LP64 ‐ 通信用語の基礎知識

52993 – gomp_init_nest_lock_25: possible bad call to memset

add命令について。extswがあるだけ違う。

f:id:shigemk2:20150701201155p:plain

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命令の本体プログラムから利用するとか、その逆のような使い方