<!doctype linuxdoctr system>
<!-- sgml: by T.Isaji -->
<!-- sgml2*  :コメント内で'-'が２つ並んでいるとエラー
     sgml2txt: `.END', `.text', `.globl' <tt/.info/
     が 行先頭にあると
     not defined となる(*.txtで表示されない)。
     行先頭にスペースを挿入するとエラーにならない。
-->

<article>

<title>assembly &amp; linux
<author>jan wagemakers, <htmlurl url="mailto:janw@mail.dma.be"
    name="janw@mail.dma.be">
<date>21/07/1997
<trans>伊佐治 哲, <htmlurl url="mailto:isaji@mxu.meshnet.or.jp"
    name="isaji@mxu.meshnet.or.jp">
<tdate>24 jan 1998
<!-- 
「assembly howto」のポインタにある
http://bewoner.dma.be/JanW/から取り寄せました。
-->

<abstract>
(訳注：この文書は<htmlurl url="http://bewoner.dma.be/JanW/"
    name="http://bewoner.dma.be/JanW/">からのものです。
以下「webページ」はこのurlを指しています)。
<!--
    !!! please forgive my flinstone-english ;-) !!!
   this is a webpage about my experiments with the
   assembly-programming-language in combination with the linux operating
   system for the x86-compatible computer.
-->
これは&dquot;x86互換マシン/linuxオペレーティングシステム&dquot;でアセンブリ
プログラミング言語を使った試みについて書かれたwebページです。
</abstract>

<toc>

<sect>更新履歴
<p>
<!--    
   when i discover - by doing this experiments - some interesting things,
   i shall put them on this webpage. below, i'll put the dates that i've
   made this changes, so, it is easier to find new information.
-->
このテストを行っているうちにいくつか興味深いことに気づきました。
このwebページに追加していきたいと思います。以下、新しい情報をみつけやすく
するために更新履歴を書きます。
<verb>
   xx/06/1997 : start linux & assembler ホームページ
   05/07/1997 : change h.2.1.3. (add macro's to gas) 
   21/07/1997 : change h.2.1.4. (ncurses (sat_color.s)) 
</verb>   


<sect>アセンブリ &amp; DOS
<!-- assembly &amp; dos :-->
<p>
<!--
    assembly... because of some reason, i like programming in the
   assembly-language. under dos, i have done for a long time some
   experiments with the assembly language. by doing this experiments
   dkopie was born. dkopie is a diskcopy program that can copy extended
   formats like 2m. the source of 2m and dkopie are free available.
-->
アセンブリ...わけあってアセンブリ言語でプログラミングすることが気に入って
います。dos環境下で、長いことアセンブリを使ってきました。この試み
によって<tt/dkopie/が生まれました。<tt/dkopie/ は <tt/2m/といった拡張
フォーマットでコピーできるようにしたディスクコピープログラムです。
   
<!--  for more information about 2m you can take a look at :-->
<tt/2m/についての情報は以下を参照して下さい：   
   <htmlurl url="http://www.gui.uva.es/~ciri/ "
    name="the homepage of ciriaco garcia de celis">
   
<!--
    the most recent version of dkopie is dkopie v3.0. you can download
   dkopie at :
-->
   <tt/dkopie/の最新版は現在<tt/dkopie v3.0/です。
   <htmlurl 
url="http://www.simtel.net/pub/simtelnet/msdos/diskutil/dkopie30.zip"
    name="http://www.simtel.net/pub/simtelnet/msdos/diskutil/dkopie30.zip">
からダウンロードできます。
   
<sect>アセンブリ &amp; Linux 
<p>
<!--
    dos can not use all the power that is present in the current computers
   and i don't like windows very much, so, i make use of linux and i am
   very happy with this os :-)
-->
DOSは現在のコンピュータでは力不足です。しかしWindowsを使う気にもなりま
せん。そこでLinuxを使っているのですが、このOSのおかげでとても幸せに
なりました  :-)。
<!--
    under unix & linux the standard programming language is c en c++. this
   has a lot of advantages, certain about porting a program to another
   computer-system.
-->
UNIX &amp; Linux では標準的なプログラミング言語は C や C++ です。
これは多くの機能を持っていて他のコンピュータシステムにも移植されています。
<!--
    but, because i like assembly very much, i can not resist of doing some
   experiments with linux and assembly.
-->
しかしアセンブリが使いたいのでLinuxとアセンブリの魅力には抵抗できません。
<!--
    below, i show you a short summing up of the results (not very much at
   the moment) of this experiments. i like to thank my friends on fidonet
   (assembler.028, 80xxx, linux.b, linux) for all the information that
   they have given to me. :-)
-->
以下、この試みについての結果をまとめました。いろいろな情報を提供してくれた
<htmlurl url="http://www.z2.fidonet.org/" name="fidonet">
(assembler.028, 80xxx, linux.b, linux) の方々に感謝いたします。

   
<sect>アセンブリ &amp; Linux - 結果 - 
<p>
<!--
    when you want to write some linux assembly programs, there are a lot
   of possibilities. first, you can choose which assembler you going to
   use. a logical choice is gas (as), the assembler that is standard in
   almost every linux distribution.
-->
Linuxアセンブリプログラムを書くときそこには多くの可能性があります。はじめに
どのアセンブラを使うか選べます。GAS(AS)を使うのがよいでしょう。gasは
ほとんどのLinuxディストリビューションの標準となっているアセンブラです。
<!--
    the disadvantage of gas is that gas makes use of the at&t-syntax, who
   is very different of the intel-syntax, that is used by almost every
   dos-user.
-->
gasの欠点はgasが<tt/AT&amp;T-syntax/を使っていることです。これは
<tt/Intel-syntax/と大きく違っています。
DOSユーザーはほとんどが<tt/Intel-syntax/を使っています。
   
<!--
    more information about the at&t syntax can be found in 'info'. (i have
   convert with a program this info-files to the html-format)
-->
<tt/AT&amp;T-syntax/についてのより詳細な情報は 
infoファイルにあります。このinfoファイルをhtmlフォーマットに変換しました。
   
<!--
    when you prefer a more intel-compatible syntax, you can write your
   program with nasm.
-->
Intel互換のsyntaxを参照する時はnasmでプログラムを書くことができます。

<sect1>NASMの例をみてみましょう：
<!-- let's start with an example for nasm :-->
<p>
   from the 80xxx-fidonet-area :
<verb>
= deze bewaar ik : asm =================================================keepit=
from : james vahn                          17-apr-97  15:20:22  1:346/15.1
to   : jan wagemakers                                           2:292/8133.23
subj : nasm & linux
=======================================================================rem_asm=
</verb>
<!--
 * copied from: 80xxx
 jw> there are demos included, but so far i can see they are
 jw> written to be called from a c-program. i was wondering how i
 jw> can write a 100% pure assembly program with nasm under
 jw> linux.

use bug-fixed nasm-0.94, and assemble the source below like:
   nasm -f elf hello.asm
   gcc hello.o -o hello
   strip hello

there is much to learn.  :-)
-->
<verb>
 * 80xxx からの引用
 jw> デモがありますが、見ている範囲ではcプログラムから呼び出すように
 jw> 書かれています。nasmとlinuxで 100% アセンブリプログラムをどのように
 jw> 書くのか知りたいです。

バグフィックスされたnasm-0.94を使って、ソースを以下のようにアセンブルします。
   nasm -f elf hello.asm
   gcc hello.o -o hello
   strip hello

学ぶことがたくさんあります   :-) 
</verb>


<code>
;-------------nasm's standalone hello-world.asm for linux --------
section .text
extern puts
global main

main:
   push dword msg                ;stash the location of msg on the stack.
   call puts                     ;call the 'puts' routine (libc?)
   add esp, byte 4               ;clean the stack?
   ret                           ;exit.

msg:
   db "hello world!",0
</code>
<verb>
--- timed 1.01
 * origin: james vahn (jvahn@short.circuit.com) (1:346/15.1)
===============================================================================
</verb>
<!--
    in this example call puts is used to print a text on the screen. puts
   comes from 'c', and is standard present in the libraries that are
   loaded by linux. but there is a second way to do certain things by
   assembly, it is interrupts. but it is not recommended to use these
   interrupts because it is possible that they change in a later version
   of the linux-kernel.
-->
この例ではputsの呼び出しは画面にテキストを表示するのに使われます。putsは
cからのもので、Linuxでロードされるライブラリの標準表示です。しかし
アセンブリでこれを行う方法もあります。<tt/interrupts/ です。
Linuxカーネルの今後のバージョンで変更されるかもしれないのでこの割り込み
(interrupts)を使うのはお奨めしません。

   
<sect1>gasの２つの例：
<!-- and now, two examples for gas :-->
<p>
<!--
    from assembler.028, thanks to pieter de jong for these nice examples.
-->
アセンブラ.028から優れたサンプルを<tt/pieter de jong/氏が出しました。

<!--
   example 1. by making use of call puts.
-->
例１)    putsの呼び出しを使った例
<code>
 .text
message:
 .ascii "hello world!\0"
 .align 4
 .globl main
main:
 pushl %ebp
 movl %esp,%ebp
 #call ___main
 pushl $message
 call puts
 addl $4,%esp
 xorl %eax,%eax
 movl %ebp,%esp
 popl %ebp
 ret
</code>
として、
<verb>
	as hello.s -o hello.o
	gcc hello.o -o hello
</verb>
とコンパイルします。

<p>
<!--    example 2. by making use of int 80h.-->
例２) <tt/int 80h/を使う
   
<code>
 .text
message:
 .ascii "hello, world!\12\0"
 .align 4
 .globl _hw
_hw:
 movl $4, %eax
 movl $1, %ebx
 movl $message, %ecx
 movl $15, %edx
 int $0x80
 movl $1, %eax
 movl $0, %ebx
 int $0x80
</code>
として、
<verb>
	as hello.s -o hello.o
	ld hello.o -e _hw -o hello
        (_hw = エントリポイント)
</verb>
とコンパイルします。

   
<sect1>GASにマクロを追加する：
<!-- Adding Macro's to GAS :-->
<p>
   changed on : 5 Jul 1997 
   
<!--
    By making use of macro's you can make the programming less complex. In
   certain documents I had read that Gas itself can not recognize Macro's
   and that you must make use of Gasp to implement macro's in your
   assembly-work.
-->
マクロを使うことによってプログラミングの複雑さをすくなくできます。ある
ドキュメントで、GASはマクロを解釈できずアセンブリでマクロを使うにはGASPを
使わねばならないということを読みました。
   
<!--
    But... after done some experiments and reading the info-files of GNU-C
   I discovered that it is possible to add macro's in a assembly program,
   just by making use of Gas (as)
-->
しかし.. いくつかテストしてみたり<tt/GNU-C info/ファイルを読んだところ
GAS(as)を使ってアセンブリプログラムにマクロを加えることができることを
発見しました。
<!--
    Below, I show you a experiment of me, that demonstrate the
   possibilities of Gas & Macro's :
-->
以下、私が行ったテストを紹介します。GAS と マクロ の可能性を試みています
(訳注：<tt/dummy.dummy/というファイルがあるかチェックするプログラムです)。
<p>   
<tt/test_fopen.s/のソース：
<code>
        .include "include.asm"

        .globl main
main:
        _print hallo            # タイトル表示
        _open bestand mode      # ファイル'dummy.dummy'を開く
        cmp $0,%eax             # Success?
        je file_error           # だめ。エラーメッセージの表示
        _close %eax             # ファイルを閉じる
        _print bestaat          # 'exist'と表示
        jmp einde               # プログラム終了
file_error:
        _print bestaat_niet     # 'doesn't exist'と表示する
einde:
        ret                     # The End ;-)

hallo:
 .string "Test Linux Program ;-) \n"
bestaat:
 .string "The file dummy.dummy exists..."
bestaat_niet:
 .string "The file dummy.dummy doesn't exist..."
bestand:
 .string "dummy.dummy"
mode:
 .string "r"

 .END
</code>
<p>
<tt/include.asm/
<code>
 .MACRO _print message
 # start _print message
 pushl $\message
 call puts
 addl $4,%esp
 # end   _print message
 .ENDM

 .MACRO _open file mode
 # start _open ファイルモード
 pushl %ebp
 movl %esp,%ebp
 pushl $\mode
 pushl $\file
 call fopen
 addl $8,%esp
 movl %eax,-4(%ebp)
 # %eax = ファイルハンドル
 #        -  %eax = 0 ならファイルはない
 #        -  %eax >< 0 %eax ならファイルハンドル
 popl %ebp
 # end   _open ファイルモード
 .ENDM

 .MACRO _close filehandle
 # start _close ファイルハンドル
 pushl \filehandle
 call fclose
 addl $4,%esp
 # end   _close ファイルハンドル
 .ENDM
</code>
として、これを
<verb>
	as test_fopen.s -o test_fopen.o
	gcc test_fopen.o -o test_fopen
</verb>
のようにコンパイルします。

   
<sect1>ncursesを使う 
<p>
   1997年7月21日 変更：
<p>   
<!--
    Ncurses is a library with functions that can be used to write
   text-oriented Linux-programs.
-->
Ncurses はテキストベースのLinuxプログラムを書くときに使う関数の
ライブラリです。
   
<!--
    Below I show you an example-program where you can see how you can call
   ncurses from a pure assembly-program. It is not very spectacular, but
   nice for watching to :-)
-->
以下、ピュアなアセンブリプログラムからncurseesをどのように呼び出すか見る
ためにサンプルプログラムを挙げます。ちゃんとしたものではないかもしれませんが
動作をみるにはよいと思います :-) 。
<p>   
<tt/sat_color.s/
<code>
        .include "/home/jan/assembler/include/ncurses.asm"

        .globl main
main:
        _initscr
        _start_color
        _init_pair $1,$2,$4
        _init_pair $2,$0,$6
        _init_pair $3,$3,$4
        _init_pair $4,$4,$4             # Hide the flashing cursor
                
        call cls                        # clear screen/init colors.

        _use_pair $0x00000200           # 00 00(NORMAL) 02(PAIR) 00
        _locate $1,$0
        _printw $titel
        _locate $46,$0
        _printw $pd
        _use_pair  $0x00200100          # 00 20(BOLD) 01(PAIR) 00

        _locate $32,$12
        _printw $world

        _use_pair  $0x00200300          # 00 20(BOLD) 03(PAIR) 00

        movl $0,%esi
lus:
        movb tabel(%esi),%dl            # %dl = X(%esi)
        incl %esi
        movb tabel(%esi),%cl            # %cl = Y(%esi)
        incl %esi
        cmpb $242,%cl
        jne n242_1
        movl $0,%esi
        jmp lus
n242_1:
        movl %esi,%edi
redo:
        movb tabel(%edi),%dh            # %dh = X(%esi + 1)
        incl %edi
        movb tabel(%edi),%ch            # %ch = Y(%esi + 1)
        cmpb $242,%ch
        jne  n242_2
        movl $0,%edi
        jmp redo
n242_2:
        movl $leeg,%ebp
        call print_item
        movl $linux,%ebp
        movb %ch,%cl
        movb %dh,%dl
        call print_item

        pushl $160000                   # C : usleep(....);
        call usleep                     # Wait-loop
        addl $4,%esp

        _refresh
        jmp lus
        _endwin
        ret

print_item:
        pushal
        movzbl %cl,%eax
        movzbl %dl,%ebx
        _locate %ebx,%eax
        _printw %ebp
        popal
        ret
        
cls:
        _use_pair $0x00000200           # 00 00(NORMAL) 02(PAIR) 00
                                        # Color of the first line
        movb $0,%cl
        movb $0,%dl
cls_lus:
        movl $chr32,%ebp
        call print_item
        incb %dl
        cmpb $79,%dl
        jna cls_lus
        pushal
        _use_pair  $0x00000400          # 00 00(NORMAL) 04(PAIR) 00
                                        # Color of the rest of the screen
        popal
        xorb %dl,%dl
        incb %cl
        cmpb $25,%cl
        jna cls_lus
        ret

linux:
 .string "Linux"
leeg:
 .string "     "
chr32:
 .string " "
world:
 .string "World Domination"
titel:
 .string "sat_color.s - 1997 Jan Wagemakers -"
pd:
 .string "Donated to the Public Domain :-)"
tabel:
 .include "cirkel.dat"
 .byte 242,242

 .END
</code>
(訳注：先頭のncurses.asmのインクルードディレクトリは適当に変更して下さい)
<p>
<tt/cirkel.dat/
<code>
 .byte  72 , 12
 .byte  71 , 13
 .byte  69 , 15
 .byte  66 , 17
 .byte  62 , 18
 .byte  56 , 20
 .byte  51 , 21
 .byte  44 , 21
 .byte  38 , 21
 .byte  31 , 21
 .byte  24 , 21
 .byte  18 , 20
 .byte  13 , 19
 .byte  8 , 17
 .byte  5 , 16
 .byte  3 , 14
 .byte  2 , 12
 .byte  2 , 10
 .byte  3 , 8
 .byte  6 , 7
 .byte  10 , 5
 .byte  15 , 4
 .byte  20 , 3
 .byte  27 , 2
 .byte  33 , 2
 .byte  40 , 2
 .byte  47 , 2
 .byte  53 , 3
 .byte  59 , 4
 .byte  63 , 5
 .byte  67 , 7
 .byte  70 , 8
 .byte  71 , 10
</code>
<p>
<tt>/home/jan/assembler/include/ncurses.asm</tt>
<code>
 # ncurses.asm          - donated to the public domain by Jan Wagemakers -
 # derived of the following C-program
 # #include
 #
 # int main(void)
 # {
 #     initscr();  /* cursesライブラリの初期化 */
 #     move(10, 2);  /* カーソルを X: 2, Y: 10 に置く */
 #     printw("Hello, World !"); /* 表示するもの */
 #     refresh(); /* 物理画面に "Hello, World !" を置く */
 #     getch(); /* キーが押されるのを待つ */
 #     endwin(); /* deinit the curses libraries. */
 #     return 0;
 # }
 #
 # Cについてよく知らないので以下は違うこともあります。
 # 修正するときはためらわずやって下さい。
 # ncursesを使って画面に何か書きたいという時は以下のマクロを呼び出します。
 #      1. _initscr
 #      2. _locate x y  (x,y = 画面の座標)
 #      3. _printw message
 #      4. _refresh
 #      5. _endwin      (winの終り.... なにかいい響きですね ;-)

 .MACRO _initscr
 # start _initscr
 call initscr
 # end   _initscr
 .ENDM

 .MACRO _locate x y
 # start _locate x y
 pushl \x
 pushl \y
 movl stdscr,%eax
 pushl %eax
 call wmove
 addl $12,%esp
 # end   _locate x y
 .ENDM

 .MACRO _printw message
 # start _print message
 pushl \message
 call printw
 addl $4,%esp
 # end   _printw message
 .ENDM

 .MACRO _refresh
 # start _refresh
 movl stdscr,%eax
 pushl %eax
 call wrefresh
 addl $4,%esp
 # end   _refresh
 .ENDM

 .MACRO _endwin
 # start _endwin
 call endwin
 # end   _endwin
 .ENDM

# Colors と ncurses. (15/07/97)
# - After _initscr , call _start_color
# - Init with _init_pair a color-pair.
# - With _use_pair select a color-pair.

 .MACRO _start_color
 # start _start_color
 call start_color
 # end   _start_color
 .ENDM

 .MACRO _init_pair pair foreground background
 # start _init_pair
 pushl \background
 pushl \foreground
 pushl \pair
 call init_pair
 addl $12,%esp
 # end   _init_pair
 .ENDM

 .MACRO _use_pair pair
 # start _use_pair
 movl \pair,%eax
 #                |        |  %ah   |  %al   |
 # %eax = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
 #                    |        |
 #                    |        |
 #                    |        +----> 使いたいカラーペア(color-pair)番号
 #                    +-------------> 00 = ノーマル , 20 = BOLD
 pushl %eax
 movl stdscr,%eax
 pushl %eax
 call wattr_on
 addl $8,%esp
 #end _use_pair
 .ENDM
</code>

<verb>
	as sat_color.s -o sat_color.o
	gcc sat_color.o -o sat_color -lncurses
</verb>
とコンパイルし、<tt>./sat_color</tt>で実行します(訳注：このプログラムを
実行すると青い背景の画面中央に緑文字で「World Domination」、その周り
を黄色文字「Linux」がぐるぐる回るデモが見れます。<tt/color_xterm/などで
実行してみて下さい)。

   
<sect>連絡情報
<!-- Contact-information : -->
<p>
<!--    All assembly-information is more than welcome :-) -->
アセンブリに関する情報を募集しています :-) 。
<p>
<verb>
   Jan Wagemakers
   Internet : JanW@mail.dma.be
   Fidonet : 2:292/854.19
</verb>

</article>




