プログラム / 2008/08/27 (Wed) / 編集 |
先日紹介したVIP言語をようやくためすことができたので紹介
事前に用意するもの
今回は学校の学生用サーバ(GNU/Linux てゆうかFedora8)でやってみた
*今回はアセンブラを使いますが、べつに実行ファイル(機械語プログラム)が生成できるならCだろうがJavaだろうが問題ありません
手順的には
事前に用意するもの
- asコマンド(gccコマンドでも可)の入っているパソコン
- VIP言語逆コンパイラ
- VIP言語コンパイラ
- GAS用に書いたプログラム
今回は学校の学生用サーバ(GNU/Linux てゆうかFedora8)でやってみた
*今回はアセンブラを使いますが、べつに実行ファイル(機械語プログラム)が生成できるならCだろうがJavaだろうが問題ありません
手順的には
- アセンブリ言語でGAS用プログラムを作成 LinuxやUNIXなど、gccを使うやつではGASを使っている、ちなみにGASとintel系のアセンブラ(NASMなど)では構文がいろいろ違うので互換性はない
- GAS (GNU Assembler)を使ってアセンブル この時点で実行可能だが、VIP言語のソースを見てみたいので以下も
- VIP逆コンパイラでVIP言語ソースにする これでVIP言語のソースが見れる
- VIP逆コンパイラでVIP言語ソースにする コンパイラもテスト
VIP言語逆コンパイラ
機械語からVIP言語に変換するコンパイラ、「0」を「W」に、「1」を「w」に変換するvip.pl#!/usr/bin/perl
use strict;
my $c = 0;
binmode(STDIN);
for(sub{local $/ = \1; <>;}->()){
$_ = unpack'B*',$_;
y/01/Ww/;
print$_,(++$c%4)?" ":$/;
}
使い方
perl revip.pl < binary.bin > source.vip
VIP言語コンパイラ
VIP言語を機械語に変換するコンパイラ、「W」を「0」に、「w」を「1」に変換する#!/usr/bin/perl
use strict;
$_ = sub{local $/; <>;}->();
y/Ww//cd;y/Ww/01/;
binmode(STDOUT); # Windowsでコンパイルするときに必要
print pack'B*',$_;
使い方
perl vip.pl < source.vip > binary.bin
GAS用に書いたプログラム
GAS用のプログラム、intelのとは構文が違うので注意#データを用意 .section .data
msg: .ascii "hello world\n" #出力する文字列を用意
msgend: .equ len, msgend - msg #長さも計算しておく
#プログラム開始
.section .text
.global _start #開始ラベルを指定
_start:
movl $4,%eax # write system call(sys_write)
movl $1,%ebx # 出力先はstdout
movl $msg,%ecx
movl $len,%edx
int $0x80 #割り込み
movl $1,%eax #終了要求
movl %ecx,%ebx #終了コード
int $0x80 #割り込み
ret #return
使い方
as ソースコード.s -o オブジェクトファイル.o
ld オブジェクトファイル.o -o 実行ファイル
実践してみる
- %as helloworld.s -o helloworld.o GASのい構文で書いたソースコード(helloworld.s)をGASでアセンブルしてオブジェクトファイルを生成
- %ld helloworld.o -o helloworld リンカ(ld)をつかって実行ファイルにする(この時点で「%helloworld」とすると「hello world」と出力できる)
- %perl revip.pl < helloworld > helloworld.vip wktkしつつVIP言語に変換してみる、wとWがたくさん並んでるのを見て一人でktkrする
- %perl vip.pl < helloworld.vip > hellovipworld 満足したのでVIPコンパイラで機械語に戻す
- %sudo chmod +x hellovipworld 実行権限も忘れずにw
- %hellovipworld 実行してみる、「helloworld」と同様「hello world」と出力される
トラックバック
URL :
コメント