Как написать код на ассемблере x86 для Linux с использованием nasm?

Какие методы могут использоваться для улучшения структуры и ясности вопроса?
  • 4 апреля 2024 г. 14:49
Ответы на вопрос 4
Для написания кода на ассемблере x86 для Linux с использованием nasm, следует следовать следующим шагам:

1. Установите nasm на вашем компьютере, если он еще не установлен. Вы можете установить его с помощью менеджера пакетов вашего дистрибутива Linux.

2. Создайте новый файл с расширением .asm (например, code.asm) и откройте его в текстовом редакторе.

3. Напишите свой ассемблерный код, используя синтаксис nasm. Например, вы можете написать код для вывода "Hello, World!" на экран:

```nasm
section .data
    hello db 'Hello, World!', 0

section .text
    global _start

_start:
    mov eax, 4
    mov ebx, 1
    mov ecx, hello
    mov edx, 13
    int 0x80

    mov eax, 1
    xor ebx, ebx
    int 0x80
```

4. Сохраните файл и скомпилируйте его с помощью команды nasm:

```bash
nasm -f elf32 code.asm
```

5. Затем линкуйте объектный файл с помощью gcc:

```bash
gcc -m32 -o code code.o
```

6. Запустите скомпилированный файл:

```bash
./code
```

Для улучшения структуры и ясности вопроса, следует использовать следующие методы:

1. Помещение кода в блоки кода с указанием языка (например, "```nasm" для кода на ассемблере).
2. Приведение конкретного примера кода или задачи, для которой нужна помощь.
3. Указание версии Linux и nasm, чтобы читатели могли дать более точные советы.
4. Предоставление подробного описания задачи или проблемы, с которой вы столкнулись при написании кода на ассемблере.
Видимо ошибка ф функции PrintMark. 

Перед вызовом ты грузишь значение отметки в si, но в вызове его не используешь.Зачем-то копируешь там из EAX, хотя до этого записал туда 4, зачем-то еще раз берешь offset,
Твой traverse_loop держит указатель на текущую запись в eax , но первый же вызов PrintName портит почти все регистры и не восстанавливает их, поэтому первый же movzx esi, byte [eax + 10h] после этого вызова обращается мимо памяти и вызывает segfault. Проще всего это исправить каким-нибудь pusha / popa вокруг тела PrintName . После этого ты доберёшься до вызова PrintMark , где увидишь, что эта функция ожидает в eax + 10h текстового представления оценки, а у тебя пока есть только двоичное.
int 0x80                      ; Call kernel 
доки то читал?

ps аж ностальгия..
но не в твою пользу..
section .data только грусть вызывает..
.. и да... если тебе не хватает регистров для данных..
section .data не только для списка других... кхм... пытающихся стать программистами ))
... желаю успеха, но придется включить свои мозги... без вариантов
Похожие вопросы