Netwide Assembler - NASM - problem
5 отговора
189 прегледа
Netwide Assembler - NASM - problem
Отскоро се уча на асемблер и използвам насм. Та проблема ми е с компилираните програми: под ДОС те си вървят нормално, но под Уиндоус се получава съобщение за грешка (нещо от рода на is not a valid win32 application). Защо се получава?
Имам още два въпроса: 1.Как се създават сегменти в една НАСМ програма (нещо като моделите .model small, medium, compact, huge ..., но за НАСМ)?
2. Какво да направя за да отпечатам на екрана Здравей, Свят! без ДОС на боот-а на някоя дискета? (само кода ме интересува; имам hex. редактор за дискети)
"640 kB са достатъчни на всекий за всичко" - Бил Гейтс
Имам още два въпроса: 1.Как се създават сегменти в една НАСМ програма (нещо като моделите .model small, medium, compact, huge ..., но за НАСМ)?
2. Какво да направя за да отпечатам на екрана Здравей, Свят! без ДОС на боот-а на някоя дискета? (само кода ме интересува; имам hex. редактор за дискети)
"640 kB са достатъчни на всекий за всичко" - Бил Гейтс
Редактирано от mialy на
Re: Netwide Assembler - NASM - problem
Първо ще те попитам, какво имаш предвид под НАСМ програма, щото не съм съвсем сигурен...
По реда на въпросите:
1. Сегменти се пишат според спецификацията на съответния асемблер, който се задава от производителя на процесора, а не на компилатора. Самият NASM има много елегантен подход и позволява доста други освен конвеционалните структури на подреждане, но не те съветвам да се занимаваш с висш пилотаж преди да стъпиш на здрава почва. За правилния синтаксис, прочети документацията. NASM има доста голяма такава, където е описано абсолютно всичко.
2. За да отпечаташ нещо на екрана без ДОС дискета, ползвай друга ОС. Ако имаш предвид, как да отпечаташ нещо на екран без каквато и да било ОС, напиши си boot-сектор. Сорс на boot-сектор бих ти написал, но първо ще уговорим някаква цена.
Ако искащ обаче да напишеш "Здравей, свят!" ще трябва да заредиш и кирилица. Давам ти гаранция, че само с boot-сектор няма да стане. В 512 байта нама да събереш необходимия шрифт. Виж ако искаш да отпечаташ "Hello, world!" това е проста работа.
**************
More about NASM: Миналата година открихме два бъга. Единият е калпаво превеждане на инструкция с относително адресиране чрез все още необявена константа (нещо което NASM поддържа). Примерно:
mov eax,[edi+ConstAddress]
където ConstAddress не е обявен. Ако ConstAddress се обяви като нула по-долу, адресацията се асемблира като [edi+0], а не като [edi]. Нулата естествено се записва с 16 или 32 бита според сегмента.
Вторият бъг е по-сериозен - променя смисъла на инструкцията, слагайки неверен префикс. В 16-битов сегмент инструкциите JCXZ/JECXZ се превеждат винаги като JCXZ, а в 32-битов като JECXZ. За последствията си правете изводи...
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
По реда на въпросите:
1. Сегменти се пишат според спецификацията на съответния асемблер, който се задава от производителя на процесора, а не на компилатора. Самият NASM има много елегантен подход и позволява доста други освен конвеционалните структури на подреждане, но не те съветвам да се занимаваш с висш пилотаж преди да стъпиш на здрава почва. За правилния синтаксис, прочети документацията. NASM има доста голяма такава, където е описано абсолютно всичко.
2. За да отпечаташ нещо на екрана без ДОС дискета, ползвай друга ОС. Ако имаш предвид, как да отпечаташ нещо на екран без каквато и да било ОС, напиши си boot-сектор. Сорс на boot-сектор бих ти написал, но първо ще уговорим някаква цена.
Ако искащ обаче да напишеш "Здравей, свят!" ще трябва да заредиш и кирилица. Давам ти гаранция, че само с boot-сектор няма да стане. В 512 байта нама да събереш необходимия шрифт. Виж ако искаш да отпечаташ "Hello, world!" това е проста работа.
**************
More about NASM: Миналата година открихме два бъга. Единият е калпаво превеждане на инструкция с относително адресиране чрез все още необявена константа (нещо което NASM поддържа). Примерно:
mov eax,[edi+ConstAddress]
където ConstAddress не е обявен. Ако ConstAddress се обяви като нула по-долу, адресацията се асемблира като [edi+0], а не като [edi]. Нулата естествено се записва с 16 или 32 бита според сегмента.
Вторият бъг е по-сериозен - променя смисъла на инструкцията, слагайки неверен префикс. В 16-битов сегмент инструкциите JCXZ/JECXZ се превеждат винаги като JCXZ, а в 32-битов като JECXZ. За последствията си правете изводи...
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Re: Netwide Assembler - NASM - problem
Тогава кой асемблер компилатор да използвам (все пак V2_OS е правена на него)? Micro$oft MASM или Borland TASM?
"640 kB са достатъчни на всекий за всичко" - Бил Гейтс
"640 kB са достатъчни на всекий за всичко" - Бил Гейтс
Re: Netwide Assembler - NASM - problem
Абе и NASM става но той не поддържа модели на паметта. Хубаво е да прочетеш документацията. Ако не разбираш английски, ще чакаш докато я преведа. За сега съм на 1500 ред.
Re: Netwide Assembler - NASM - problem
Ще чакам.
"640 kB са достатъчни на всекий за всичко" - Бил Гейтс
"640 kB са достатъчни на всекий за всичко" - Бил Гейтс
Re: Netwide Assembler - NASM - problem
Че ползвай го, компилаторът е супер.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.