ページへ戻る
印刷
hideyosi/osalink1でお勉強
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:hideyosi/osalink1でお勉強 をテンプレートにして作成
開始行:
*なんすかこれ?
hideyosiのお勉強のページ♪~
GOとかtolsetとかの中にosalink1.exeっつーのがある。これは...
(そうなると、MinGWだとか、別のきれいに整った開発環境で作...
・・・こいつが、28GOでコンパイルできない・・・
なんかムカつく!
っつーわけで、よい教材になるかなと思って28GOでコンパイル...
ちなみに、ここからダウンロードできるぞよ?
http://sourceforge.jp/projects/osask/downloads/45468/osal...
*sjisconv.exe
こいつはなにをやっているのか。たしか、ソースコード内にShi...
..\z_tools\sjisconv.exe -s osalink1.c osalink1.ca
osalink1.caの中身を見てみると日本語部分がぜーんぶ「\203」...
*cc1.exe
CのソースなんだからCでコンパイルすると。(あったりまえだ...
COLOR(red){osalink1のソース内に、ctype.hが宣言されてる。...
ここで復習。Cコンパイラはなにをしてるのか。総合環境だと忘...
あくまでも、Cソースを元に''アセンブラコードを作ってくれる...
こんなことしてアセンブラコードであるosalink1.gasを作ると...
..\z_tools\cc1.exe -I../z_tools/win32/ -Os -Wall -quiet ...
*gas2nask.exe
cc1で出来上がったosalink1.gas。これは先に述べたように、''...
さて。28GO(GO 0023)のCコンパイラは元々gccだった。そのた...
つまり、このosalink1.gasをGASでコンパイル(アセンブル)す...
・・・しかし! 我らが28GO(笑)にはGASよりカッチョイイna...
・・・そんなわけで。GAS用のアセンブラコードをnasuka用に変...
..\z_tools\gas2nask.exe -a osalink1.gas osalink1.nas
これで、nasukaでアセンブルできるコード、osalink1.nasが出...
*nask.exe(本名 nasuka )
アセンブラのnask.exeでアセンブルすると、これで初めて''バ...
..\z_tools\nask.exe osalink1.nas osalink1.o
NASK : TMPBUF is not enough
・・・順調だったのに・・・orz・・・エラーで止まってしまっ...
**エラーの解析と対処
COLOR(red){このセクションは移動or削除ora大改編が予想され...
「NASKのエラーなんて、ググってもなんもわかんないよおぉぉ...
・・・って思ってたら、それはそれ。インターネットってスゲ...
http://www.rapuos.net/scrsvr.html
これによると、''外部変数が多いと''NASKがこのエラーを吐く...
osalink1.cの内部をざーーっと眺めてみる。グローバル変数?...
これかなぁ。先頭で
#define BUFSIZE 2 * 1024 * 1024
こんなことをやっている。これが大きすぎるってことなのかな...
うはぁ!!! NASKのコンパイルが通ったぞ???
COLOR(red){もちろん単にここを小さくするのは問題のはずだ。...
*ld.exe
さていよいよldの登場ですw~
**なんなの?それは???
今、まだ積み残しの問題があるとしても、とにもかくにもnasuk...
じゃあ、このバイナリは動かせるのでしょうか?~
答えは No! です。
なぜかって? このosalink1.oには''プログラムが書かれてい...
たとえば。「xxxをディスクに書き込みする」という命令がある...
51 01 89 C2 C1 FA 10 C1 F8 18 88 51 02 88 41 03 5D C3 55...
こんなんだとしますよね? (もちろん機械語ですよw) こ...
・・・しかし、この段階では、この命令はosalink1.o内には書...
同じように、他の命令も書かれていません。
-画面に一文字書き出せ
-メモリをxxxバイト確保しろ
-書かれている文字を数値に変換して計算し、結果を再び文字に...
-etc・・・・
osalink1.o内には様々な動作をする命令がちゃんと沢山書かれ...
もちろんそれも可能です。しかし、こういうよく使われる・い...
ldは「リンカ」と呼ばれるプログラムで、こういったバラバラ...
**さて! いざ、リンク!
..\z_tools\ld.exe --stack 0x2000000 -o osalink1.exe osa...
・・・ダメだった・・・・orz・・・(やっぱみようみまねじゃ...
..\z_tools\ld.exe: warning: cannot find entry symbol _ma...
osalink1.o(.text+0x85):osalink1.ca: undefined reference ...
osalink1.o(.text+0xba):osalink1.ca: undefined reference ...
osalink1.o(.text+0xdf):osalink1.ca: undefined reference ...
osalink1.o(.text+0xf4):osalink1.ca: undefined reference ...
osalink1.o(.text+0x11d):osalink1.ca: undefined reference...
osalink1.o(.text+0x125):osalink1.ca: undefined reference...
osalink1.o(.text+0x164):osalink1.ca: undefined reference...
osalink1.o(.text+0x262):osalink1.ca: undefined reference...
osalink1.o(.text+0x270):osalink1.ca: undefined reference...
osalink1.o(.text+0x275):osalink1.ca: undefined reference...
さて。このエラーはなんだろうか?~
上記の命令だと、osalink1.oとlibmingw.libを合体させてosali...
「おいおい! osalink1.o内で、fopenって命令を使ってるじゃ...
と、こういう答えを出して来たと。こういうわけ。
他のライブラリを指定してあげれば、それらから命令を拾って...
..\z_tools\ld.exe -s -Bdynamic --stack 0x2000000 -o osa...
osalink1.obj(.text+0xda):osalink1.ca: undefined referenc...
osalink1.obj(.text+0x15f):osalink1.ca: undefined referen...
osalink1.obj(.text+0x41a):osalink1.ca: undefined referen...
osalink1.obj(.text+0x45d):osalink1.ca: undefined referen...
・・・ダメですた・・・orz・・・
あっれぇ?? 今、ざーっと調べてみたんだけど、そういえばz...
COLOR(red){さらに発覚! tolower関数は、あの、''ctype.h''...
*やべ・・・いろいろゴチャゴチャになってきたぞw
**tolower関数
逆に言えば!!
ctype.hをインクルードしてるけど、この関数さえあればいいわ...
tolower関数は、文字が大文字なら小文字に変換。大文字以外な...
A~Zってーのは、41h~5Ahまで。で、a~zまでは61h~7Ahまで...
char tolower_hide(char moto){
if ( (moto > 0x41) && (moto < 0x5a ) ){
return moto + 0x20;
}
else{
return moto;
}
}
・・・これじゃダメか???
ぶははは。なんかうまく行きそうな予感wwwww
**fscanf関数
うーーーん・・・・・・・(汗
fscanfそのものはなんかけっこう複雑なもののように思う。・...
osalink1.c内ではfsnanfはこんな形で使われている。
for (i = 0; fscanf(fp0, " %s", fname) == 1; i++) {
fp1 = fopen(fname, "rb");
if (fp1 == NULL) {
トーシローのオイラも目には、これはosalink.optを''一行づつ...
・・・これ、fgets()じゃダメなの?(幸いstdio.hにはfgets関...
なんでKタンはfgets()を使わずにfscanf()を使ったんだろう?...
とにもかくにも!!!!!
こんなことしたら、コンパイルが通った。
fp0 = fopen(optfile, "r");
if (fp0 == NULL) {
fprintf(stderr, "Can't open \"%s\".\n", optfile);
return 1;
}
// for (i = 0; fscanf(fp0, " %s", fname) == 1; i++) {
for (i = 0; fgets(fname,32,fp0) != NULL; i++) {
fp1 = fopen(fname, "rb");
if (fp1 == NULL) {
さーて。乱暴者のオラはこれでOSASKをコンパイルしてみようw...
ダメか・・・
どうも、fgetsだと改行コードが入り込むらしい。そんならって...
for (i = 0; fgets(fname,32,fp0) != NULL; i++) {
//改行コードの引っこ抜き
for ( i2 = 31; i2 != 0; i2--){
if ( fname[i2] == 0x0a ) fname[i2] = 0;
if ( fname[i2] == 0x0d ) fname[i2] = 0;
}
fp1 = fopen(fname, "rb");
if (fp1 == NULL) {
err1:
fclose(fp0);
・・・やっぱだめだなぁ・・・orz
わからんなぁ・・・・・・。こうしてみると・・・
strcpy (fname,"base.exe"); ...
fp1 = fopen(fname,"rb");
if (fp1 != NULL){
fprintf(stderr, "testOpenOK!\n", fname); ...
fprintf(stderr, "nagasa=%d\n", strlen(fname)); ...
fclose(fp1);
}
// for (i = 0; fscanf(fp0, " %s", fname) == 1; i++) {
for (i = 0; fgets(fname,32,fp0) != NULL; i++) {
//改行コードの引っこ抜き
for ( i2 = 31; i2 != 0; i2--){
if ( fname[i2] == 0x0a ) fname[i2] = 0x0;
if ( fname[i2] == 0x0d ) fname[i2] = 0x0;
}
fp1 = fopen(fname, "rb");
if (fp1 == NULL) {
err1:
fclose(fp0);
fprintf(stderr, "Can't openaaa \"%s\".\n", fname); ...
fprintf(stderr, "nagasa=%d\n", strlen(fname)); ...
return 1;
}
なぜ読み込んで改行抜きをしたfnameではエラーになるんだろう...
こうやったらうまくいった!!! ・・・・でも納得できない...
strcpy (fname2,fname);
fp1 = fopen(fname2, "rb");
*最後! 例のバッファ!
このbuf0って、文字通り、対象ファイルを読み込んだものを格...
static unsigned char buf0[BUFSIZE];
この命令で、2 × 1024 × 1024バイトの''空文字が格納された文...
・・・''グローバル変数じゃないもの''にすればOK??
そんなわけで、こんなことしてみた。すると・・・・
const int main(int argc, char **argv)
{
FILE *fp0, *fp1;
int i, i2,j, k, size, totalsize = 0;
unsigned char fname[32], name[8], c;
unsigned char fname2[32];
unsigned char bufX[2*1024*1024];
おぉ!bufXは使っていないんだけど、とにもかくにもこうやっ...
なぜbuf0はわざわざグローバル変数になってるんだろ? それ...
const int script(char *opt, char *inp, char *out)
/* スクリプトが4KBを超えたら死にます */
{
unsigned char *buf = buf0 + 4 * 1024, *scr0 = buf0, *scr...
FILE *fp;
int size, memofs, filofs;
・・・あれ? この、script関数内だけじゃないか!!!!~
だったらさぁ。こうやって、script関数の引数に、buf0のアド...
const int script(char *opt, char *inp, char *out, char *...
/* スクリプトが4KBを超えたら死にます */
{
unsigned char *buf = helmes_buf + 4 * 1024, *scr0 = helm...
FILE *fp;
int size, memofs, filofs;
COLOR(blue){うぎゃあぁぁぁぁぁぁぁぁぁぁぁぁ!!!!! ...
*誰かCに詳しい人検証してくれww
#ref(osalink1_src_1.2.zip)
終了行:
*なんすかこれ?
hideyosiのお勉強のページ♪~
GOとかtolsetとかの中にosalink1.exeっつーのがある。これは...
(そうなると、MinGWだとか、別のきれいに整った開発環境で作...
・・・こいつが、28GOでコンパイルできない・・・
なんかムカつく!
っつーわけで、よい教材になるかなと思って28GOでコンパイル...
ちなみに、ここからダウンロードできるぞよ?
http://sourceforge.jp/projects/osask/downloads/45468/osal...
*sjisconv.exe
こいつはなにをやっているのか。たしか、ソースコード内にShi...
..\z_tools\sjisconv.exe -s osalink1.c osalink1.ca
osalink1.caの中身を見てみると日本語部分がぜーんぶ「\203」...
*cc1.exe
CのソースなんだからCでコンパイルすると。(あったりまえだ...
COLOR(red){osalink1のソース内に、ctype.hが宣言されてる。...
ここで復習。Cコンパイラはなにをしてるのか。総合環境だと忘...
あくまでも、Cソースを元に''アセンブラコードを作ってくれる...
こんなことしてアセンブラコードであるosalink1.gasを作ると...
..\z_tools\cc1.exe -I../z_tools/win32/ -Os -Wall -quiet ...
*gas2nask.exe
cc1で出来上がったosalink1.gas。これは先に述べたように、''...
さて。28GO(GO 0023)のCコンパイラは元々gccだった。そのた...
つまり、このosalink1.gasをGASでコンパイル(アセンブル)す...
・・・しかし! 我らが28GO(笑)にはGASよりカッチョイイna...
・・・そんなわけで。GAS用のアセンブラコードをnasuka用に変...
..\z_tools\gas2nask.exe -a osalink1.gas osalink1.nas
これで、nasukaでアセンブルできるコード、osalink1.nasが出...
*nask.exe(本名 nasuka )
アセンブラのnask.exeでアセンブルすると、これで初めて''バ...
..\z_tools\nask.exe osalink1.nas osalink1.o
NASK : TMPBUF is not enough
・・・順調だったのに・・・orz・・・エラーで止まってしまっ...
**エラーの解析と対処
COLOR(red){このセクションは移動or削除ora大改編が予想され...
「NASKのエラーなんて、ググってもなんもわかんないよおぉぉ...
・・・って思ってたら、それはそれ。インターネットってスゲ...
http://www.rapuos.net/scrsvr.html
これによると、''外部変数が多いと''NASKがこのエラーを吐く...
osalink1.cの内部をざーーっと眺めてみる。グローバル変数?...
これかなぁ。先頭で
#define BUFSIZE 2 * 1024 * 1024
こんなことをやっている。これが大きすぎるってことなのかな...
うはぁ!!! NASKのコンパイルが通ったぞ???
COLOR(red){もちろん単にここを小さくするのは問題のはずだ。...
*ld.exe
さていよいよldの登場ですw~
**なんなの?それは???
今、まだ積み残しの問題があるとしても、とにもかくにもnasuk...
じゃあ、このバイナリは動かせるのでしょうか?~
答えは No! です。
なぜかって? このosalink1.oには''プログラムが書かれてい...
たとえば。「xxxをディスクに書き込みする」という命令がある...
51 01 89 C2 C1 FA 10 C1 F8 18 88 51 02 88 41 03 5D C3 55...
こんなんだとしますよね? (もちろん機械語ですよw) こ...
・・・しかし、この段階では、この命令はosalink1.o内には書...
同じように、他の命令も書かれていません。
-画面に一文字書き出せ
-メモリをxxxバイト確保しろ
-書かれている文字を数値に変換して計算し、結果を再び文字に...
-etc・・・・
osalink1.o内には様々な動作をする命令がちゃんと沢山書かれ...
もちろんそれも可能です。しかし、こういうよく使われる・い...
ldは「リンカ」と呼ばれるプログラムで、こういったバラバラ...
**さて! いざ、リンク!
..\z_tools\ld.exe --stack 0x2000000 -o osalink1.exe osa...
・・・ダメだった・・・・orz・・・(やっぱみようみまねじゃ...
..\z_tools\ld.exe: warning: cannot find entry symbol _ma...
osalink1.o(.text+0x85):osalink1.ca: undefined reference ...
osalink1.o(.text+0xba):osalink1.ca: undefined reference ...
osalink1.o(.text+0xdf):osalink1.ca: undefined reference ...
osalink1.o(.text+0xf4):osalink1.ca: undefined reference ...
osalink1.o(.text+0x11d):osalink1.ca: undefined reference...
osalink1.o(.text+0x125):osalink1.ca: undefined reference...
osalink1.o(.text+0x164):osalink1.ca: undefined reference...
osalink1.o(.text+0x262):osalink1.ca: undefined reference...
osalink1.o(.text+0x270):osalink1.ca: undefined reference...
osalink1.o(.text+0x275):osalink1.ca: undefined reference...
さて。このエラーはなんだろうか?~
上記の命令だと、osalink1.oとlibmingw.libを合体させてosali...
「おいおい! osalink1.o内で、fopenって命令を使ってるじゃ...
と、こういう答えを出して来たと。こういうわけ。
他のライブラリを指定してあげれば、それらから命令を拾って...
..\z_tools\ld.exe -s -Bdynamic --stack 0x2000000 -o osa...
osalink1.obj(.text+0xda):osalink1.ca: undefined referenc...
osalink1.obj(.text+0x15f):osalink1.ca: undefined referen...
osalink1.obj(.text+0x41a):osalink1.ca: undefined referen...
osalink1.obj(.text+0x45d):osalink1.ca: undefined referen...
・・・ダメですた・・・orz・・・
あっれぇ?? 今、ざーっと調べてみたんだけど、そういえばz...
COLOR(red){さらに発覚! tolower関数は、あの、''ctype.h''...
*やべ・・・いろいろゴチャゴチャになってきたぞw
**tolower関数
逆に言えば!!
ctype.hをインクルードしてるけど、この関数さえあればいいわ...
tolower関数は、文字が大文字なら小文字に変換。大文字以外な...
A~Zってーのは、41h~5Ahまで。で、a~zまでは61h~7Ahまで...
char tolower_hide(char moto){
if ( (moto > 0x41) && (moto < 0x5a ) ){
return moto + 0x20;
}
else{
return moto;
}
}
・・・これじゃダメか???
ぶははは。なんかうまく行きそうな予感wwwww
**fscanf関数
うーーーん・・・・・・・(汗
fscanfそのものはなんかけっこう複雑なもののように思う。・...
osalink1.c内ではfsnanfはこんな形で使われている。
for (i = 0; fscanf(fp0, " %s", fname) == 1; i++) {
fp1 = fopen(fname, "rb");
if (fp1 == NULL) {
トーシローのオイラも目には、これはosalink.optを''一行づつ...
・・・これ、fgets()じゃダメなの?(幸いstdio.hにはfgets関...
なんでKタンはfgets()を使わずにfscanf()を使ったんだろう?...
とにもかくにも!!!!!
こんなことしたら、コンパイルが通った。
fp0 = fopen(optfile, "r");
if (fp0 == NULL) {
fprintf(stderr, "Can't open \"%s\".\n", optfile);
return 1;
}
// for (i = 0; fscanf(fp0, " %s", fname) == 1; i++) {
for (i = 0; fgets(fname,32,fp0) != NULL; i++) {
fp1 = fopen(fname, "rb");
if (fp1 == NULL) {
さーて。乱暴者のオラはこれでOSASKをコンパイルしてみようw...
ダメか・・・
どうも、fgetsだと改行コードが入り込むらしい。そんならって...
for (i = 0; fgets(fname,32,fp0) != NULL; i++) {
//改行コードの引っこ抜き
for ( i2 = 31; i2 != 0; i2--){
if ( fname[i2] == 0x0a ) fname[i2] = 0;
if ( fname[i2] == 0x0d ) fname[i2] = 0;
}
fp1 = fopen(fname, "rb");
if (fp1 == NULL) {
err1:
fclose(fp0);
・・・やっぱだめだなぁ・・・orz
わからんなぁ・・・・・・。こうしてみると・・・
strcpy (fname,"base.exe"); ...
fp1 = fopen(fname,"rb");
if (fp1 != NULL){
fprintf(stderr, "testOpenOK!\n", fname); ...
fprintf(stderr, "nagasa=%d\n", strlen(fname)); ...
fclose(fp1);
}
// for (i = 0; fscanf(fp0, " %s", fname) == 1; i++) {
for (i = 0; fgets(fname,32,fp0) != NULL; i++) {
//改行コードの引っこ抜き
for ( i2 = 31; i2 != 0; i2--){
if ( fname[i2] == 0x0a ) fname[i2] = 0x0;
if ( fname[i2] == 0x0d ) fname[i2] = 0x0;
}
fp1 = fopen(fname, "rb");
if (fp1 == NULL) {
err1:
fclose(fp0);
fprintf(stderr, "Can't openaaa \"%s\".\n", fname); ...
fprintf(stderr, "nagasa=%d\n", strlen(fname)); ...
return 1;
}
なぜ読み込んで改行抜きをしたfnameではエラーになるんだろう...
こうやったらうまくいった!!! ・・・・でも納得できない...
strcpy (fname2,fname);
fp1 = fopen(fname2, "rb");
*最後! 例のバッファ!
このbuf0って、文字通り、対象ファイルを読み込んだものを格...
static unsigned char buf0[BUFSIZE];
この命令で、2 × 1024 × 1024バイトの''空文字が格納された文...
・・・''グローバル変数じゃないもの''にすればOK??
そんなわけで、こんなことしてみた。すると・・・・
const int main(int argc, char **argv)
{
FILE *fp0, *fp1;
int i, i2,j, k, size, totalsize = 0;
unsigned char fname[32], name[8], c;
unsigned char fname2[32];
unsigned char bufX[2*1024*1024];
おぉ!bufXは使っていないんだけど、とにもかくにもこうやっ...
なぜbuf0はわざわざグローバル変数になってるんだろ? それ...
const int script(char *opt, char *inp, char *out)
/* スクリプトが4KBを超えたら死にます */
{
unsigned char *buf = buf0 + 4 * 1024, *scr0 = buf0, *scr...
FILE *fp;
int size, memofs, filofs;
・・・あれ? この、script関数内だけじゃないか!!!!~
だったらさぁ。こうやって、script関数の引数に、buf0のアド...
const int script(char *opt, char *inp, char *out, char *...
/* スクリプトが4KBを超えたら死にます */
{
unsigned char *buf = helmes_buf + 4 * 1024, *scr0 = helm...
FILE *fp;
int size, memofs, filofs;
COLOR(blue){うぎゃあぁぁぁぁぁぁぁぁぁぁぁぁ!!!!! ...
*誰かCに詳しい人検証してくれww
#ref(osalink1_src_1.2.zip)
ページ名: