忍者ブログ
MASTER →  ADMIN / NEW ENTRY / COMMENT
現代魔法(nearly equal 情報技術)を勉強中な人のメモ(チラシの裏)
/ 2024/11/22 (Fri) / 編集
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

/ 2008/08/27 (Wed) / 編集
先日紹介したVIP言語をようやくためすことができたので紹介

事前に用意するもの
  1. asコマンド(gccコマンドでも可)の入っているパソコン
  2. VIP言語逆コンパイラ
  3. VIP言語コンパイラ
  4. GAS用に書いたプログラム

今回は学校の学生用サーバ(GNU/Linux てゆうかFedora8)でやってみた
今回はアセンブラを使いますが、べつに実行ファイル(機械語プログラム)が生成できるならCだろうがJavaだろうが問題ありません


手順的には
  1. アセンブリ言語でGAS用プログラムを作成
  2. LinuxやUNIXなど、gccを使うやつではGASを使っている、ちなみにGASとintel系のアセンブラ(NASMなど)では構文がいろいろ違うので互換性はない
  3. GAS (GNU Assembler)を使ってアセンブル
  4. この時点で実行可能だが、VIP言語のソースを見てみたいので以下も
  5. VIP逆コンパイラでVIP言語ソースにする
  6. これでVIP言語のソースが見れる
  7. VIP逆コンパイラでVIP言語ソースにする
  8. コンパイラもテスト

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 実行ファイル

実践してみる

  1. %as helloworld.s -o helloworld.o
  2. GASのい構文で書いたソースコード(helloworld.s)をGASでアセンブルしてオブジェクトファイルを生成
  3. %ld helloworld.o -o helloworld
  4. リンカ(ld)をつかって実行ファイルにする(この時点で「%helloworld」とすると「hello world」と出力できる)
  5. %perl revip.pl < helloworld > helloworld.vip
  6. wktkしつつVIP言語に変換してみる、wとWがたくさん並んでるのを見て一人でktkrする
  7. %perl vip.pl < helloworld.vip > hellovipworld
  8. 満足したのでVIPコンパイラで機械語に戻す
  9. %sudo chmod +x hellovipworld
  10. 実行権限も忘れずにw
  11. %hellovipworld
  12. 実行してみる、「helloworld」と同様「hello world」と出力される

      感想

      一人でwktkし、一人でktkrしただけで特に利益はなかった(笑)
      でもまぁこのためだけにGASの構文を勉強したおれはギカ暇人w

      拍手[0回]

      PR
忍者ブログ [PR]