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

[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」になるらしい



後はメモ
「char=1byte=8bit=AL」「short=2byte=16bit=AX」「int=4byte=32bit=EAX」
「ECX=(char *)i」=「MOV ECX,i」レジスタへの書き込み
「*ECX=i&0c0f」=「MOV [ECX],(i&0c0f)」メモリへの書き込み
つまり「ポインタ=番地変数」

配列=ポインタの集合なので「p[i] == *(p+i) == *(i+p) == i[p]」らしい、ほんとか?
変数宣言の時にstaticをつけるとRESB命令の代わりにDB命令を使うようになる(つまり容量が削減できる)

拍手[0回]

PR
忍者ブログ [PR]