アセンブリ解読 その3

前回長くなりすぎたので、追記分を分けておくことにした。

前回は簡易fizzbazzを逆アセンブルし、割り算の最適化に関して面白いものを見たのだった。

アセンブリ解読 その2 - in neuro

その続きとして、moduloではなく普通の割り算はどうなるんだろう、と思って以下のようなコードを書いてみた。

#include <stdint.h>

int32_t div_by3(int32_t a)
{
    return a / 3;
}

int32_t div_by4(int32_t a)
{
    return a / 4;
}

int32_t div(int32_t a, int32_t b)
{
    return a / b;
}

アセンブルする。予想としては、div_by3は先のマジックナンバーを使った方法を、div_by4sarで右シフトを、divは普通にidiv命令を使うというものだ。 それがたとえ-O0であったとしても。

続きを読む

アセンブリ解読 その2

続いた。でもいい題材が思いつかなかったので、条件分岐とかがいいかなあと思いじゃあfizzbazzでいいか、となった。

その1はここにある。アセンブリ解読 その1 - in neuro

文字列を使うのが(アセンブリだと)アレなのでフラグを返すことにする。

#include <stdint.h>

uint8_t fizzbazz(const int32_t n)
{
    uint8_t retval = 0;
    if (n % 3 == 0) retval ^= 1;
    if (n % 5 == 0) retval ^= 2;
    return retval;
}

3のみの倍数なら1、5のみの倍数なら2、両方の倍数なら3が返るはず。

続きを読む

アセンブリ解読 その1

簡単なアセンブリを読めるようになりたい。理由はカッコいいから。というのは嘘で、どういう最適化が行われたかある程度わかるようになりたい。

だが、面白いコードが書けるようになるまでにアセンブリだと道のりが遠すぎるので、コンパイラに簡単なコードを吐かせて読んでわかるようになっていくことを目指す。というか、本来の目的は最適化で何が起きたかわかるようになることなので、最短距離といえばそうではある。

続きを読む

何らかのフォーマットのファイルを読み書きするライブラリについて

Coffee-millなるライブラリを(凄く昔に)書いている。これは主に分子動力学計算の結果を読み書き・解析するためのものなのだが、解析用の部分は別に開発しているのでまあほぼ読み書きのために使っている。今やっていることが落ち着いたらもう少しメンテしたい気持ちはあるが、今回は思い出しがてらそれを開発していた時に何を考えていたかを綴っていこうと思う。

続きを読む

Rustを触っている

先週Rustを触っていた。まだ手に馴染んでいないので少し不自由さを感じるが、慣れるまでの辛抱だろう。実際は去年くらいに一度インストールしてチュートリアル程度は済ませていたのだが、説明を見て言われた通りのコードを書く以上のことはしていなかった。なので、少し柔軟体操程度のことをしてみるか、とProject Eulerの問題をいくつか解いてみた。これは触ってみただけのひどく個人的な感想にすぎず、Rustの紹介を気合を入れてしている訳ではない。

続きを読む

C++98でもvariantを(バリバリ)使いたい! その2

前回こういう記事が発生した。

c++98でもvariantを(バリバリ)使いたい! その1 - in neuro

このときは単に2つの関数をくっつけて即席visitorを作れるようにして終わったものの、variantは普通2つ以上詰め込むことが多いので、N個版をゴリゴリ展開していく必要に駆られている。

そもそもなんでこんなことになったのかというと、C++98にはvariadic templateがなく、またラムダもないからだ。

状況説明終わり。

続きを読む

c++98でもvariantを(バリバリ)使いたい! その1

私はC++98を使っているプロジェクトに参加している。タイトルを見て「2017年にもなってC++98だとォ〜〜」というような感想を抱くかもしれないが、ライブラリとしてC++98をサポートしたいとか、C++98時代から作っているプログラムでメジャーバージョンアップのタイミングでもないのに切り替えるのはちょっと、とか、共用サーバーにいつまで経ってもC++11対応のコンパイラが入らず泣く泣くg++4.2とかを使わされている(野良ビルドしろよ、というのを全ユーザーに強いるのは酷だと思うのだ)などの理由でC++98はまだまだ現役である。いいか悪いかは別として。

続きを読む