読者です 読者をやめる 読者になる 読者になる

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

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

Mono 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 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# Mono

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

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

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

続きを読む

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

x86-16 PDP-11 UNIX V6

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

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

全部入りbinutils

x86-16 x86 x64 Alpha PDP-11 ELF Mach-O Win32 MSYS

スタート低レイヤー#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(仮)

x86-16 PDP-11 UNIX V6

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

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

続きを読む

スタート低レイヤー#2で発表して来ました

ELF x86 Python

2013/7/27(土)に開催されたスタート低レイヤー#2でELFについて発表して来ました。

私自身とても勉強になりました。主催のmasterqさんはじめ、他の発表者の方々、参加者の方々、お疲れ様でした。