アセンブリ

アセンブリにおけるC言語の配列とポインタの扱い方の違い

C言語において配列とポインタは同等のものとして扱うことができる。 アセンブリにおいてこの二者の扱い方の違いはあるのだろうか。MIPSアセンブリにおいて、C言語の配列とポインタの扱い方にどのような違いがあるのか挙動を確認してみる。 test.cというプロ…

Cとアセンブリでmyprintf()を作成するー土台作り編ー

Cとアセンブリでprintf()関数もどきをprintf()関数を用いずに自力で実装した。 ソースコードは以下。 https://gist.github.com/totzYuta/76ef4055ea4c03778e17 出力は以下のようになる。 I am Yuta Totsuka, my age is 21 このプログラムの挙動について順を…

アセンブリにおけるC言語のstatic(静的)変数とauto(自動)変数の取り扱い方

とあるC言語のプログラムをアセンブリ言語に変換して、そこから、C言語のstaticとautoをアセンブリ言語ではどのように扱っているのか確認してみる。 C言語およびそれをmips-gccでクロスコンパイルしたプログラムは以下。 Programs in Assembly and C compile…

【アセンブリ】C言語でシステムコールsyscallを使うーハノイの塔編

【アセンブリ】C言語でシステムコールsyscallを使う - 凸ろぐ という記事に引き続き、今度はC言語で記述したハノイの塔hanoi.cをhanoi.sファイルにgccを用いてコンパイルし、それを自分で実装したprint系関数を使って表示する、ということをやってみる。 ま…

【アセンブリ】C言語でシステムコールsyscallを使う

とりあえずアセンブリで受け取ったintのデータを表示するという関数を実装してみる。 1 .text 2 .align 2 3 4 _print_int: 5 subu $sp, $sp, 24 6 sw $ra, 20($sp) 7 8 li $v0, 1 # 1: print_int 9 syscall 10 11 lw $ra, 20($sp) 12 addu $sp, $sp, 24 13 j…

【アセンブリ】入力されたn番目の素数を表示するプログラム【MIPS】

以前アセンブリで、100番目までの素数を求めるプログラムを作ったが、それを応用して今度は、ユーザから受け取った入力nに対して、n番目の素数を表示するプログラムを作ってみる。 ということで、以下の記事を参考にしながらプログラムを書き直してみる。 ht…

【アセンブリ】再帰で10の階乗を求めるプログラムを通して手続き呼び出し規約を理解する学習ノート【MIPS】

まず、再帰的な構造を持つプログラムを作るにあたって、手続き呼び出し規約をしっかりと理解しなければいけないらしい。レジスタ使用規約って、言われた方が自分にとってはピンと来るけども。 Patteron&Hennesy本の日本語訳verでは手続き呼び出し規約って単…

【アセンブリ】スタックフレームの大きさはなぜ24バイト以上?8バイト単位?【MIPS】

手続き呼び出し規約にスタックフレームの大きさは24バイト以上と定められている (P.766) Patterson&Hennessy本によると この最低限のフレームに4つの引数レジスタ ($a0 - $a3) と戻りアドレス$raを、倍長語の境界に整列化して持たせることができる。mainで…

【アセンブリ】スタックフレームを生成するときにスタックポインタから値を引く理由【MIPS】

スタックフレームを生成するときになぜ$spから値を「引く」のか分からなかったのでそれについての考察と現状の理解をまとめた記事を書いておく。 スタックポインタからフレームのサイズを引いて、フレーム用にメモリを割り当てる (p. 764) スタックフレーム…

【アセンブリ】100番目までの素数を求めるプログラムを作ってみる【MIPS】

手順 素数を最初から100番目まで求めてプリントするMIPSのアセンブリ言語プログラムを作ってみる。 素数を求めるために、2つのルーチンを作る prim(n) - nが素数であれば1を返し、そうでなければ0を返す main() - 整数を順々に繰り返し調べて、素数であるか…

【アセンブリ】whileループの繰り返し処理を作る【MIPS】

某Patterson&Hennesy本を参考にしながらCで以下のように実現できるwhileループをアセンブリ言語で作ってみる while (i > k) { printf("Hello") i += 1; } 書いてく まずは前準備。前回やったsyscallの順序に従って...。 totutotu.hatenablog.com .data .alig…

【アセンブリ】システムコールsyscallの使い方【MIPS】

システムコール(syscall)ってなに SPIMでオペレーティングシステム的なサービスを実行するための命令。 syscallを使う手順 サービスの要求の流れ レジスタ$v0に使いたいサービスのシステムコールコードを格納 引数をレジスタ$a0から$a3(浮動小数点数の値…