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

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

/ 2008/08/27 (Wed) / 編集
制約:レジスタはEAX,ECX,EDXしか使えない(他はC言語自身が使うから)

サンプルコードから抜粋(NASKの構文です)
[FORMAT "WCOFF"] ; オブジェクトファイルを作るモード
[INSTRSET "i486p"] ; 486の命令まで使いたいという記述
[BITS 32] ; 32ビットモード用の機械語を作らせる
[FILE "naskfunc.nas"] ; ソースファイル名情報

GLOBAL _write_mem8

[SECTION .text] ; void write_mem8(int addr, int data);
;;addr番地にdataを書き込む _write_mem8:
MOV ECX,[ESP+4] ; [ESP+4]にaddrが入っているのでそれをECXに読み込む
MOV AL,[ESP+8] ; [ESP+8]にdataが入っているのでそれをALに読み込む
MOV [ECX],AL
RET
つまり、[ESP+4*x]番地に関数の第x引数が保存されてるらしい。ここで「INSTRSET "i486p"」というのは「i486モードで作る」という意味で、これがないとECXの意味がかわってしまうらしい。(詳しくは本を読んでねw)
あ、もちろん関数の宣言(GLOBALのとこ)も忘れちゃダメ


でもってC言語側からの使い方例
void write_mem8(int addr, int data);
(中略)
for (i = 0xa0000; i <= 0xaffff; i++) {
write_mem8(i, 15); /* MOV BYTE [i],15 */
}
関数の宣言は忘れずに、ちなみにいうと上の関数は「画面を白に染める」という意味、なぜかというと0xa0000~0xaffffはVRAMの領域で、「15」ってのは「白」という意味だかららしい、へぇ〜


でもって返り値のある関数ではEAXに入っている値が返り値になるらしい
_test: ;int test(int data) MOV EAX,[ESP+4] RET
とすると「test(5)」としたときの返り値は「5」になるらしい

拍手[0回]

PR
/ 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. コンパイラもテスト

      拍手[0回]

/ 2008/08/26 (Tue) / 編集
とりあえず、Makefileで引っかかったのでメモ

copyコマンドとdelコマンドはUNIXには存在しない
#COPY = copy
#DEL = del
COPY = cp
DEL = rm

Windowsのコピーコマンドはファイルの合併もできるらしいがUNIXのcpではできないので以下
#haribote.sys : asmhead.bin bootpack.hrb Makefile
# copy /B asmhead.bin+bootpack.hrb haribote.sys
haribote.sys : asmhead.bin bootpack.hrb Makefile
cat asmhead.bin bootpack.hrb > haribote.sys

runも書き換えなきゃならんらしいが、リモートログイン(CUI)したLinux上でqemuを使うつもりはないので試してはいない
#run :
# $(MAKE) img
# $(COPY) haribote.img ..¥z_tools¥qemu¥fdimage0.bin
# $(MAKE) -C ../z_tools/qemu
run :
../z_tools/make.exe img
qemu -m 32 -localtime -std-vga -fda haribote.img
run :
$(MAKE) img
qemu -m 32 -localtime -std-vga -fda haribote.img


パッチの作り方
diff -u だめなMakefile 正常なMakefile > パッチ.patch
patch -b パッチを当てたいMakefile パッチ.patch

拍手[0回]

忍者ブログ [PR]