HobbyOSs / opennask

nask clone assembly, it can boot tiny OS with Linux
https://github.com/HobbyOSs/opennask/wiki/%E5%8B%95%E4%BD%9C%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF
GNU General Public License v3.0
20 stars 3 forks source link

出力の遅延評価の試み #56

Closed hangingman closed 1 year ago

hangingman commented 2 years ago

C++でLazyExpressionというものがある https://github.com/tirimatangi/LazyExpression

先に機械語を確定してからoffsetの計算をするような仕組みを導入したい 参考: ラベルの判定など

メモ

    using LazyEvalVariant = std::variant<std::vector<uint8_t>, Label>;  // 機械語かラベルかどちらか
    using LazyEvalStatement = std::variant<LabelStmt, DeclareStmt, ConfigStmt, MnemonicStmt, OpcodeStmt>; // 一応もとのstatement(文)を参照できるようにする

    std::vector<LazyEvalVariant> machine_codes = {  [ 0x88, 0x88, 0x88 ],  {Label, name, offset...}  }; // イメージ
    std::vector<LazyEvalStatement> statements = {  (DeclareStmt "LEDS" [(ImmExp [(HexFactor "0x0ff1")]), ...  }; // イメージ

    // Calculates offset etc.
    auto f = [&](LazyEvalVariant v, LazyEvalStatement stmt) { 計算; };
    auto expr = Expression{f, machine_codes, statements};

    auto evaluated_expr = expr();
    // このあと rubyで言うところの evaluated_expr.flatten() 的な処理が必要
hangingman commented 1 year ago

メモリーリークの場所がわからない際に

valgrind --tool=memcheck --leak-check=yes --leak-resolution=high ./day01test

とやるとメモリーリークの箇所が詳細に出るようだ。 ↓

結局それを使ってもわからなかったので、別のツールを使ってみた。

valgrind --tool=massif ./day01test

謎のエラーはあったがなんとかday01testは通るまでいった。もう少しかんたんなデバッガがあればいいのだけど。 https://github.com/HobbyOSs/opennask/commit/e8e2dddac53834770309efa0b8b2d45289701fd2

作業再開時は、以下のデバッガを検討すること https://www.gdbgui.com/

hangingman commented 1 year ago

設計を失敗したのでやり直し・・・

image

脳内ひろゆき「アセンブラのオフセット計算再設計する人全員バカです」

パス1アセンブラとパス2アセンブラの解説