« 2007年9月 | トップページ | 2007年11月 »

2007年10月の4件の記事

2007-10-26

独習アセンブラ リスト1-2

独習アセンブラ 翔泳社のP9, リスト1-2
文字列を出力するプログラムのLinux版です。

List 1-2
section .data

msg     db 'Hello, assembler', 0x0a
len     equ $ - msg

section .text
global  _start

_start:
        mov     eax,4
        mov     ebx,1
        mov     ecx,msg
        mov     edx,len
        int     0x80

        mov     eax,1
        mov     ebx,0
        int     0x80


基本的なコードの部分は、リスト 1-1と同じです。
ただ、セクションとして.dataという物が出てきました。
他に、本文中に説明の無いものとして、
len equ $ - msg
という行が出てきました。
本文のリストでは文字列の最後に'$'が付いていますが、
これはDOSのシステムコールに依存する物なので、
取り除き、代わりに改行コードを入れました。
0x0aが改行コード(lf)です。
equの使い方は、P174に載っています。
lenには、17が入ります。
改行コードの1バイト分も含まれている事に気をつけてください。
また、本文にあるようにlenは一度だけ評価される事に注意が必要です。

これらの定数データをデータセクションに置きます。
データセクションの開始を示すのが、section .dataです。

このプログラムは、Hello, assemblerと表示し、最後に改行して終了します。






| | コメント (0) | トラックバック (0)

2007-10-24

独習アセンブラ リスト1-1

独習アセンブラのリスト1-1をLinux版に移植してみました。
私の環境ではコンパイル、リンクは以下のようにします。
ソースファイルが1-1.asmで実行ファイル1-1を作る例です。
$ nasm -f elf 1-1.asm
$ ld -s -o 1-1 1-1.o
List1-1
section .text
global _start

_start:
    push   0x31
    mov    eax,4
    mov    ebx,1
    mov    ecx,esp
    mov    edx,1
    int    0x80
    add    esp,4

    mov    eax,1
    mov    ebx,0
    int    0x80

まず、はじめにスタックに表示する文字を積みます。
Linuxの出力のシステムコールは、
eax: 4
ebx: 1(標準出力)
ecx: 文字列の先頭のアドレス
edx: 出力する文字数
となるので、それぞれを設定します
スタックのトップを指すespを使って、
ecxには表示対象の文字のアドレスをコピーします。
int 0x80でシステムコールを使います。
add    esp,4は、
はじめにスタックに0x31が積まれているので
espの位置を元に戻しています。

最後の三行は処理終了のシステムコールです。

DOSのシステムコールは、
文字を一文字出力する場合と
末尾に'$'の付く文字列を出力する場合、
それぞれに別の命令が割当てられていますが、
Linuxでは、文字列の出力として、
一文字出力するのか、
それ以上なのかの文字数の違いのみのようです。

| | コメント (0) | トラックバック (0)

2007-10-22

仮想端末ツール screen

古いノートパソコンにLinuxを入れて使っている。
メモリもHDDも増設していないので、
GUIにせず使っています。

Alt+F2とかで別の端末?としてログインする事もできますが、
このひとつひとつを更に、screenで仮想化して
複数のプロセスを走らせてます。

screenのコマンドはCtrl+Aが使われるので、
emacsで行の先頭に移動したい時にうまく機能しません。
そこで、emacsはtty1でログインして使っておいて、
コンパイラやsshはtty2で使うというような使い方をしています。

screenでよく使うコマンドを簡単にまとめてみます。
  • 端末の追加 Ctrl+A c
  • 次の端末へ切り替え Ctrl+A n
  • 前の端末へ切り替え Ctrl+A p
  • 現在の端末を消去 Ctrl+A K
すべての端末を消去すると、screenは終了し、通常の端末に戻ります。

| | コメント (0) | トラックバック (0)

2007-10-16

アセンブラはじめました

独習アセンブラという本を購入して、
アセンブラの勉強を始めてみました。

ただ、Linux上でやってみようと思い、
チャレンジしています。

この本では、16bitのDOSがメインに書かれているので、
これを翻訳しなければなりません。

途中までは何とか似たような物を書くことができたんですが、
システムスピーカを鳴らすという部分がどうしてもできません。
C言語でのプログラムサンプルを見つけ、
コンパイルしてみるとできたのですが、
同じ事を書いているつもりでもアセンブラではできません。
セグメンテーション違反が出てしまう . . . 。
もう何日同じ事にチャレンジしているだろう。
その先の演算はできたんですが . . . 。


| | コメント (0) | トラックバック (0)

« 2007年9月 | トップページ | 2007年11月 »