BrainfuckインタプリタをAssemblyで書き直してみた。


先日の池袋バイナリ勉強会に行ったときの記事を覚えてますでしょうか?

バイナリ勉強会#1

ここにあるようにC++でBrainfuckのインタプリタを書いたのですが、このコードをコンパイルした実行ファイルの大きさがゆうに100kBいってしまっていて、もっと軽くならないものかと思ってたんですよね・・・

 

そこで、今回はBrainfuckのインタプリタをAssembly言語で最初から書き直してみました。

それではどうぞ!


;Brainfuck.asm
 bits 16
 org 100h

;メモリ初期化
 mov cx,799h
set: mov bx,cx
 mov byte [mem+bx],0
 loop set

;コード変換
 mov ah,09h
 mov dx,msg0
 int 21h
 mov ah,01h
 int 21h
 sub al,30h
 mov byte [cvt],al

;Inputメッセージ
 mov ah,09h
 mov dx,crlf
 int 21h
 mov dx,msg1
 int 21h
 mov dx,crlf
 int 21h

;Brainfuckコード入力
 mov ah,01h
input: int 21h
 cmp al,0dh
 jz domsg
 inc word [len]
 mov bx,[len]
 mov byte [cmd+bx],al
 jmp input

;コード実行
domsg: mov ah,09h
 mov dx,crlf
 int 21h
 mov dx,msg2
 int 21h
 mov dx,crlf
 int 21h

main: inc word [cps]
 mov bx,[cps]

cmp byte [cmd+bx],'-'
 jz decr

cmp byte [cmd+bx],'>'
 jz next

cmp byte [cmd+bx],'<'
 jz back

cmp byte [cmd+bx],','
 jz getc

cmp byte [cmd+bx],'.'
 jz putc

;変換分岐
 cmp byte [cvt],1
 jz cnvrt

;変換不必要
 cmp byte [cmd+bx],'+'
 jz incr

cmp byte [cmd+bx],'['
 jz lin

cmp byte [cmd+bx],']'
 jz lout

;変換必要
cnvrt: cmp byte [cmd+bx],':'
 jz incr

cmp byte [cmd+bx],']'
 jz lin

cmp byte [cmd+bx],'\'
 jz lout

done: mov bx,[mps]
 cmp byte [mem+bx],0
 js err
 cmp word [mps],0
 js err
 mov dx,[len]
 cmp [cps],dx
 js main
 mov ax,4c00h
 int 21h

;エラー処理
err: mov ah,09h
 mov dx,msg3
 int 21h
 mov ax,4c00h
 int 21h

;+
incr: mov bx,[mps]
 inc byte [mem+bx]
 jmp done

;-
decr: mov bx,[mps]
 dec byte [mem+bx]
 jmp done

;>
next: inc word [mps]
 jmp done

;<
back: dec word [mps]
 jmp done

;.
putc: mov bx,[mps]
 mov dl,[mem+bx]
 mov ah,02h
 int 21h
 jmp done

;,
getc: mov ah,08h
 int 21h
 mov bx,[mps]
 mov byte [mem+bx],al
 jmp done

;[
lin: mov bx,[mps]
 cmp byte [mem+bx],0
 jz skip
 mov bx,[cps]
 push bx
 jmp done

skip: inc word [cps]
 mov bx,[cps]
 ;変換分岐
 cmp byte [cvt],1
 jz scnvrt
 ;変換不要
 cmp byte [cmd+bx],'['
 jz li
 cmp byte [cmd+bx],']'
 jz ld
 ;変換必要
scnvrt: cmp byte [cmd+bx],']'
 jz li
 cmp byte [cmd+bx],'\'
 jz ld
 jmp skip

li: inc byte [lev]
 jmp skip

ld: cmp byte [lev],0
 jz done
 dec byte [lev]
 jmp skip

;]
lout: pop bx
 mov word [cps],bx
 dec word [cps]
 jmp done

msg0 db "Do you need convert code? (Y:1,N:other)>>$"
msg1 db "Input Brainfuck code!$"
msg2 db "Output$"
msg3 db "Error!!$"
crlf db 0dh,0ah,"$"
cvt db 0
cmd resb 800h
cps dw 0
mem resb 800h
mps dw 0
len dw 0
lev db 0

ソースコードは多少長く長くなりましたが、実行ファイルの大きさはなんと4.5kB!びっくりするほど小さくなりました~

あ、でもここでは命令用・実行用メモリをそれぞれ0x800個、つまり十進数で2048個取っているのですが、Brainfuckの仕様通りに実行用メモリの数を30000個取るようにすると30kBほどに膨れ上がってしまうんです。その代わり、やはり演算は相変わらずめちゃくちゃ早いですw

ダウンロードは先日と同様こちらからどうぞ。Brainfuckインタプリタ

 

また来週くらいに同様の勉強会があるようなので、続きをやりに行こうと思います!!

バイナリ勉強会 #1


池袋で行われているバイナリ勉強会に初めて、友人と参加させて頂きました。

確か去年も一緒に前期試験が終わった直後に勉強会に参加して、その時は八王子まで出向いた気がします。でもそこでの勉強会は失敗だったんだよな・・・orz

まぁそんな前のことはどうでもいいのですねww

 

まずは大体半年程度を通してのカリキュラムを見せて頂きました。

基礎編ではBrainf*ckのインタプリタの自作から始まり、Cコンパイラの自作、UNIX V6でカーネル入門等々と続きます。

今日はその第一回なので、最初の最初にGtk#(初耳)でBrainf*ckのインタプリタをC#で作ります。

C#初めてで大丈夫かな・・・?とか思ったのですが、指示に従って進めていくとJavaの先代だけあって結構似通ったところがあって理解も進みます。

 

ひとまずこれがほとんど完成したところで昼食をはさんで後半戦に望みます。

お次の指示は、自分の好きな言語で何でもいいのでファイルから読み込んでBrainf*ckのインタプリタを作れとのこと。

ここで最初はC言語で作ろうと思ったのですが、気がついたら何故かC++で作ってましたww

 

今更なのですが、ここでBrainfuckの仕様を説明します。(引用:wikipedia Brainfuck

処理系は次の要素から成る: Brainfuckプログラム、インストラクションポインタ(プログラム中のある文字を指す)、少なくとも30000個の要素を持つバイトの配列(各要素はゼロで初期化される)、データポインタ(前述の配列のどれかの要素を指す。最も左の要素を指すよう初期化される)、入力と出力の2つのバイトストリーム。

Brainfuckプログラムは、以下の8個の実行可能な命令から成る(他の文字は無視され、読み飛ばされる)。

  1. >: ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。
  2. <: ポインタをデクリメントする。C言語の「ptr--;」に相当。
  3. +: ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。
  4. -: ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。
  5. .: ポインタが指す値を出力に書き出す。C言語の「putchar(*ptr);」に相当。
  6. ,: 入力から1バイト読み込んで、ポインタが指す先に代入する。C言語の「*ptr=getchar();」に相当。
  7. [: ポインタが指す値が0なら、対応する ] の直後にジャンプする。C言語の「while(*ptr){」に相当。
  8. ]: ポインタが指す値が0でないなら、対応する [ (の直後)にジャンプする。C言語の「}」に相当。

 

・・・開発始める前にちゃんと仕様読めば良かったなぁ。最初[には絶対に一回は入るように作っちゃうから失敗するんだよねww

そんな感じでなんだかんだで完成したのが以下になります。数ヶ月ぶりのちゃんとしたコーディングなので、完全に感覚が鈍っててコードが汚いのは勘弁してください。

#include <iostream>
#include <fstream>
#include <cstdio>

using namespace std;

void func(char[],char[],int*,int*,int*);
int loop[128]={};

int main(void){
 ifstream ifs;
 char c,cmd[2048]={},mem[30000]={};
 int i=0,cps=0,mps=0,lps=0;

 ifs.open("text.bf",ios::in);

 if(!ifs){
  cout << "ファイルが存在しません。" << endl;
  return -1;
 }

 for(i=0;!ifs.eof();i++){
  ifs.get(c);
  cmd[i]=c;
 }
 while(cps<i-1)
  func(cmd,mem,&cps,&mps,&lps);

 ifs.close();
 return 0;
}

void func(char cmd[],char mem[],int *cps,int *mps,int *lps){
 int lev = 0;

 switch(cmd[*cps]){
  case '>':
   ++*mps;
   break;

  case '<':
   --*mps;
   break;

  case '+':
   ++mem[*mps];
   break;

  case '-':
   --mem[*mps];
   break;

  case '[':
   if(mem[*mps]>0){
    ++*lps;
    loop[*lps]=*cps;
   }
   else{
    int lev=1;

    do{
     ++*cps;
     switch(cmd[*cps]){
      case '[':
       ++lev;
       break;

      case ']':
       --lev;
       break;
     }
    }while(lev!=0||cmd[*cps]!=']');

   }
   break;

  case ']':
   if(mem[*mps]>0)
    *cps=loop[*lps];
   else
    --*lps;
   break;

  case '.':
   cout << mem[*mps];
   break;

  case ',':
   mem[*mps]=getchar();
   break;
  }
  ++*cps;
}

ここで初めは","に対して『cin >> mem[*mps]』を使ってたのですが、これだと改行コードが含まれないことが判明したのでgetchar()にしました。
途中break文ごとコメントアウトして何で正常に動かないのだろうとかいうミスをやらかしたりしましたが、結果的に完成したのでよしとしましょう。
ここに完成品を置いておきますね。これはファイル読み込みではなく標準入力にしておきます。

Brainfuckインタプリタ

さて、一通り済んだところで残り時間もわずかになりましたが、次の講座のためにMinGWを準備してbinutilsのインストールまでやっておきます。
・・・ただここで『性能の違い』というものを見せ付けられました。自分のほう(Atom)が先にビルト始めたのに、友人のPC(i5)の方が完全に先に処理を終えるというwwww

 

まぁこんな感じで久しぶりに良い勉強会に当たったようなので、これから常連さんにでもなろうかと思っています。

これからもよろしくお願いします!

NFCハッカソン、のちMT・AT


本日は六本木ヒルズで開催されました、NFCハッカソンに行ってきました。

NFCとは近距離無線通信の方式の一つであり、厳密には大分違いますが、FeliCaと同じようなものだと思って頂ければ分かりやすいと思います。

RFIDタグのこれからの利用法やスマートタグの紹介、AndroidでのNFCを利用したアプリケーションのアイデアなど、新しい情報を色々と得ることが出来ました。

 

 

その後二子玉川に舞い戻り、いつもどおりMT車の教習を受けた後、今度は初のAT車の教習が待ってました。

これはどうやら『AT車も運転するからには、しっかりと理解できていなければいけない』という配慮でしょうか。

MT車で教習の皆さん、AT車はギアチェンジがほぼ無いからといって高をくくってはなりませんよ、と学科教本にも有りましたとおり、しっかりと心の準備をして臨みました。

 

もうMT車の運転にも少し慣れたころでした。そこでAT車を運転すると大分印象がちがいます。

一番気にかかったのはエンジンブレーキの効きの悪さ(?)です。無段階変速なのでそれはそうでしょうが・・・

自宅の車もバリバリATのプリウス君ですから、やっぱりAT車の運転にも慣れないとねw

rpmでCentOS5.5に最新のPHP5.3.6、Mysql14.14を導入!


1ヶ月ぶりの更新となります。
お久しぶりです。

先日早稲田大学のキャンパスで行われた『Android Bazaar and Conference 2011 Summer』に参加してきました。
いやぁ、楽しかったですね・・・
詳細はまた後日、お伝えしますね!!

 

 

さて、本題に戻って最新PHP、Mysqlの導入ですね。
この度、このブログを提供しているWordPressの最新版がリリースされました。
更新しようとしたところ、PHPのバージョンエラーが・・・

どうやらPHP5.2.4以降のものを要求しているそうです。
しかし、このサーバーはPHP5.1.6
そりゃエラー吐きますわなw

 

まず、現状を見てみます。

[root@web ~]# php -v
PHP 5.1.6 (cli) (built: Mar 31 2010 02:44:37)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

[root@web ~]# mysql --version
mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1

案の定でした。

 
てなわけで更新です。

[root@web ~]# yum update php
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: centos.tt.co.kr
* base: centos.tt.co.kr
* epel: ftp.kddilabs.jp
* extras: centos.tt.co.kr
* rpmforge: fr2.rpmfind.net
* updates: centos.tt.co.kr
Setting up Update Process
No Packages marked for Update

・・・あれぇ?
どうやら外部のリポジトリを登録せにゃならんようです。

 

Les RPM de Remiを登録しましょう

[root@web ~]# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
http://rpms.famillecollet.com/enterprise/remi-release-5.rpm を取得中
警告: /var/tmp/rpm-xfer.8TKE13: ヘッダ V3 DSA signature: NOKEY, key ID 00f97f56
エラー: 依存性の欠如:
epel-release >= 5 は remi-release-5-8.el5.remi.noarch に必要とされています

あ、epelもいるのね。
じゃあ、2つを連続してインストールします。

[root@web ~]# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm を取得中
警告: /var/tmp/rpm-xfer.zVp32l: ヘッダ V3 DSA signature: NOKEY, key ID 217521f6
準備中... ########################################### [100%]
1:epel-release ########################################### [100%]
[root@web ~]# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
http://rpms.famillecollet.com/enterprise/remi-release-6.rpm を取得中
警告: /var/tmp/rpm-xfer.IkLo0u: ヘッダ V3 DSA signature: NOKEY, key ID 00f97f56
準備中... ########################################### [100%]
1:remi-release ########################################### [100%]

rpmは更新されるので、最新版は以下で確認してください。
http://download.fedora.redhat.com/pub/epel/5/i386/
http://rpms.famillecollet.com/enterprise/

 

ようし、アップデートの準備完了!
いざっ

[root@web ~]# yum --enablerepo=remi update php

---略---

Transaction Check Error:
file /etc/my.cnf from install of mysql-libs-5.5.14-1.el5.remi.i386 conflicts with file from package mysql-5.0.77-4.el5_5.4.i386
file /usr/share/mysql/charsets/Index.xml from install of mysql-libs-5.5.14-1.el5.remi.i386 conflicts with file from package mysql-5.0.77-4.el5_5.4.i386

---以下略---

 

あ、Mysqlを先に更新しろということですね、はい

[root@web ~]# yum --enablerepo=remi update mysql
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: centos.tt.co.kr
* base: centos.tt.co.kr
* epel: ftp.kddilabs.jp
* extras: centos.tt.co.kr
* remi: remi-mirror.dedipower.com
* rpmforge: fr2.rpmfind.net
* updates: centos.tt.co.kr
Setting up Update Process
Resolving Dependencies

---略---

Dependencies Resolved

======================================================================================================================================
Package Arch Version Repository Size
======================================================================================================================================
Updating:
mysql i386 5.5.14-1.el5.remi remi 7.5 M
Installing for dependencies:
libedit i386 20090923-3.0_1.el5.rf rpmforge 262 k
mysql-libs i386 5.5.14-1.el5.remi remi 1.1 M
mysqlclient15 i386 5.0.67-1.el5.remi remi 1.3 M
Updating for dependencies:
mysql-server i386 5.5.14-1.el5.remi remi 12 M
php i386 5.3.6-4.el5.remi remi 1.3 M
php-cli i386 5.3.6-4.el5.remi remi 2.6 M
php-common i386 5.3.6-4.el5.remi remi 970 k
php-mbstring i386 5.3.6-4.el5.remi remi 2.3 M
php-mysql i386 5.3.6-4.el5.remi remi 148 k
php-pdo i386 5.3.6-4.el5.remi remi 113 k

Transaction Summary
======================================================================================================================================
Install 3 Package(s)
Upgrade 8 Package(s)

---略---

Dependency Installed:
libedit.i386 0:20090923-3.0_1.el5.rf mysql-libs.i386 0:5.5.14-1.el5.remi mysqlclient15.i386 0:5.0.67-1.el5.remi

Updated:
mysql.i386 0:5.5.14-1.el5.remi

Dependency Updated:
mysql-server.i386 0:5.5.14-1.el5.remi php.i386 0:5.3.6-4.el5.remi php-cli.i386 0:5.3.6-4.el5.remi
php-common.i386 0:5.3.6-4.el5.remi php-mbstring.i386 0:5.3.6-4.el5.remi php-mysql.i386 0:5.3.6-4.el5.remi
php-pdo.i386 0:5.3.6-4.el5.remi

Complete!

・・・見てるとPHPも更新してくれてますね。

 
バージョン見てみましょう。

[root@web ~]# php -v
PHP 5.3.6 (cli) (built: May 16 2011 19:18:00)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
[root@web ~]# mysql --version
mysql Ver 14.14 Distrib 5.5.14, for Linux (i686) using readline 5.1
[root@web ~]# service httpd restart
httpd を停止中:
httpd を起動中:

おkですね。
これでWordPress3.2.1導入できました。

これからもよろしくお願いします~

goToSleep()?


ついこの間、学校でAndroid君をいじっていたら、教師に電源を切るよう怒られましたorz

別に電源を切ること自体はなんでもないんですが、やることいっぱいで忙しいこのときにリブートには時間がかかるわけですよ、、、

なので、こんなときのためのジョークアプリ作ってみましたww

 

単にシャットダウンダイアログを出してスリープにする、とういうだけの作業だったのですが、意外と苦労しました。

それは、スリープに移行する権限をuses-permissionでは指定できないから!!

本来なら、AndroidをスリープさせるgoToSleepはPowerManagerに含まれているので、『android.permission.DEVICE_POWER』を許可してやりゃいい筈なんですが・・・

ERROR:user *** nor process doesn't have permission "android.permission.DEVICE_POWER".

あれま。

どうやら、goToSleep()はシステムからしか操作できないようで

 

だったら、別の方式で攻めましょう。

バックライト点灯時間の操作です。

 if((defTime = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, -1))==-1)
 finish();
 halting = new ProgressDialog(this);

 AlertDialog.Builder confirm = new AlertDialog.Builder(this);
 confirm.setIcon(android.R.drawable.ic_dialog_alert);
 confirm.setTitle("電源を切る");
 confirm.setMessage("携帯電話の電源を切ります。");

システムのバックライト消灯時間を頭で取得して、その後ダイアログを出します。


Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 500);

ひとまずこれで消灯時間を500ミリ秒にして、、、

 @Override
 public void onPause(){
 super.onPause();
 halting.dismiss();
 halting = null;
 }

 @Override
 public void onDismiss(DialogInterface arg0) {
 // TODO Auto-generated method stub
 Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, defTime);
 finish();
 }

消灯後にonPauseでダイアログを消し、onDismissでそれに続いて設定を戻して終了です。

これは『android.permission.WRITE_SETTINGS』を必要としますので、少々インストールを拒みたくなりますが、怖いことはしてないので安心してくださいww
ものはこれ です。

案の定というかなんというか


受験勉強が忙しい今日このごろですが、ちょっと息抜きということでAndroidの壁紙を作ってみることにしました。

壁紙といっても、ただ単に表示されてるだけじゃありません。動くんです!

まぁ、ようはライブ壁紙ですね。

 

はじめはただ単に自分の趣味で好きなキャラクターが動き回るように作ったのですが、それを学校で見せたところある程度上々の評価。

なんか公開したらいけるんじゃないか?でも著作権とか大丈夫かな・・・

とか思ってたのですが、法律に詳しい友達に聞いたら金を取るような商売目的じゃなきゃ良いらしい(←本当かな・・・?)

こんな不確かな情報じゃ怖いので、自分が使ってたキャラクターの絵のページを見ると『フリー素材』の文字発見!

これで安心して公開できますねw

 

そんなわけで『リトルバスターズ!』と『とある魔術の禁書目録』、あと『涼宮ハルヒシリーズ』のキャラがランダムに出現し、画面上を歩き回りまわるやつ作ってみました~

これは元々は自分の娯楽用で作ったので過度な期待はしないでくださいねw

リンクはここです。

たった1日にしてダウンロード数が400を超えるとは・・・

やはりアニメ力恐ろしいっ

ShiftCrops製作開始!


今日はShiftCropsのページの製作を開始しました。

はっきり言って、HPの製作はかなりの初心者です。なので、まずは普通にタグ打ちして、あとでスタイルシート適用しようっていう感じです。

・・・まぁ、大変ですよね。

いろいろな人のページを拝見させてもらいながら、本日700分かけて組みました。

でもちょっとお粗末かもorz

トップページができれば、あとはPHPにぶち込んでリクエストに応じて動的にページをリンクさせれば良いだけ、と思ったのですが、ここで問題発生。

どうやればいいの??

ここで、頼みの大先生Mineさんに質問です。

回答は単純明快!

if(isset($_GET['hoge']))とか、elseif とかでreqire

はい、終了です。

まだまだ完成はしていませんが、一部公開したので、詳しくはコチラ

OSって奥深いねぇ


昨日から、やっと自作OSの開発に本格的に取り組み始めました!
と言っても、教科書の順を追ってコーディングしてくだけなんですけどねw

川合秀実さんの「OS自作入門」、これ結構分かりやすいですよねぇ~
川合さんは、セキュリティー&プログラミングキャンプ2010のOS自作組で講師をしていらしたようです。
こんなことなら、ネットワークセキュリティ組よか(ry
なんでもありません。元々自分はネットワークの畑でやってこうとしてた者ですから、全くもって問題ないです。
ていうか、もし違う組だったら今知り合ってる人たちとは知り合えなかったのかなぁ・・・?

ま、いいや

今日はそこまで進んではいません。

まあ、まずは皆さんおなじみの「Hello,World」ですよね。
ちょっと小さくて見にくいかもしれません。
まあ、そこらへんは勘弁してください。
これはブートローダだけのとても軽いプログラムです。
因みにアセンブリで書かれています。
次はディスクの読み込みですね。OSたるもの、ちゃんとシステムを読まなきゃブートローダもなにも無いですもんねw
画面には何も表示されませんが、奥でごにょごにょやってるBIOS君やブートローダ君、いつもありがとうございます!

で、次は早速OS本体の製作です。
方針としてはどうやら、はじめのCPU君とメモリ君とのやり取りはアセンブリで行い、その後のOSの機能はC言語で記述していくようです。
でも、OSの中でも直接I/Oやメモリ等々と渡り歩かなきゃいけない時があり 、そのときはまたアセンブリに頼るようです~

早速作ったのは・・・
なんだかしましまですね。
これはVRAMに色の値を書き込んでやっただけなんですが、、、
よくよくみるとこのVRAM結構すごい。
VRAMは全部で64KBあるらしいですが、そのメモリひとつひとつが全ての画素ひとつひとつに割り当てられてるんですってね!
当たり前っちゃ当たり前なんですけど、物を知らない俺にとってはちょっと感動物でした。

続いては四角、四角、刺客もとい四角。
これは単純にx座標方向に連続して同じ値を代入し、それをy座標方向にも同じだけ繰り返す、という作業で正方形ができます。

まあ、そこで本日の〆はこんな感じ。
なんだかWindows95とかってこんな感じでしたっけ?
いきなりやってることが飛んだように見えますがやってることは至って単純。
一旦バックを緑で埋めて、その後下に灰色のタスクバーを生成。後はメニューボタンとかが入りそうなところに影つけてボタンに見せるだけ。
ようは、これボタンじゃないんですよねww

しばらくはこんな感じで本の受け売りが続くかもしれませんが、暖かく見守っていてください。
では~

何のメソッドでしょう


いやはや、昨日は一日中センター模試に追われた酷い一日でしたよ。
やっぱりもうそろそろマジで受験生って言う感じですね(汗)

それは置いておいて、前回のタブの件、無事解決しました~
XMLで指定するのもちゃんと動いたんですが、今作ってるアプリの関係上別のアクティビティを指定することにしました。
んで、その一部のコードがこれです。

private int check(){
int rest = 12;
Boolean check;

for(int k=0;k&lt;2;k++) 
next:
 for(int j=0;j&lt;5;j++)
  for(int i=0;i&lt;5;i++){
   check = (k==0) ? *****_chk[j][i]:*****_chk[i][j];
   if(check){
    rest--;
    continue next;
   }
  }
for(int k=0;k&lt;2;k++)
 for(int i=0;i&lt;5;i++){
  check = (k==0) ? *****_chk[i][i]:*****_chk[i][4-i];
  if(check){
   rest--;
   break;
  }
}

return rest;
}

都合により、変数名でばれないように一部を*に置き換えましたww
まあメソッド名にcheckってあるし、まあなんとなくは分かるよね~

まだ開発途中なのでなんともいえませんが、できたらちゃんと公開しますよ!

結構時間かかるのよな


 私の生活スタイルって結構特殊なんですよねぇ

 ついこの前までは夜は1時半頃に寝て、朝は5時に起きるという極めて不健康な感じだった訳ですけども、最近になってようやく変えることができました。
それは、夜は10時に寝て朝は2時に起きるというものです。
そんな朝早くおきてどうするの、と聞かれれば、それは勿論コーディングですw

 でも時々目覚まし時計で起きれなく、気がついたら5時で「その日はコーディング無し!」になることもあるんですよ(泣)
ま、それが昨日なんですけどねww

 んで、今日も引き続きアセンブリ言語っすよ。
ところで、なんで今頃アセンブリ言語なんてやってるのかというと、一言で言えば「自作OS」!!
夢なんです。それも高校のうちでっていう
そんなわけで今も頑張っているわけですが、よくよく考えると今やってるやつってDOS上のシステムコール使ってるわけで、自作OSに関係ないじゃん?

・・・・・・
・・・

え、
まあ、細かいことは気にせずに、練習っていうことですね。

 本日の学習範囲は演算です。
いやはや、やっぱり高水準言語とは違って面白いね
加算のADDや減算のSUB、これらはディスティネーションオペランドに元の値を入れてソースオペランドで加えたり引いたりする値を指定する。これは感覚で分かります。
でも、ここで面白いのが乗算のMULと除算のDIV。両者ともオペランドはひとつしかなく、ALレジスタやAXレジスタに入っている値を元の値とします。
 MULはオペランドに指定された値をAL、もしくはAXに入っている値と掛け合わせてAXに保存。
 DIVは指定された値でAXに入っている値を割り、商はAL、余りはAHに保存されます。

使い方を逡巡してしまいました。でもすぐ分かったけどね♪
これはシステムコール関係ないし、良かったねww

この本まだまだ終わりそうにないなぁ・・・
いつになったらOS自作始めれるんだろ??