とりあえずHelloです!こんにちわ!

--- Q. ジョニーはプログラマです
---    ●に入ることばを答えなさい
ボブ「こんにちは、ジョニー」
ジョニー「こんにちは、●●」
ボブ「いや、世界て。」

さくさくいくですよ。

with Ada.Text_IO;

procedure Hello is
begin
   Ada.Text_Io.Put_Line("hello world");
end Hello;
~/test/ada$ gnatmake hello
~/test/ada$ ./hello
hello world

gnatmakeは便利すぎだと思います!
さて、このプログラムはどんなアセンブリに変換されるでしょうか!新しい言語を学ぶときに必要なのは、まず、アセンブリを出力することです!!私もm68k言語はそうやって勉強したともいえるし、そうでないともいえる。
(そもそもm68k知らない。)

~/test/ada$ gcc -S hello.adb
~/test/ada$ cat hello.s
	.section __TEXT,__text,regular,pure_instructions
	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
.data
.const
	.align 2
LC0:
	.ascii "hello world"
	.align 2
LC1:
	.long	1
	.long	11
.data
	.align 3
LC2:
	.long	LC0
	.long	LC1
.section __TEXT,__text,regular,pure_instructions
	.align 2
	.align 2
	.globl __ada_hello
.section __TEXT,__text,regular,pure_instructions
	.align 2
__ada_hello:
	mflr r0
	stmw r30,-8(r1)
	stw r0,8(r1)
	stwu r1,-80(r1)
	mr r30,r1
	bcl 20,31,"L00000000001$pb"
"L00000000001$pb":
	mflr r31
	addis r2,r31,ha16(LC2-"L00000000001$pb")
	la r2,lo16(LC2-"L00000000001$pb")(r2)
	lwz r3,0(r2)
	lwz r4,4(r2)
	bl L_ada__text_io__put_line$2$stub
	lwz r1,0(r1)
	lwz r0,8(r1)
	mtlr r0
	lmw r30,-8(r1)
	blr
.data
.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
	.align 2
L_ada__text_io__put_line$2$stub:
	.indirect_symbol _ada__text_io__put_line$2
	mflr r0
	bcl 20,31,L0$_ada__text_io__put_line$2
L0$_ada__text_io__put_line$2:
	mflr r11
	addis r11,r11,ha16(L_ada__text_io__put_line$2$lazy_ptr-L0$_ada__text_io__put_line$2)
	mtlr r0
	lwzu r12,lo16(L_ada__text_io__put_line$2$lazy_ptr-L0$_ada__text_io__put_line$2)(r11)
	mtctr r12
	bctr
.data
.lazy_symbol_pointer
L_ada__text_io__put_line$2$lazy_ptr:
	.indirect_symbol _ada__text_io__put_line$2
	.long dyld_stub_binding_helper
~/test/ada$ 

アセンブリppcなのは、アレです、もうエロゲはやらないとか、そういったような誓いの意味がこもってるとかそういうの。
さてもんだいですどぎゅーんx86命令は他のCPUには無い大きな特徴を持っていますそれを答えなさい。答え:エロゲが実行できまする
チューリング完全とかあんまり関係無いですーー。


さて問題です!!PPCアセンブリが読めません!!

int main() { return 0xff; }

これは、

	.section __TEXT,__text,regular,pure_instructions
	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
.section __TEXT,__text,regular,pure_instructions
	.align 2
	.align 2
	.globl _main
.section __TEXT,__text,regular,pure_instructions
	.align 2
_main:
	li r3,255
	blr
	.subsections_via_symbols

こんな感じになった。ふーんみゅ

  • li は即値ロード。確か、r0と定数を加算するのがliだったようなうろおぼえですよ
  • 戻り値はr3に入れる

ぐらいわかりました。

.section __TEXT,__text,regular,pure_instructions
	.align 2
_main:
	li r3,255
	addi r3,0,255
	blr
	.subsections_via_symbols

これが、

~/test/gcc$ gcc -c -O2 main.s
~/test/gcc$ otool -t -v main.o
main.o:
(__TEXT,__text) section
_main:
00000000	li	r3,0xff
00000004	li	r3,0xff
00000008	blr

こんな感じっす。liはadd r0だっていううろおぼえはあってたもよぅ。


まだまだ問題です

  • .section __TEXT,__text,regular,pure_instructionsて?

なんだか、深みへ行けそうです。どなたかMach-Oバイナリについて教えてくれりょんぬ。
なんだか、ピュアって純真そうな感じですね。

私、ピュアな恋を探してます。ピュアっていうのは具体的にいうと、副作用が無い?みたいな感じで。
全ての副作用は「副作用を起こす」というアクションの合成でできてます!!
甘い濃いより副作用を起こすアクションの合成からできた濃い!!

濃いのに透明です。

さて問題です。お金集めに情熱を注いでいる人はピュアだと言えるでしょうかーー哲学的ですね。


今日のまとめ:
「問題です」っていっぱい言った。