Я пытаюсь изучить блок - 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
переменная или действительно переменные вообще.
Как я делаю это?
(В стороне: по крайней мере, после часа поиска я неопределенно потрясен низким качеством ресурсов для изучения блока. Как же какой-либо компьютер работает, когда единственная документация является слухом, проданным в 'сети?)
Ооо, это будет весело.
В языке ассемблера нет переменных. Это языковая конструкция более высокого уровня. В языке ассемблера, если вам нужны переменные, вы создаете их сами. В гору. В обе стороны. В снег.
Если вам нужен буфер, вам придется либо использовать некоторую область вашего стека в качестве буфера (после вызова соответствующих инструкций установки стека), либо использовать некоторую область в куче. Если ваша куча слишком мала, вам придется выполнить инструкцию SYSCALL (еще один INT 80h), чтобы попросить операционную систему о большем (через sbrk).
Другая альтернатива - изучить формат ELF и создать глобальную переменную в соответствующем разделе (я думаю, это .data).
Конечным результатом любого из этих методов является участок памяти, который вы можете использовать. Но единственные реальные "переменные", к которым вы привыкли в ставшем чудесным мире C, - это регистры. И их не так уж много.
Ассемблер может помочь вам с помощью полезных макросов. Почитайте документацию по ассемблеру; я не помню их на память.
Жизнь там, внизу, на уровне ASM, тяжела.