2014年9月13日 (土曜日)

18:14:28 # Life ARM のPC相対. ARMは32ビット固定長命令セットのRISCプロセッサで,(Thumb命令モードのときは16ビット固定長命令セット,Thumb2命令モードのときは16ビットと32ビット混合・・・) 3段のパイプラインであることが仕様に埋め込まれているもの,らしい. 一般論として32ビット固定長命令セットであるアーキテクチャのマシン語命令だと命令の種類を記述するのに何ビットかは必要なので メモリ空間の大きさ(32ビット)の即値が残りのビット数では記述できない。で、何らかの方法が必要で、よく使われる技はプログラム・カウンタ相対。 ARMのアセンブリではadd命令では pc レジスタ相対での指定ができる。 add r2,pc,r2 とかってやるとpc(r15)+r2をr2に代入する。 ldr r2,[pc,#180]だとPC相対で180バイトあとのアドレスからの4バイトをR2に代入。 ここで癖があるのがPCがARMだと現在の命令の8バイト先に進んでしまっていること、多分パイプラインでレジスタの値を読む段が命令フェッチから三段目だった時の名残(今でもそうなのかは不明)なのかな。 Thumbモードだと4バイトずれる。それ以外のモードだとどうなのか。


	ldr r4, [pc, #180]
	add	r4, pc, r4

	..
	..

	ldr r2, .Ldata
.LPIC1:
	add r2, pc, r2

	..
	..
.LDATA:
	.word	_GLOBAL_OFFSET_TABLE_-(.LPIC1+8)	  
	
Junichi Uekawa

$Id: dancer-diary.el,v 1.94 2009/10/21 14:02:48 dancer Exp $