Встроенный ассемблер

Предыдущая тема Следующая тема Перейти вниз

Встроенный ассемблер

Сообщение  Andrew в Ср Мар 04, 2009 7:51 pm

Не могу понять какой именно ассемблер встроен в FB.

Пишу
ASM
MOV AX,13
INT 10
MOV AH,9
INT 16
INT 20
END ASM

Этот код на FASM-е должен делать следующее. Запускать полноэкранный режим с разрешением 320*240, ожидать нажатия на клавишу, и если клавиша нажата выходить из программы. (я немного знаю фасм). Но программа не делает ничего. Ошибок нет. Вместо вышеописанного - программа при запуске сразу же закрывается. Что не так? Код в принципе стандартный, и должен работать чуть ли не на всех асмах. И при этом всём исходник еще и весит 78Кб Shocked

Andrew

Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 28
Откуда : Киев

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  DiG. GeRR в Ср Мар 04, 2009 8:20 pm

Ну, я надеюсь не под винду все это дело запускалось и компилилось?

Ну вообще-то синтаксис ассемблеров (MASM, TASM, FASM, и всех остальных более экзотических) в принципе не отличается друг от друга, есть различия только в директивах. Поэтому вот этот твой код не может не работать из-за того, что встроен не фасм. Там же просто опкоды, которые во всех ассемблерах одинаковые, работать оно должно на любом компиляторе. Блин, больше ничего сказать не могу...

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  tux в Чт Мар 05, 2009 9:11 am

а если етот же кусок на фасме скомпилить, он запускается?
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  Andrew в Чт Мар 05, 2009 5:48 pm

а если етот же кусок на фасме скомпилить, он запускается?
MOV AX,13
INT 10
MOV AH,9
INT 16
INT 20
Этот код компилируется в bin исполняемый файл, поэтому его так просто не запустишь. А вот так под виндой запускается:

org 100h
MOV AX,13
INT 10
MOV AH,9
INT 16
INT 20
Как видите ничего не изменилось, только вначале появилась строчка org 100h.

Дело в том, что для обозначения формата исполняемого файла (не важно каком асме, для меня фасм-по умолчанию) нужно вначале писать org 100h. - в таком случае компилится в com файл. Если написать Format MZ - это dos executable, Format PE console (сами понимаете) или же Format PE GUI. Но если это дело написать на FB то ругается на строчку org 100h - типа непонятная команда, он такой не знает. Тоже самое с Format MZ, Format PE console и с Format PE GUI.

Да в принципе я не думаю что следует указывать заголовок исполняемого файла (org 100) потому как вряд ли FB скомпилирует в нечто другое, чем MZ (у меня компилятор для ДОС).

Ну, я надеюсь не под винду все это дело запускалось и компилилось?
Компилилось в винде, и запускалось под виндой. Но на екзешник от асма ведь работает... Могу попробовать под досом запустить Smile но думаю вряд ли что-то из этого получится...

А вообще никто не знает что за синтаксис асма в fb встроен? В справке что-то про RADASM написано, но это ведь вроде как среда разработки для ассемблера, или я что-то путаю...

Andrew

Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 28
Откуда : Киев

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  electrik в Чт Мар 05, 2009 7:12 pm

насколько я знаю, что вот так просто в винде, к прерываниям биос не обратишься.
все дело в том, что данные прерывания реального режима, причем в windows проц работает в 32 битном защищенном режиме, и вообще в целях безопасности, в виндах идет запрет к низкоуровневым штукам
и чтоб включить тот или иной режим экрана, нужно дергать winApi.
чтоб обратиться к винтчестеру, так сказать на прямую, тоже надо дергать winapi.
во FreeBasic, есть прямое обращение к портам, но там, я так думаю, так же идет через winApi, так как когда используеш функции обращения к портам, бинарник заметно увеличивается.
я пробовал делать простую программу через прерывания, которая выводит текст- не прокатывает, причем код был скомпилирован под windows.
во FreeBasic ассемблере, ненадо использовать всяких директив смещения, так как компилятор сам все делает, просто надо переменные создавать средствами FreeBasic, а прогу писать на ассемблере.
такие вещи как:
number dd 0
не прокатывают. чтоб записать значение переменной нумбер в регистр, надо сделать так:
dim number as integer = 1234
asm
mov eax, [number]
end asm

Вот простой пример из мануала
код:
Function AddFive(ByVal num As Integer) As Integer
Asm
mov eax, [num]
add eax, 5
mov [Function], eax
End Asm
End Function

Dim i As Integer = 4

Print "4 + 5 ="; AddFive(i)

в принципе, во FreeBasic ассемблере, можно создавать переменные, но это надо смотреть доку по gnu assembler.
насколько я помню, данный вопрос уже обсуждался на нашем форуме, надо пошарить, сейчас ссылку не дам.

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  DiG. GeRR в Чт Мар 05, 2009 8:27 pm

Вообще, любой инлайн-ассемблер, встроенный в высокоуровневый язык, в том числе и во фрибацик, отличается от обычного ассемблера (то есть того, который понимается компиляторами ассемблера) тем, что из него изъяты почти ВСЕ директивы, а оставлены только основные команды, которые и исполняются процессором. Все форматы исполняемых файлов отличаются только своим заголовком (или отсутствием его, как в COM). Исполняемый код везде одинаков. Директива org 100h используется только в COM файлах, для указания того, что код нужно сместить от начального значения на 100 байт. И управлять форматом выходного файла директивами тоже нельзя. В инлайне.
А вот так под виндой запускается
Это не под винду. А под дос, формат файла - com, то есть обычный бинарник в пару байт. В винде запускается только благодаря поддержке дос-программ.
Как точно сказал electric, винда не позволит так панибратски обращаться с прерываниями и портами, поэтому данный код должен исполняться только либо под дос, либо с правами драйвера под винду. Иначе никак. Поэтому я и спросил.
И какая вообще разница, что за асм встроен в компилятор? Логично, что именно тот, которым он и перекомпиливает свой код (а фрибайик сначала генерит исходный код на ассемблере, и только потом компилит его отдельным файлом компилятора ассемблера). Синтаксисы всех ассемблеров (кроме HLA), отличаются, грубо говоря, только директивами, которых все равно в инлайне НЕТ

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  Andrew в Чт Мар 05, 2009 10:23 pm

винда не позволит так панибратски обращаться с прерываниями и портами, поэтому данный код должен исполняться только либо под дос, либо с правами драйвера под винду. Иначе никак. Поэтому я и спросил.

Это все хорошо. Очень хорошо что вы мне все так подробно объясняете Smile но...
Почему тогда я пишу на АСМЕ в винде, и компилирую в винде, и ЗАПУСКАЮ в винде, и вызываю прерывания БИОСА int 10h, int 16h и т.д. и все нормально работает! ДА-ДА ! Вы правильно прочитали! нормально работает. Smile

Andrew

Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 28
Откуда : Киев

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  DiG. GeRR в Пт Мар 06, 2009 4:52 pm

Нормально работает, да. Но только при компиляции не в родной формат винды, то есть PE EXE, а в досовский формат MZ EXE, или COM. Фасм без труда компилирует, когда не указано других форматов, в формат COM - поэтому и работает. А фрибацик далет РЕ. Из за этого все.

И я тут в мануальчик глянул, там черным по белому написано:

FreeBASIC's Assembler is AS / GAS, the assembler of GCC

для незнающих буржуйского перевожу:

Ассемблер фрибацика - AS / GAS (есть такой, мультиплатформенный, но как самостоятельный компилятор почти программерами не используемый), из GCC (GNU COMPILER COLLECTION).

Синтаксис ГАЗа полностью интеловский, то есть такой же, как у, к примеру, МАСМа. Ну или ФАСМа, но только придется учесть небольшую путаницу с квадратными скобками, к которой несложно привыкнуть.

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  vbman в Сб Апр 25, 2009 1:25 pm

Andrew пишет:
винда не позволит так панибратски обращаться с прерываниями и портами, поэтому данный код должен исполняться только либо под дос, либо с правами драйвера под винду. Иначе никак. Поэтому я и спросил.

Это все хорошо. Очень хорошо что вы мне все так подробно объясняете Smile но...
Почему тогда я пишу на АСМЕ в винде, и компилирую в винде, и ЗАПУСКАЮ в винде, и вызываю прерывания БИОСА int 10h, int 16h и т.д. и все нормально работает! ДА-ДА ! Вы правильно прочитали! нормально работает. Smile

попробуйте скачать Фрибацик под ДОС и тогда может и заработает... Question
avatar
vbman

Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 35
Откуда : Украина, Кировоград

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  electrik в Вс Апр 26, 2009 11:11 am

если работать с ассемблером во FreeBasic под dos, скорее всего с прерываниями вот так напрямую не получится. дело в том, что FreeBasic под dos , работает в 32 битном режиме, тоесть тоже protected mode, значит, только можно через dpmi.
разные модели памяти, а как прерыванию можно передать 32 битное смещение. да и на какой участок памяти. ведь в мире 32 битной адресации, все виртуально. программе выделяется адресное пространство, и она может писать только в него. если мы пишем по адресу 100043234, это не значит, что физический адрес в памяти будет такой.

#include "dos/dpmi.bi"

Type RegTypeX As __dpmi_regs

#define INTERRUPTX(v,r) __dpmi_int( v, @r )

короче в мануале есть такая хрень
DOS related FAQ
и почитайте документацию по dpmi
я сам под него не программил, но предполагаю, что будет работать это не быстро, так как видимо, идет типа эмуляции.

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  Andrew в Вс Апр 26, 2009 2:44 pm

попробуйте скачать Фрибацик под ДОС и тогда может и заработает... Question
Я пробовал... Даже под досом запускал, и ничего... Ну т.е. сразу выходит из этой программы.

Да и если честно - это я для интереса спросил почему не запускается, ведь все равно программы под ДОС эмулируются системой ntvdm, и никакого прямого обращения к железу нету...

Andrew

Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 28
Откуда : Киев

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Встроенный ассемблер

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения