10

Linux環境でアセンブリ--x86を学習しようとしています。私が見つけることができる最も有用なチュートリアルは、NASMで便利なプログラムを書くことです。私が自分で設定しているタスクは単純です。ファイルを読み取り、それをstdoutに書き込みます。

これは私が持っているものです:

section  .text              ; declaring our .text segment
  global  _start            ; telling where program execution should start

_start:                     ; this is where code starts getting exec'ed

  ; get the filename in ebx
    pop   ebx               ; argc
    pop   ebx               ; argv[0]
    pop   ebx               ; the first real arg, a filename

  ; open the file
    mov   eax,  5           ; open(
    mov   ecx,  0           ;   read-only mode
    int   80h               ; );

  ; read the file
    mov     eax,  3         ; read(
    mov     ebx,  eax       ;   file_descriptor,
    mov     ecx,  buf       ;   *buf,
    mov     edx,  bufsize   ;   *bufsize
    int     80h             ; );

  ; write to STDOUT
    mov     eax,  4         ; write(
    mov     ebx,  1         ;   STDOUT,
  ; mov     ecx,  buf       ;   *buf
    int     80h             ; );

  ; exit
    mov   eax,  1           ; exit(
    mov   ebx,  0           ;   0
    int   80h               ; );

ここでの重大な問題は、チュートリアルでバッファ、bufsize変数、または実際に変数を作成する方法についてまったく言及されていないことです。

どうすればよいですか?

(余談ですが、少なくとも1時間検索した後、アセンブリを学習するためのリソースの質が低いことに漠然と愕然としました。ドキュメントがネット上で取引されている伝聞だけである場合、いったいどのようなコンピューターが実行されますか?)

4

3 に答える 3

12

おお、これは楽しそう。

アセンブリ言語には変数がありません。これらは高水準の言語構造です。アセンブリ言語では、変数が必要な場合は自分で作成します。上り坂。両方。雪の中。

バッファーが必要な場合は、スタックの一部の領域をバッファーとして使用するか (適切なスタック フレーム セットアップ命令を呼び出した後)、ヒープ上の一部の領域を使用する必要があります。ヒープが小さすぎる場合は、SYSCALL 命令 (別の INT 80h) を作成して、(sbrk 経由で) オペレーティング システムにさらに要求する必要があります。

もう 1 つの方法は、ELF 形式について学び、適切なセクションにグローバル変数を作成することです (.data だと思います)。

これらのメソッドの最終結果は、使用できるメモリ ロケーションです。しかし、今では素晴らしく見えるようになった C の世界から慣れ親しんだ唯一の本当の「変数」は、レジスターです。そして、それらの数はそれほど多くありません。

アセンブラは、便利なマクロを手助けしてくれるかもしれません。アセンブラのドキュメントを読んでください。私は頭の上からそれらを覚えていません。

ASM レベルでの生活は厳しいものです。

于 2010-07-27T20:44:33.493 に答える
5

bss セクションでバッファを宣言し、データで bufsize を宣言する必要があります

section .data
   bufsize dw      1024

section .bss
   buf     resb    1024
于 2011-01-19T14:24:25.367 に答える