Nano Hash - криптовалюты, майнинг, программирование

Объяснение сборки, сгенерированной NASM для dd

Я экспериментировал со сборкой в ​​Linux с помощью NASM, чтобы понять скрипт loader.s на OSDev.

Одна вещь, которая показалась мне интересной, это сборка, созданная при объявлении переменной с помощью dd. Я провел несколько тестов и привел результат ниже. По сути, я просто выделяю разные числа и смотрю, какая сборка генерируется в объектном файле (не в исполняемом файле).

$ cat test1.s
global _start

section .text
    dd 0x0

_start:
    mov eax, 1
    mov ebx, 0
    int 80h

$ nasm -f elf test1.s ; objdump -d test1.o

test1.o:     file format elf32-i386


Disassembly of section .text:

00000000 <_start-0x4>:
   0:   00 00                   add    %al,(%eax)
    ...

00000004 <_start>:
   4:   b8 01 00 00 00          mov    $0x1,%eax
   9:   bb 00 00 00 00          mov    $0x0,%ebx
   e:   cd 80                   int    $0x80

.

$ cat test2.s
global _start

section .text
    dd 0x0
    dd 0x5

_start:
    mov eax, 1
    mov ebx, 0
    int 80h

$ nasm -f elf test2.s ; objdump -d test2.o

test2.o:     file format elf32-i386


Disassembly of section .text:

00000000 <_start-0x8>:
   0:   00 00                   add    %al,(%eax)
   2:   00 00                   add    %al,(%eax)
   4:   05 00 00 00 b8          add    $0xb8000000,%eax

00000008 <_start>:
   8:   b8 01 00 00 00          mov    $0x1,%eax
   d:   bb 00 00 00 00          mov    $0x0,%ebx
  12:   cd 80                   int    $0x80

.

$ cat test3.s
global _start

section .text
    dd 0x0
    dd 0x5
    dd 0xf

_start:
    mov eax, 1
    mov ebx, 0
    int 80h

$ nasm -f elf test3.s ; objdump -d test3.o

test3.o:     file format elf32-i386


Disassembly of section .text:

00000000 <_start-0xc>:
   0:   00 00                   add    %al,(%eax)
   2:   00 00                   add    %al,(%eax)
   4:   05 00 00 00 0f          add    $0xf000000,%eax
   9:   00 00                   add    %al,(%eax)
    ...

0000000c <_start>:
   c:   b8 01 00 00 00          mov    $0x1,%eax
  11:   bb 00 00 00 00          mov    $0x0,%ebx
  16:   cd 80                   int    $0x80

.

$ cat test4.s
global _start

section .text
    dd 0x0
    dd 0x5
    dd 0xf
    dd 0x16

_start:
    mov eax, 1
    mov ebx, 0
    int 80h

$ nasm -f elf test4.s ; objdump -d test4.o

test4.o:     file format elf32-i386


Disassembly of section .text:

00000000 <_start-0x10>:
   0:   00 00                   add    %al,(%eax)
   2:   00 00                   add    %al,(%eax)
   4:   05 00 00 00 0f          add    $0xf000000,%eax
   9:   00 00                   add    %al,(%eax)
   b:   00 16                   add    %dl,(%esi)
   d:   00 00                   add    %al,(%eax)
    ...

00000010 <_start>:
  10:   b8 01 00 00 00          mov    $0x1,%eax
  15:   bb 00 00 00 00          mov    $0x0,%ebx
  1a:   cd 80                   int    $0x80

Мой вопрос: почему мы сначала добавляем что-то в регистр eax, а затем модифицируем другие регистры, такие как edx и esi, по мере роста данных? При размещении этих данных не следует использовать регистры, и особенно не следует их добавлять. И почему я никогда не вижу, чтобы правильная переменная помещалась в регистр (ответ на первый вопрос может ответить на это)? Например, я вижу инструкцию add $0xb8000000,%eax, когда выделяю 0x5, но в этой инструкции нет 0x5.


Ответы:


1

Когда вы объявляете DWORD с dd 0, это буквально просто помещает 4 байта нулей в выходной двоичный файл в этой точке. Когда вы разбираете двоичный файл, он интерпретирует это как код (когда вы предполагали, что это будут данные). Бывает, что опкоды для add %al,(%eax) равны 00 00

06.01.2013

2

Вы объявили эти переменные в разделе .text, и поэтому эти добавления происходят, чтобы избавиться от этого, просто объявите раздел .data, и эти дополнительные добавления не будут иметь места.

19.01.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..