Встроенный ассемблер
Участников: 5
Страница 1 из 1
Встроенный ассемблер
Не могу понять какой именно ассемблер встроен в FB.
Пишу
ASM
MOV AX,13
INT 10
MOV AH,9
INT 16
INT 20
END ASM
Этот код на FASM-е должен делать следующее. Запускать полноэкранный режим с разрешением 320*240, ожидать нажатия на клавишу, и если клавиша нажата выходить из программы. (я немного знаю фасм). Но программа не делает ничего. Ошибок нет. Вместо вышеописанного - программа при запуске сразу же закрывается. Что не так? Код в принципе стандартный, и должен работать чуть ли не на всех асмах. И при этом всём исходник еще и весит 78Кб
Пишу
ASM
MOV AX,13
INT 10
MOV AH,9
INT 16
INT 20
END ASM
Этот код на FASM-е должен делать следующее. Запускать полноэкранный режим с разрешением 320*240, ожидать нажатия на клавишу, и если клавиша нажата выходить из программы. (я немного знаю фасм). Но программа не делает ничего. Ошибок нет. Вместо вышеописанного - программа при запуске сразу же закрывается. Что не так? Код в принципе стандартный, и должен работать чуть ли не на всех асмах. И при этом всём исходник еще и весит 78Кб
Andrew- Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 35
Откуда : Киев
Re: Встроенный ассемблер
Ну, я надеюсь не под винду все это дело запускалось и компилилось?
Ну вообще-то синтаксис ассемблеров (MASM, TASM, FASM, и всех остальных более экзотических) в принципе не отличается друг от друга, есть различия только в директивах. Поэтому вот этот твой код не может не работать из-за того, что встроен не фасм. Там же просто опкоды, которые во всех ассемблерах одинаковые, работать оно должно на любом компиляторе. Блин, больше ничего сказать не могу...
Ну вообще-то синтаксис ассемблеров (MASM, TASM, FASM, и всех остальных более экзотических) в принципе не отличается друг от друга, есть различия только в директивах. Поэтому вот этот твой код не может не работать из-за того, что встроен не фасм. Там же просто опкоды, которые во всех ассемблерах одинаковые, работать оно должно на любом компиляторе. Блин, больше ничего сказать не могу...
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: Встроенный ассемблер
а если етот же кусок на фасме скомпилить, он запускается?
Этот код компилируется в bin исполняемый файл, поэтому его так просто не запустишь. А вот так под виндой запускается:MOV AX,13
INT 10
MOV AH,9
INT 16
INT 20
Как видите ничего не изменилось, только вначале появилась строчка org 100h.
org 100h
MOV AX,13
INT 10
MOV AH,9
INT 16
INT 20
Дело в том, что для обозначения формата исполняемого файла (не важно каком асме, для меня фасм-по умолчанию) нужно вначале писать 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 (у меня компилятор для ДОС).
Компилилось в винде, и запускалось под виндой. Но на екзешник от асма ведь работает... Могу попробовать под досом запустить но думаю вряд ли что-то из этого получится...Ну, я надеюсь не под винду все это дело запускалось и компилилось?
А вообще никто не знает что за синтаксис асма в fb встроен? В справке что-то про RADASM написано, но это ведь вроде как среда разработки для ассемблера, или я что-то путаю...
Andrew- Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 35
Откуда : Киев
Re: Встроенный ассемблер
насколько я знаю, что вот так просто в винде, к прерываниям биос не обратишься.
все дело в том, что данные прерывания реального режима, причем в 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.
насколько я помню, данный вопрос уже обсуждался на нашем форуме, надо пошарить, сейчас ссылку не дам.
все дело в том, что данные прерывания реального режима, причем в 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- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Встроенный ассемблер
Вообще, любой инлайн-ассемблер, встроенный в высокоуровневый язык, в том числе и во фрибацик, отличается от обычного ассемблера (то есть того, который понимается компиляторами ассемблера) тем, что из него изъяты почти ВСЕ директивы, а оставлены только основные команды, которые и исполняются процессором. Все форматы исполняемых файлов отличаются только своим заголовком (или отсутствием его, как в COM). Исполняемый код везде одинаков. Директива org 100h используется только в COM файлах, для указания того, что код нужно сместить от начального значения на 100 байт. И управлять форматом выходного файла директивами тоже нельзя. В инлайне.
Как точно сказал electric, винда не позволит так панибратски обращаться с прерываниями и портами, поэтому данный код должен исполняться только либо под дос, либо с правами драйвера под винду. Иначе никак. Поэтому я и спросил.
И какая вообще разница, что за асм встроен в компилятор? Логично, что именно тот, которым он и перекомпиливает свой код (а фрибайик сначала генерит исходный код на ассемблере, и только потом компилит его отдельным файлом компилятора ассемблера). Синтаксисы всех ассемблеров (кроме HLA), отличаются, грубо говоря, только директивами, которых все равно в инлайне НЕТ
Это не под винду. А под дос, формат файла - com, то есть обычный бинарник в пару байт. В винде запускается только благодаря поддержке дос-программ.А вот так под виндой запускается
Как точно сказал electric, винда не позволит так панибратски обращаться с прерываниями и портами, поэтому данный код должен исполняться только либо под дос, либо с правами драйвера под винду. Иначе никак. Поэтому я и спросил.
И какая вообще разница, что за асм встроен в компилятор? Логично, что именно тот, которым он и перекомпиливает свой код (а фрибайик сначала генерит исходный код на ассемблере, и только потом компилит его отдельным файлом компилятора ассемблера). Синтаксисы всех ассемблеров (кроме HLA), отличаются, грубо говоря, только директивами, которых все равно в инлайне НЕТ
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: Встроенный ассемблер
винда не позволит так панибратски обращаться с прерываниями и портами, поэтому данный код должен исполняться только либо под дос, либо с правами драйвера под винду. Иначе никак. Поэтому я и спросил.
Это все хорошо. Очень хорошо что вы мне все так подробно объясняете но...
Почему тогда я пишу на АСМЕ в винде, и компилирую в винде, и ЗАПУСКАЮ в винде, и вызываю прерывания БИОСА int 10h, int 16h и т.д. и все нормально работает! ДА-ДА ! Вы правильно прочитали! нормально работает.
Andrew- Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 35
Откуда : Киев
Re: Встроенный ассемблер
Нормально работает, да. Но только при компиляции не в родной формат винды, то есть PE EXE, а в досовский формат MZ EXE, или COM. Фасм без труда компилирует, когда не указано других форматов, в формат COM - поэтому и работает. А фрибацик далет РЕ. Из за этого все.
И я тут в мануальчик глянул, там черным по белому написано:
для незнающих буржуйского перевожу:
Ассемблер фрибацика - AS / GAS (есть такой, мультиплатформенный, но как самостоятельный компилятор почти программерами не используемый), из GCC (GNU COMPILER COLLECTION).
Синтаксис ГАЗа полностью интеловский, то есть такой же, как у, к примеру, МАСМа. Ну или ФАСМа, но только придется учесть небольшую путаницу с квадратными скобками, к которой несложно привыкнуть.
И я тут в мануальчик глянул, там черным по белому написано:
FreeBASIC's Assembler is AS / GAS, the assembler of GCC
для незнающих буржуйского перевожу:
Ассемблер фрибацика - AS / GAS (есть такой, мультиплатформенный, но как самостоятельный компилятор почти программерами не используемый), из GCC (GNU COMPILER COLLECTION).
Синтаксис ГАЗа полностью интеловский, то есть такой же, как у, к примеру, МАСМа. Ну или ФАСМа, но только придется учесть небольшую путаницу с квадратными скобками, к которой несложно привыкнуть.
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: Встроенный ассемблер
Andrew пишет:винда не позволит так панибратски обращаться с прерываниями и портами, поэтому данный код должен исполняться только либо под дос, либо с правами драйвера под винду. Иначе никак. Поэтому я и спросил.
Это все хорошо. Очень хорошо что вы мне все так подробно объясняете но...
Почему тогда я пишу на АСМЕ в винде, и компилирую в винде, и ЗАПУСКАЮ в винде, и вызываю прерывания БИОСА int 10h, int 16h и т.д. и все нормально работает! ДА-ДА ! Вы правильно прочитали! нормально работает.
попробуйте скачать Фрибацик под ДОС и тогда может и заработает...
vbman- Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 42
Откуда : Украина, Кировоград
Re: Встроенный ассемблер
если работать с ассемблером во 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
я сам под него не программил, но предполагаю, что будет работать это не быстро, так как видимо, идет типа эмуляции.
разные модели памяти, а как прерыванию можно передать 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- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Встроенный ассемблер
Я пробовал... Даже под досом запускал, и ничего... Ну т.е. сразу выходит из этой программы.попробуйте скачать Фрибацик под ДОС и тогда может и заработает... Question
Да и если честно - это я для интереса спросил почему не запускается, ведь все равно программы под ДОС эмулируются системой ntvdm, и никакого прямого обращения к железу нету...
Andrew- Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 35
Откуда : Киев
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|