Чтение из файла в сборке - PullRequest
7 голосов
/ 28 июля 2010

Я пытаюсь изучить ассемблер - x86 в среде Linux.Самый полезный учебник, который я могу найти, это Написание полезной программы с NASM .Задача, которую я сам себе ставлю, проста: прочитать файл и записать его на стандартный вывод.

Вот что у меня есть:

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 или вообще переменные.

Как мне это сделать?

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

Ответы [ 3 ]

9 голосов
/ 28 июля 2010

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

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

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

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

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

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

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

2 голосов
/ 19 января 2011

Вы должны объявить свой буфер в секции bss и размер буфера в данных

section .data
   bufsize dw      1024

section .bss
   buf     resb    1024
0 голосов
/ 08 ноября 2016

После вызова, чтобы открыть, дескриптор файла в Eax.Вы по праву перемещаете eax it в ebx, где вызов read будет искать его.К сожалению, на данный момент вы уже перезаписали его системным вызовом 3 для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...