【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

池袋バイナリ勉強会のシリーズ

【お知らせ】2015年8月23日をもって会場は閉鎖となりました。

池袋バイナリ勉強会では色々なテーマを試して来ましたが、最後に残った勉強会をまとめました。

不定
池袋バイナリ勉強会看板勉強会です。コンパイラやOSで遊びます。
池袋物理学勉強会古典力学からきっちり学んで、相対論、量子論の理解を目指します。
毎月(休日)
初級ラテン語リーディング言語学的意義が非常に大きい言語です。勉強して損はありません。
初心者のための線形代数勉強会行列やベクトルの性質を扱う数学の分野を勉強します。
隔週(水曜日)
「理論から学ぶ データベース実践入門」読書会リレーショナルモデルによるデータベースの理論を本で勉強します。

Windows上のXamarin StudioでF#プロジェクトをビルド

Windows上のXamarin StudioでF#プロジェクトをビルドしようとすると、最近のバージョンでは失敗します。

Xamarin Studio F# Language Binding 結果
4.0.12 3.2.15 OK
4.0.13 3.2.15 ビルドに失敗しました。. MSBuild operation failed
4.0.13 3.2.19 ビルドに失敗しました。. MSBuild operation failed

本体とアドインの組み合わせから推測すると、どうやら本体側の仕様変更が影響しているようです。

【追記】この件に関して、既にgithubのプロジェクトIssueが上がっていました。

続きを読む

NetBSDでMIPSのハローワールド

NetBSDにはアセンブリ言語のサンプルが入っています。

PowerPC用ですが、MIPSに移植してみます。

PowerPC

主要部分を抜粋します。

_start:
    # write(STDOUT_FILENO, message, MESSAGE_SIZE)
    li      %r0, 4                  # r0: write(2) syscall number.
    li      %r3, 1                  # r3: first argument.
    addis   %r4, %r0, message@h     # r4: second argument.
    ori     %r4, %r4, message@l
    li      %r5, MESSAGE_SIZE       # r5: third argument.
    sc

    # exit(EXIT_SUCCESS)
    li      %r0, 1                  # r0: exit(2) syscall number.
    li      %r3, 0                  # r3: first argument.
    sc

writeシステムコールとexitシステムコールを呼んでいます。

MIPS

MIPSに移植しました。

_start:
    # write(STDOUT_FILENO, message, MESSAGE_SIZE)
    li      $v0, 4                  # v0: write(2) syscall number.
    li      $a0, 1                  # a0: first argument.
    lui     $a1, %hi(message)       # a1: second argument.
    ori     $a1, $a1, %lo(message)
    li      $a2, MESSAGE_SIZE       # a2: third argument.
    syscall

    # exit(EXIT_SUCCESS)
    li      $v0, 1                  # v0: exit(2) syscall number.
    li      $a0, 0                  # a0: first argument.
    syscall

多少文法は異なりますが、処理内容はほとんど同じです。

動作確認

動作確認はgxemul上のNetBSD/evbmips環境で行いました。

# uname -a                                                                      
NetBSD  6.1.2 NetBSD 6.1.2 (MALTA) evbmips
# gcc -nostdlib mips.s                                                          
ld: warning: cannot find entry symbol __start; defaulting to 00000000004000f0
# file a.out
a.out: ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, for NetBSD 5.99.56, not stripped
# ./a.out
Hello, world

gxemulへのインストール方法などは以下を参照してください。

調査方法

MIPSアセンブリには慣れていないので、書き方から調べました。即値やアドレスの代入方法はC言語で簡単なサンプルを書いて確認しました。

test.c

main() {
    int a = 0x12345678;
    const char *b = "abc";
}

アセンブリを出力します。gxemul上で処理するとファイル転送が面倒なため、Windows上でクロスコンパイラを動かしています。(gcc-4.5.4-msys-cross-mipsel-netbsd-6.1.tar.xz

$ mipsel-netbsd-gcc -S test.c

出力されたtest.sを見ると、即値の代入部分はすぐ分かります。

    li      $2,305397760            # 0x12340000
    ori     $2,$2,0x5678
    sw      $2,8($fp)

直後に文字列の代入部分があります。

    lw      $2,%got($LC0)($28)
    nop
    addiu   $2,$2,%lo($LC0)
    sw      $2,12($fp)

GOT経由でポインタを取得しています。これはちょっと複雑なので、GOTを使わないように指示します。

$ mipsel-netbsd-gcc -S test.c -mno-abicalls

単純になりました。

    lui     $2,%hi($LC0)
    addiu   $2,$2,%lo($LC0)
    sw      $2,4($fp)

これを参考にサンプルを移植しました。

余談

バイナリ勉強会で最初に提示するサンプルとやっていることは同じです。

https://bitbucket.org/7shi/ikebin/wiki/pdp11/hello

/ write(1, hello, 6);
mov $1, r0
sys write
hello
6

/ exit(0);
mov $0, r0
sys exit

.data
hello: <hello\n>

NetBSDのサンプルの存在は後で教えてもらいました。最小限のハローワールドを書こうとするとwriteとexitだけになってしまうのは、自然な成り行きでしょうか。

F#を教えるための環境構築

この記事はF# Advent Calendar 2013の2日目の参加記事です。

昨日はトップバッターの@さんでした。短いコードにデータベースのアクセステクニックが詰まってとても参考になります。

私の記事は、勉強会でF#を教えるための環境構築で試行錯誤した話です。

追記:2018.08.23】現時点での私の推奨環境は以下の記事を参照してください。

続きを読む

V6移植ハッカソンを中止します

お盆休みに予定していたV6移植ハッカソンですが、残念ながら参加者が少なかったため中止とさせていただきました。今後は池袋バイナリ勉強会の中で作業を進める予定です。

力不足、大変申し訳ありません。

全部入りbinutils

スタート低レイヤー#2id:shinichiro_hさんに全部入りのbinutilsが作れるということを教えて頂きました。

さっそく試してみました。MSYS(MinGW)用のバイナリを置いておきます。

/usr/localに展開するだけで使えます。

$ tar xvf binutils-2.23.2-msys-cross-all.tar.xz -C /usr/local
続きを読む

8086版V6のABI(仮)

先日、PDP-11から8086へのトランスレータを試作しました。

簡単なプログラムを変換して大まかなABIが見えてきたので、仮にまとめます。詳細についてはV6移植ハッカソンで作業しながら決めていこうと思います。

続きを読む