Как я могу создать программу сборки без использования библиотек? - PullRequest
1 голос
/ 11 апреля 2010

Я буквально только начал изучать ассемблер. Я использую ассемблер NASM в Windows Vista.

Обычно, когда я начинаю изучать новый язык, я копирую чужой код Hello World и постараюсь понять его построчно. Тем не менее, я нахожу удивительным, что трудно найти программу Hello World, которая не ссылается на другие библиотеки! Видите ли, нет смысла пытаться понять каждую строку кода, если она тесно связана с целой библиотекой дополнительного кода!

Одна из причин, по которой я хочу изучать ассемблер, заключается в том, что я могу почти полностью контролировать программы, которые я пишу. Я не хочу зависеть от каких-либо библиотек.

И вот мой вопрос: может ли кто-нибудь дать мне совместимый с NASM код сборки для полностью автономной программы Hello World, которая может выводиться на консоль Windows Vista?

В качестве альтернативы, я понимаю, что библиотека может потребовать сообщить программе, ГДЕ распечатать вывод (т. Е. Консоль Windows). Кроме этого, я не понимаю, зачем нужны какие-либо библиотеки. Я что-то пропускаю?

Ответы [ 4 ]

3 голосов
/ 11 апреля 2010

Здесь как:

       .text
LC0:
        .ascii "Hello, world!\12"
.globl _main
_main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $4, %esp
        pushl   $-11
        call    _GetStdHandle@4
        pushl   $0
        leal    -4(%ebp), %ebx
        pushl   %ebx
        pushl   $14
        pushl   $LC0
        pushl   %eax
        call    _WriteFile@20
        movl    $0, %eax
        leave
        ret

Вы не сможете обойтись без использования функций операционной системы. Недостатком использования библиотеки (например, библиотеки C) является то, что вы подключаетесь к конкретной ОС.

1 голос
/ 11 апреля 2010

В качестве альтернативы вы можете написать загрузчик, который выводит «Hello, World» на консоль напрямую через видеопамять. Тогда у вас практически ничего нет между вами и голым металлом. Вы можете найти инструкции по созданию загрузчика, на который указывает OSDev Wiki . Начните с чтения этой страницы, чтобы получить объяснение концепций и идей. После этого перейдите по внешней ссылке на Hello World Bootloader . Обратите внимание, что в учебнике для печати сообщения используется BIOS (библиотека). Однако вы можете поискать в вики OSDev информацию о том, как печатать сообщения на экране без BIOS и вносить необходимые изменения.


Отредактировано, чтобы добавить:

Я настоятельно рекомендую вам использовать какую-либо виртуализацию для этого действия. Не связывайтесь с загрузочными секторами на вашем жестком диске, если вы ДЕЙСТВИТЕЛЬНО не знаете, что делаете.

0 голосов
/ 11 апреля 2010

Windows спроектирована так, что все находится в библиотеке. Самая базовая библиотека - Kernel32.dll, которая включает в себя функции для записи и чтения файлов и другие очень простые операции. (Запись в консоль - это просто запись в специальный файл.)

В Linux основные системные функции находятся не в библиотеках, а в «системных вызовах», доступ к которым осуществляется через прерывание 80. Таким образом, в Linux можно (и довольно легко) написать довольно сложные программы без каких-либо библиотека "звонит вообще.

Но вы, вероятно, должны использовать несколько библиотек. Весь смысл библиотек в том, чтобы сделать вашу жизнь проще. Продолжайте и используйте стандартную библиотеку C, чтобы вы могли иметь некоторую базовую консоль и файл ввода / вывода. Оттуда вы можете не найти места, где вам действительно нужны библиотеки, которые вы не можете сделать сами.

0 голосов
/ 11 апреля 2010

Windows загружает библиотеки kernel32.dll и ntdll.dll для всех программ (независимо от того, используете ли вы их не). И вы должны использовать их, потому что низкоуровневый интерфейс к операционной системе зависит от вашего процессора и его версии (то есть он может измениться после некоторых обновлений Windows).

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