Консультация № 193457
06.08.2018, 04:06
0.00 руб.
0 7 1
Здравствуйте! Прошу помощи в следующем вопросе:
Изучал ассемблер, тасм, масм, фасм, интел и эйти энд ти синтаксисы, решил остановиться на фасме, как начал заниматься на windows 10, то естественно заметил что программы пишутся за счёт макросов, библиотек, апи, пытался найти чистый кодик (классичейский "hello world!" - через дос функцию и прерывание), но не нашел, поэтому и написал Вам, посоветуйте литературу, без макросов, или хотябы мануал, даже если и не большой. win10 без ntvdm, понятно что будет не так как обычно, но интересно начать, или хотя бы узнать как это делается на win10 :)
система в наличии: windows 10 x64,
предпочтителен: fasm
процессор: amd ryzen 5 1600
буду благодарен за ответ, спасибо :)

Обсуждение

давно
Старший Модератор
31795
6196
06.08.2018, 11:00
общий
06.08.2018, 11:01
Адресаты:
Цитата: Kdsfofwe21
система в наличии: windows 10 x64,

У Вас 64-х битная система, 16-ти битный код не будет на ней работать, поэтому Вам нужен DosBox.

Цитата: Kdsfofwe21
предпочтителен: fasm

FASM-синтаксис несколько отличается от TASM/MASM, но в целом похож.
Основные различия касаются организации программы и обращения к переменным. В комплекте с компилятором идет инструкция на английском, но в сети можно найти и русскую версию.

Цитата: Kdsfofwe21
пытался найти чистый кодик (классичейский "hello world!" - через дос функцию и прерывание),

А, что его искать, в одной из версий есть такой вариант:
[code lang=asm]
; fasm example of writing 16-bit COM program

org 100h ; code starts at offset 100h
use16 ; use 16-bit code

display_text = 9

mov ah,display_text
mov dx,hello
int 21h

int 20h

hello db 'Hello world!',24h[/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402218
66
06.08.2018, 15:50
общий
06.08.2018, 15:52
спасибо за советы, так же интересует вопрос, на windows 10 64, возможно ли написать подобный код на фасм, который Вы привели в ответе? Без включений библиотек и апи, и макросов?
давно
Старший Модератор
31795
6196
07.08.2018, 12:49
общий
Адресаты:
Практически это код FASM(;fasm example of writing 16-bit COM program==FASM пример написания 16-ти битных СОМ-программ ).
Скомпилировать компилятор сможет, но запустить его можно ТОЛЬКО на любом эмуляторе DOS, как вариант DOS Box
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402218
66
07.08.2018, 13:34
общий
Имел ввиду что есть ли возможность, посредством регистров, и некоторых директива написать такой код в 64битном виндовсе
К примеру:
....
....
mov ah,09h
mov edx, message
Тут какое либо прервание аналогичное int 21h
.....
.....
message db 'Hello friends!$' ',


Естественно видел примеры в скачанном фасм примерах хелло ворлд, но там использовались инклюды виндовские и макросы.
К чему же такой вопрос, когда изучал под дос, то почему то думал, что отличие для 32 и 64 битых версиях будет название регистров и виды форматов в который надо компилировать.
давно
Старший Модератор
31795
6196
07.08.2018, 14:34
общий
Адресаты:
В Windows работа идет посредством API-функций, их два вида: GUI(оконные) и Console(консоль, похоже на командную строку). В Windows прерываний нет как таковых, на уровне ядра есть исключения - но это уже другая сказка о защищенном режиме. Ось загружается в реальном режиме(где есть прерывания BIOS, которые аналогичны DOS), переходит в защищенный режим, определяет все доступные ресурсы: память, диски, монитор, клавиатура, различные видео и сетевые карты внешних устройств, создает, что-то вроде менеджера ресурсов.

При запуске любой программы, работа с любым ресурсом идет с помощью API-функций уровня пользователя, которые вызывают аналогичные функции ядра, и только потом происходит обмен(прием-передача) информации между программой и каким либо ресурсом.

Цитата: Kdsfofwe21
то почему то думал, что отличие для 32 и 64 битых версиях будет название регистров и виды форматов в который надо компилировать.

То о чем Вы говорите, сохранилось в LINUX, там везде идет INT 0x80, а в АХ, ЕАХ и т.д. передается номер вызываемой функции, а по остальным регистрам передаются другие параметры.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402218
66
07.08.2018, 17:59
общий
Спасибо, за хорошее разъяснение
давно
Старший Модератор
31795
6196
10.08.2018, 11:20
общий
это ответ
Здравствуйте, Kdsfofwe21!

Начиная с первых Windows прерывания как таковые отсутствуют, вместо них пользователю предлагаются стандартные функции, записанные в разные библиотеки DLL. Компилятор при своей установке создает INC-файлы(с константами и структурами данной библиотеки) и LIB-файлы(с таблицей экспорта). При компиляции программы в вызов функции подставляется нужное значение из INC-файла и данные в таблицу импорта из LIB-файла. А сам вызов превращается в CALL [ importTable:number ].

То, о чем Вы спрашиваете сохранилось в LINUX, поменялась разрядность регистров, но INT 80h остался.

Удачи!
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа