アセンブリで簡単なプログラムを作るこんにちは、yumeです。最近アセンブリについて学習したので、簡単に何か、0から入力した正整数までの和を返すものを作ってみます。はじめにアセンブリとは、機械語(0と1)をもう少し人間にとって分かりやすい形にした言語です。NASMというアセンブラを使っています。環境構築の部分は省略します。「詳しいことは(ひとまず)置いておいて、とにかく実装を見たい!」という人を意識して書こうと思ってます。;ecxレジスタはカウンタとして使用される。この一連で動作が終了する。;サブルーチンの呼び出し元へこれを実行すると、7と出ます。「何事だ?」と驚かず、冷静にASCII文字コード表を見ると、文字'7'は10進数で55。一応、計算は出来ていそうです。このままだとなんだか気持ち悪いので、10進数で返って来るようにします。;ecxレジスタはカウンタとして使用される。;これを書くだけで、eaxをebxで割り、結果はeaxに、余りはedxに格納される。この一連で動作が終了する。;サブルーチンの呼び出し元へこれで実行すると、55となります。次は任意の正整数(定数)までの足し合わせさっきまでのコードですと、出力を二桁に限定しているので、13までの足し合わせが限界となっています。次はそこを突破します。;商から0を引き、結果はフラグレジスタへ。eaxretこれを実行すると、5050入力を受け取ってみる今度は入力された正整数までの足し合わせをやって見ます。先ほどまでMAX_NUMが入っていたecxに入力を渡すことができればなんとかなりそうです。eaxretこれを実行して、試しに1と入力してみると、3404745となりました。入力をして見て推測するに、入力した値に2608が加算されているようです。2608がどんな数かと言うと、16進数で0a30。ASCIIコードと照らし合わせると、0と改行の入力を引っくり返したもの(リトルエンディアン)になります。12と入力すると、0x0a3231という入力がされるようです。これは後々の課題になるのですが、とりあえず、一の位だけを取り出すために、ビットマスクでもしておきましょう。eaxretこれで実行し、試しに9を入力してみると45となります。任意の正整数入力に対して0からの和を出すさて、ここまででなんとか一桁の入力までは対応できるようになったので、これを拡張します。;10の倍数をかける。eaxret悩んだ末、なんとかできました。実行し、123と入力すれば、7626となります。4桁以上の整数を入力するとセグメンテーション違反となってしまいます。今度は何が問題なんでしょうか......といったところで、今回はここまでです。終わりにいかがでしたでしょうか。簡単に、とノリで始めて見ましたが、全く簡単では無かったです。そもそも「簡単なプログラム」というのも、それはあくまでjavaやjavascript等の高級言語での話でして、そんな「簡単」なものですら、アセンブリだとこんなに大変なんですね。今回はデータを保存できるレジスタを、汎用レジスタの8つのみ、できるだけabcdを使うようにしていたのですが(それが良いことかどうかはともかく)、少ないリソースをやりくりするのは面白かったです。»Profileid:interprismインタープリズム株式会社の開発者ブログです。TOPはてなブログをはじめよう!interprismさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。