アセンブリ
C言語において配列とポインタは同等のものとして扱うことができる。 アセンブリにおいてこの二者の扱い方の違いはあるのだろうか。MIPSアセンブリにおいて、C言語の配列とポインタの扱い方にどのような違いがあるのか挙動を確認してみる。 test.cというプロ…
Cとアセンブリでprintf()関数もどきをprintf()関数を用いずに自力で実装した。 ソースコードは以下。 https://gist.github.com/totzYuta/76ef4055ea4c03778e17 出力は以下のようになる。 I am Yuta Totsuka, my age is 21 このプログラムの挙動について順を…
とあるC言語のプログラムをアセンブリ言語に変換して、そこから、C言語のstaticとautoをアセンブリ言語ではどのように扱っているのか確認してみる。 C言語およびそれをmips-gccでクロスコンパイルしたプログラムは以下。 Programs in Assembly and C compile…
【アセンブリ】C言語でシステムコールsyscallを使う - 凸ろぐ という記事に引き続き、今度はC言語で記述したハノイの塔hanoi.cをhanoi.sファイルにgccを用いてコンパイルし、それを自分で実装したprint系関数を使って表示する、ということをやってみる。 ま…
とりあえずアセンブリで受け取った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…
以前アセンブリで、100番目までの素数を求めるプログラムを作ったが、それを応用して今度は、ユーザから受け取った入力nに対して、n番目の素数を表示するプログラムを作ってみる。 ということで、以下の記事を参考にしながらプログラムを書き直してみる。 ht…
まず、再帰的な構造を持つプログラムを作るにあたって、手続き呼び出し規約をしっかりと理解しなければいけないらしい。レジスタ使用規約って、言われた方が自分にとってはピンと来るけども。 Patteron&Hennesy本の日本語訳verでは手続き呼び出し規約って単…
手続き呼び出し規約にスタックフレームの大きさは24バイト以上と定められている (P.766) Patterson&Hennessy本によると この最低限のフレームに4つの引数レジスタ ($a0 - $a3) と戻りアドレス$raを、倍長語の境界に整列化して持たせることができる。mainで…
スタックフレームを生成するときになぜ$spから値を「引く」のか分からなかったのでそれについての考察と現状の理解をまとめた記事を書いておく。 スタックポインタからフレームのサイズを引いて、フレーム用にメモリを割り当てる (p. 764) スタックフレーム…
手順 素数を最初から100番目まで求めてプリントするMIPSのアセンブリ言語プログラムを作ってみる。 素数を求めるために、2つのルーチンを作る prim(n) - nが素数であれば1を返し、そうでなければ0を返す main() - 整数を順々に繰り返し調べて、素数であるか…
某Patterson&Hennesy本を参考にしながらCで以下のように実現できるwhileループをアセンブリ言語で作ってみる while (i > k) { printf("Hello") i += 1; } 書いてく まずは前準備。前回やったsyscallの順序に従って...。 totutotu.hatenablog.com .data .alig…
システムコール(syscall)ってなに SPIMでオペレーティングシステム的なサービスを実行するための命令。 syscallを使う手順 サービスの要求の流れ レジスタ$v0に使いたいサービスのシステムコールコードを格納 引数をレジスタ$a0から$a3(浮動小数点数の値…