Cのインラインアセンブラ(86系)の紹介

(いまさらとは思いますが一応紹介させて下さい)

 

アセンブラを動かす環境は、

エミュレータやデバッガーなど

色々出回っていると思います。

 

ここでは、Windows上で

Microsoft Visual Studio

(無料ダウンロード可)

で、C言語が動かせる環境が

あることを前提としておきます。

(別のCコンパイラーでも同じ

かもしれません。)

 

C言語には、インラインアセンブラと

いうものがあり、簡単にアセンブラを

組込む事ができます。

 

面倒なことはCで書けば、すべてを

アセンブラで書くよりハードルが

下がると思います。

 

1~10までの合計(55)を計算する例です。

 

#include <stdio.h>

void main(void)

{

    short sum;        /* 1~10の合計(16bit) */

 

    __asm             /* 次の{}内がアセンブラ */

    {

        mov ax,0      ; axレジスタ(16bit)を0にする

        mov cx,1      ; cxレジスタ(16bit)を1にする

    L1:

        add ax,cx     ; ax = ax + cx (ax += cx;)

        inc cx        ; cx = cx + 1  (cx++;    )

        cmp cx,10     ; cxと10の比較

        jle L1        ; cx <= 10 なら L1へ

        mov sum, ax   ; sum = ax (sumはメモリ)

    }

    printf("1-10の合計 = %d\n", sum);    

    getchar();    /* キー入力待ち */

}

 

__asm {}がインラインアセンブラです。

(別のコンパイラーでは _ が1つ

または、無しだった記憶がありますが、

勘違いかもしれません)

 

WindowsのConsoleアプリケーション

(consoleアプリでコンパイルしたexeファイル)

は、実行が終了すると表示していたウインドウが

閉じてしまい、結果が分からなくなるので、

最後にキー入力待ちをしています。

 

 

N88-BASICでグラフ

 

ネット上で、 

x2 + (y - √|x|)2 = 1

 

という式を見つけました。

これを描いてみようと思います。

 

式変形して

x2 + y2 - 2(√|x|)y + x = 1

y2 - 2(√|x|)y + x2 + x - 1 = 0

 

2次方程式の解の公式より、

[y2 + 2by + c = 0, y = -b±√(b2 - c)]

 

y = √|x|±√{x - (x2 + x - 1)}

y = √|x|±√(1 - x2)

(-1≦x≦1) … √内≧0より

 

 

NL-BASICとnl~.zip(graph.bas)は

以下のリンクからダウンロードできます

NL-BASIC(N88-BASIC互換?)ホームページ

Readme.txtを読んで遊んで下さい

 

下記リストをマウスで選択しCtrl+cでコピーし、

NL-BASICの画面でAlt+v(Ctrl+vではないので注意)

でプログラムを読込めます。

 

graph.bas

 

100 '----------------------------------------------------------------------
110 ' x^2 + (y - √|x|)^2 = 1
120 ' y = √|x|±√(1 - x^2)    (-1≦x≦1)
130 '----------------------------------------------------------------------
140 CLS 3     '--- 画面消去
150 C   =   2 '--- 色
160 CX  = 320 '--- 原点座標
170 CY  = 200
180 LX  = 100 '--- x=1をlx dotで描く
190 LY  = 100
200 OX  =  CX + (-1 * LX) '--- 初めの点
210 OY1 =  CY - ( 1 * LY)
220 OY2 =  CY - ( 1 * LY)
230 FOR X=-1 TO 1 STEP 1 / LX
240   B = SQR(ABS(X))
250   D = SQR(1 - X * X)
260   Y1 = B + D         '--- ±の点
270   Y2 = B - D
280   PX  = CX + X  * LX '--- 現在の点
290   PY1 = CY - Y1 * LY
300   PY2 = CY - Y2 * LY
310   LINE(OX, OY1)-(PX, PY1), C
320   LINE(OX, OY2)-(PX, PY2), C
330   OX  = PX
340   OY1 = PY1
350   OY2 = PY2
360 NEXT

 

 

N88-BASICをお持ちでない方は、

以下のVL-BASICかNL-BASICで、

動かして下さい。

(どちらもWindows用です。)

上記プログラムリストをコピペして

テキストファイルを作るか、

(Noteで作るときはANSI形式で保存しないと漢字が化けます。)

テキストファイル(graph.basまたはgraph.txt)

をダウンロードして、

NLBasic.exeまたは、VLBasic.exe

に重ねると動きます。

 

VL-BASIC(N88-BASIC互換?)ホームページへのリンク

 

NL-BASIC(N88-BASIC互換?)ホームページへのリンク

 

ホームページに書いてあるパスワードを入力して、

Readme.txtを読んで、遊んで見て下さい。

 

 

勝手にリンクの紹介です(リスト集)

   

ネット上で、N88-BASICのプログラムを見つけました。

以下のリンク先にいろいろなプログラムリスト

紹介されています。

 

プログラムソースリスト集 No.1

(N88BASICベースのActiveBASIC旧バージョン)

 

以下のVL-BASICかNL-BASICで、

エラーが出る行をコメントアウト('を付ける)か、

消去すると動くものもあります。

(ビリヤード、平面パズル、ライフゲームなど)

 

VL-BASIC(N88-BASIC互換?)ホームページへのリンク

 

NL-BASIC(N88-BASIC互換?)ホームページへのリンク

 

ホームページに書いてあるパスワードを入力して、

Readme.txtを読んで、遊んで見て下さい。

 

 

勝手にリンクの紹介です(3D点描)

 

N88-BASICのプログラムを見つけました。

以下のリンク先のTwitterで公開されています。

(3D点描で帽子のような形が描かれます。)

 

凸撃兵@Stosstruppe さんという方のTwitterです。

取り敢えず88に移植。何やってるか大雑把には分かるけどほぼベタ移植(汗

 

 

 

以下のVL-BASICかNL-BASICで

そのまま動きます。

 

VL-BASIC(N88-BASIC互換?)ホームページへのリンク

 

NL-BASIC(N88-BASIC互換?)ホームページへのリンク

 

ホームページに書いてあるパスワードを入力して、

Readme.txtを読んで、遊んで見て下さい。