Чтение из файла в блоке

Я пытаюсь изучить блок - x86 в среде Linux. Самое полезное учебное руководство, которое я могу найти, Пишет Полезную Программу С 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 переменная или действительно переменные вообще.

Как я делаю это?

(В стороне: по крайней мере, после часа поиска я неопределенно потрясен низким качеством ресурсов для изучения блока. Как же какой-либо компьютер работает, когда единственная документация является слухом, проданным в 'сети?)

7
задан marc_s 27 July 2010 в 20:40
поделиться

1 ответ

Ооо, это будет весело.

В языке ассемблера нет переменных. Это языковая конструкция более высокого уровня. В языке ассемблера, если вам нужны переменные, вы создаете их сами. В гору. В обе стороны. В снег.

Если вам нужен буфер, вам придется либо использовать некоторую область вашего стека в качестве буфера (после вызова соответствующих инструкций установки стека), либо использовать некоторую область в куче. Если ваша куча слишком мала, вам придется выполнить инструкцию SYSCALL (еще один INT 80h), чтобы попросить операционную систему о большем (через sbrk).

Другая альтернатива - изучить формат ELF и создать глобальную переменную в соответствующем разделе (я думаю, это .data).

Конечным результатом любого из этих методов является участок памяти, который вы можете использовать. Но единственные реальные "переменные", к которым вы привыкли в ставшем чудесным мире C, - это регистры. И их не так уж много.

Ассемблер может помочь вам с помощью полезных макросов. Почитайте документацию по ассемблеру; я не помню их на память.

Жизнь там, внизу, на уровне ASM, тяжела.

9
ответ дан 6 December 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: