Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пн авг 21, 2017 1:00 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 137 сообщений ]  На страницу 1 2 3 4 510 След.
Автор Сообщение
 Заголовок сообщения: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 4:28 pm 
Не в сети

Зарегистрирован: Пн июл 12, 2010 7:03 am
Сообщения: 43
первый вопрос о форматах файлов

есть такая директива format

MZ — 16-битный формат, основной формат файлов .EXE в DOS.
NE — 16-битный формат, использовался в Windows 3.x[2], OS/2 и MS-DOS
LE — смешанный 16- и 32-битный формат, ранее использовался в OS/2 и Windows (VxD).
LX — 32-битный формат, используется в OS/2.
PE — 32- и 64-битный формат, используется в современных версиях Windows начиная с Windows NT и Windows 95.
COFF, MS COFF, MS64 COFF — объектные файлы.
ELF, ELF64 — исполняемые файлы в UNIX-подобных системах.
ARM — разработка энтузиастов, можно найти на официальном форуме.
Binary — файлы произвольной структуры. Указав смещение 100h (org 100h), можно получить исполняемый файл формата .COM. Также, с помощью format binary можно компилировать файлы данных.

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

к примеру, если мы пишем такой формат
Код:
format PE GUI 4.0 DLL at 7000000h on 'stub.exe'

то нам надо ещё вставлять секшансы
Код:
section '.text' code readable executable
section '.reloc' data discardable fixups
section '.rsrc' data readable resource from 'my.res'

и хрен его знает какой синтаксис у этих директив
и что это означает

если пишем
Код:
format COFF

то унас добавляются ещё какие то директивы
Код:
    extrn exit
    extrn '__imp__MessageBoxA@16' as MessageBox:dword
    public main
    public start as '_start'


с MZ более менее обьеснено segment, entry, stack, heap
только вот как пользовать эти сегменты ?
как сегменты распределюутся по процессору?
для чего они нужны?
какие у них ограничения?


следующий вопрос по дерективе org
что это за директива, что она делает, почему разные значения этой директивы формируют разнае форматы файлов
что самое интересно если поставить org 100h и запустит .com программу с dos(именно dos не MS-DOS)
то можете забыть про сегментные регистры вообще они нахрен не работают

директивы use16 use32 use64
что эти дерективы делают на сколько мне известно
команды 32 это те же самые комманды что и 16 только дополненые
комманды 64 это уже другие команды

скажите когда и как эти дерективы использовать и что они в конце концов делают

директива alpha

что это за директива что она делает, что означает

переменные
директивы struc, virtual
на сколько я понал эти директи создают вирлуальную модельданнах
то есть у меня есть переменная f_string db 256 dup(0)
в ней первые 4 байта что то означают
потом ещё 2 байта что то означают
потом 8 байт что то означают
и так далее
и для того чтобы я не делал лишних действий
Код:
    mov bx, f_string
    add bx, 4

для того что бы определить адрес нужных данных
мне нужно использовать эти директивы
только вот они не работают если использовать документацию

скажите как мне эти дерективы использовить, для того чтобы грамотно организовать даннае?


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 4:43 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
scuter писал(а):
вроди бы всё просто пишешь формат и компилтся тот файл который нужен,
но оказывается что всё савсем не так, эта директива меняет всю структуру построения программы

А ты как хотел? :) Форматы тем и отличаются, что у них различная структура секций.

scuter писал(а):
только вот как пользовать эти сегменты ?
как сегменты распределюутся по процессору?
для чего они нужны?
какие у них ограничения?

Сегменты - для удобства программистов. Например, может быть сегмент кода и сегмент данных. В сегменте данных хранятся исключительно данные, их можно считывать и записывать, но передавать управление на код из сегмента данных нельзя. А в сегмент кода наоборот, нельзя записывать данные, можно только читать. Использовать их надо с умом, держать сначала мануал, где расписано, как использовать сегменты для того или иного формата программ. Если ты пишешь для Колибри, тебе не нужно использовать сегменты. Если ты пишешь для Linux - то нужен формат ELF, для Windows - PE. В процессоре никаких сегментов нет, сегменты - они в памяти.

scuter писал(а):
следующий вопрос по дерективе org
что это за директива, что она делает, почему разные значения этой директивы формируют разнае форматы файлов
что самое интересно если поставить org 100h и запустит .com программу с dos(именно dos не MS-DOS)
то можете забыть про сегментные регистры вообще они нахрен не работают

Представь, что ты программируешь в машинных кодах/на ассемблере. Ты пишешь команду jmp 0000. Эта команда - безусловного перехода на другую команду, записанную в памяти по адресу 0000. Когда ты создаешь в ассемблере метку, а потом делаешь jmp имя_метки, то ассемблер заменяет имя_метки на фактический адрес в памяти команды после метки. Если ты хочешь, чтобы твоя программа записывалась в память не с адреса 0, а с адреса, допустим, 100h, то ты делаешь org 100h и все метки рассчитываются не от 0, а от 100h. Кстати, в формате com компилятор fasm по умолчанию считает org 100h. Сегментные регистры, разумеется, не работают.

scuter писал(а):
директивы use16 use32 use64
что эти дерективы делают на сколько мне известно
команды 32 это те же самые комманды что и 16 только дополненые
комманды 64 это уже другие команды

Мха. Эти директивы определяют, какой код будет получаться - 16-битный, 32-битный или 64-битный. Мнемоники команд в общем и целом одинаковые, а команды сами разные. Сравни
mov ax, 10
mov eax, 10
mov rax, 10
В режиме use16 вторая и третья команды не скомпилируются. В режиме use32 у первой команды, скорее всего, код операции будет не такой, как у той же команды в режиме use16 (хотя тут я не уверен).

Вообще я советую тебе:
а) Взять книжку по ассемблеру хорошую. Сначала что-то простое (блин, забыл фамилию автора хорошего учебника), потом - Юрова
б) Параллельно с пунктом а скачать эмулятор УМПК-80 (да-да, восьмибитного процессора) и хорошенько разобраться с тем, как вообще работает процессор. Сделать на этом эмуляторе (он с компилятором ассемблера) несколько несложных программ - CRC-16, например.


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 5:08 pm 
Если точнее то use16, use32, use64 это режимы адресации и пример с mov не совсем из той оперы.

scuter
Чтобы получше понять, кроме книжек и документации стоит поставить дизассемблер (для dos и win лучше IDA) и по изучать, что будет на выходе в том или ином случае.


Вернуться к началу
   
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 5:12 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Хм, точно. Очевидное в голову не пришло почему-то.

Кстати, в том же УМПК есть и дизассемблер.


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 5:43 pm 
Не в сети

Зарегистрирован: Ср дек 26, 2007 5:09 am
Сообщения: 214
Mario писал(а):
Если точнее то use16, use32, use64 это режимы адресации и пример с mov не совсем из той оперы.


use16,32,64 -- это НЕ режимы адресации, а разрядность, для которой производится генерация кода. Например, одна и та же последовательность байтов в 16-разрядном режиме процессора может быть воспринята как команда MOV AX, 10, а в 32- и 64-разрядном -- как MOV EAX, 10. Чтобы в 16-разрядном режиме загрузить регистр EAX, а 32/64-разрядном -- AX, необходимо добавить в эту последовательность байтов префикс изменения размера операнда. Что же касается команды MOV RAX, 10, то для неё необходим префикс REX, который формируется транслятором только для 64-разрядного режима (в 16- и 32-разрядном режимах получить доступ к 64-разрядным регистрам невозможно).

Режимы же адресации -- это совершенно другое. Применительно к архитектуре IA-32 обычно выделяют следующие режимы адресации:

* неявная (когда все операнды, участвующие в операции, подразумеваются на основе кода самой операции; примеры -- все строковые команды вроде MOVS, STOS и т.д.);
* регистровая (операнд находится в регистре; например, INC EAX);
* косвенная (в регистре находится адрес операнда; например, INC DWORD PTR [EAX] -- как в синтаксисе FASM, я не знаю, поскольку им не пользовался);
* прямая (в команде задан адрес операнда в явном виде; например, INC DWORD PTR 1234h, где 1234h -- этот самый адрес);
* индексная (адресом операнда является сумма нескольких компонентов -- содержимого одного или двух регистров, один из которых может быть отмасштабирован, и отклонения (displacement); например, INC DWORD PTR 1234h [EBX]);
* непосредственная (операндом является заданная в команде константа).

Естественно, когда операндов несколько, для одного из них может использоваться один вид адресации, для второго -- другой (например, MOV AX, 10 -- первый операнд задан регистровой адресацией, второй -- непосредственной).


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 6:19 pm 
Не в сети

Зарегистрирован: Пн июл 12, 2010 7:03 am
Сообщения: 43
SoUrcerer писал(а):
Вообще я советую тебе:
а) Взять книжку по ассемблеру хорошую. Сначала что-то простое (блин, забыл фамилию автора хорошего учебника), потом - Юрова
б) Параллельно с пунктом а скачать эмулятор УМПК-80 (да-да, восьмибитного процессора) и хорошенько разобраться с тем, как вообще работает процессор. Сделать на этом эмуляторе (он с компилятором ассемблера) несколько несложных программ - CRC-16, например.

чесно говоря уже просмотрел 15 мануалов от intel по 860 страниц
различные учебники Калашникова Юрова и т.д.

таким образом пришло понимание

сталкнулся с рядом проблем, пилками в колесе, глючных кодов и т.п.

MASM просто не запускался из-за проектных файлов
TASM заглючил и в конце концов запросил лицензию и окончательно отключился

и остался FASM единственный компиль который работает

дизассемблер поставил с самого начала при чем штук 7
такие перлы они мне выдавали что уму не постежимо

и в конце концов запустил всё таки коды в базовом(BIOS DOS) режиме

и единственные затруднения которые сейчас у меня это

вывод кодировки EOM 866
организация данных в коде и определится с форматом файла
для чего нужен EOM думаю обьеснять не надо

организация данных в коде
к примеру получение информации о VESA режиме
накопал такую структуру
Код:
struc VESAInfoBlock
{
VESASignature     db 'VESA' ;VESA сигнатура
VESAVersion       dw ? ;версия VESA (0100h, 0102h или 0200h)
OemStringPtr      dd ? ;указатель на строку с именем производителя (заканчивается "0")
Capabilities      db 4 dup (?) ;флаги графических возможностей
VideoModePtr      dd ? ;указатель на список видеорежимов
TotalMemory       dw ? ;размер видеопамяти в 64-Кбайт блоках;
OemSoftwareRev    dw? ;номер версии реализации VBE
OemVendorNamePtr  dd? ;указатель на строку с именем поставщика
OemProductNamePtr dd? ;указатель на строку с названием продукта
OemProductRevPtr  dd? ;указатель на строку с версией продукта
Reserved          db 222 dup (?) ;зарезервировано; область расширения блока
OemData           db 256 dup (?) ;область данных для строк производителя
}

и вот как этой структурой пользоваться, директива virtual не помогает

и там ещё много примеров такого типа

с форматом файла савсем ничего не могу понять
в данный момент пользую org 7C00h и компилится файл в формате bin


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 6:36 pm 
SII
Хорошо, не режим а разрядность адресации. Однако:
Цитата:
Например, одна и та же последовательность байтов в 16-разрядном режиме процессора может быть воспринята как команда MOV AX, 10, а в 32- и 64-разрядном -- как MOV EAX, 10. Чтобы в 16-разрядном режиме загрузить регистр EAX, а 32/64-разрядном -- AX, необходимо добавить в эту последовательность байтов префикс изменения размера операнда. Что же касается команды MOV RAX, 10, то для неё необходим префикс REX, который формируется транслятором только для 64-разрядного режима (в 16- и 32-разрядном режимах получить доступ к 64-разрядным регистрам невозможно).

опять таки не из той оперы. Человек рассматривал запись в исходном коде. А насчет твоих слов:
Спойлер: Показать
Код:
use16
;--------------------------------------
align 16
   db 'm_al'
;--------------------------------------
align 16
   mov   al,10   ;B0 0A
;--------------------------------------
align 16
   db 'm_ax'
;--------------------------------------
align 16
   mov   ax,10    ;B8 0A 00
;--------------------------------------
align 16
   db 'meax'
;--------------------------------------
align 16
   mov   eax,10   ;66 B8 0A 00 00 00
;-----------------------------------------------------------------------------
use32
;--------------------------------------
align 16
   db 'm_al'
;--------------------------------------
align 16
   mov   al,10   ;B0 0A
;--------------------------------------
align 16
   db 'm_ax'
;--------------------------------------
align 16
   mov   ax,10   ;66 B8 0A 00
;--------------------------------------
align 16
   db 'meax'
;--------------------------------------
align 16
   mov   eax,10   ;B8 0A 00 00 00
;-----------------------------------------------------------------------------


Вернуться к началу
   
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 6:38 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
org 7с00 - это загрузчик с дискеты вроде бы :)
Мануал от fasm - подробнейшим образом раскрывает особенности fasm как ассемблера, в том числе структуры и прочее.
Но я все же советую для начала не использовать fasm, а попрограммировать на более простом (по сравнению с x86) ассемблере. Скажу по секрету: ты еще не познал дзен.


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 6:42 pm 
scuter
Так не катит?
Код:
align 4
vesa_block VESAInfoBlock
;-----------------------------------------------------------------------------
mov eax, [vesa_block.VESASignature]

или

mov eax, vesa_block.VESASignature
cmp [eax],byte 'V'

и не забываем про нужные include


Вернуться к началу
   
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 7:57 pm 
Не в сети

Зарегистрирован: Пн июл 12, 2010 7:03 am
Сообщения: 43
Mario писал(а):
scuter
Так не катит?
Код:
align 4
vesa_block VESAInfoBlock
;-----------------------------------------------------------------------------
mov eax, [vesa_block.VESASignature]

или

mov eax, vesa_block.VESASignature
cmp [eax],byte 'V'

и не забываем про нужные include

не четно говоря не пробовал
кстати что означает align 4


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 8:02 pm 
Не в сети
Site Founder
Аватара пользователя

Зарегистрирован: Вс авг 08, 2004 8:55 am
Сообщения: 690
scuter писал(а):
к примеру получение информации о VESA режиме
накопал такую структуру
Код:
struc VESAInfoBlock
{
VESASignature     db 'VESA' ;VESA сигнатура
...
}

и вот как этой структурой пользоваться, директива virtual не помогает

Открываем документацию по FASM (кстати, а почему бы было не прочитать её до создания темы?) и видим, что формат объявления структуры немного другой: кто самый внимательный, тот замечает точки в начале имён членов.

Для дальнейшего развития, можно из стандартной поставки FASM посмотреть в файл struct.inc (он есть, кстати, и на SVN в несчётном количестве экземпляров, вместе с кучей примеров его использования).

_________________
in code we trust


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Пт дек 16, 2011 8:42 pm 
mike.dld писал(а):
Открываем документацию по FASM (кстати, а почему бы было не прочитать её до создания темы?) и видим, что формат объявления структуры немного другой: кто самый внимательный, тот замечает точки в начале имён членов.

Для дальнейшего развития, можно из стандартной поставки FASM посмотреть в файл struct.inc (он есть, кстати, и на SVN в несчётном количестве экземпляров, вместе с кучей примеров его использования).

Открываю GDI32.INC и волшебным образом вижу:
Спойлер: Показать
Код:
; GDI32.DLL structures and constants

struct SIZE
  cx dd ?
  cy dd ?
ends

struct BITMAP
  bmType       dd ?
  bmWidth      dd ?
  bmHeight     dd ?
  bmWidthBytes dd ?
  bmPlanes     dw ?
  bmBitsPixel  dw ?
  bmBits       dd ?
ends

struct BITMAPCOREHEADER
  bcSize     dd ?
  bcWidth    dw ?
  bcHeight   dw ?
  bcPlanes   dw ?
  bcBitCount dw ?
ends

...

Что это? Чудо Господне? :wink:

Конечно это без скобок.

З.Ы. Очень рад, что ты оказывается умеешь иногда разговаривать на русском языке не только в личку.


Вернуться к началу
   
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Сб дек 17, 2011 1:28 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 740
scuter писал(а):
кстати что означает align 4

Выравнивание ниже стоящего кода на границу кратную 4 - м байтам. Если ниже стоящий код вдруг начинается с адреса кратного 4 - м, то эта строка ничего не делает. Иначе дописывает нужное число операций nop (которые ничего не делают). Во многих случаях такое выравнивание ускоряет работу программы, потому как процессор быстрее работает с адресами кратными 4 - м.


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Сб дек 17, 2011 7:08 am 
Не в сети

Зарегистрирован: Пн июл 12, 2010 7:03 am
Сообщения: 43
mike.dld писал(а):
Открываем документацию по FASM (кстати, а почему бы было не прочитать её до создания темы?) и видим, что формат объявления структуры немного другой: кто самый внимательный, тот замечает точки в начале имён членов.

Для дальнейшего развития, можно из стандартной поставки FASM посмотреть в файл struct.inc (он есть, кстати, и на SVN в несчётном количестве экземпляров, вместе с кучей примеров его использования).


вот только не надо тыкать носом в документацию,
так обычно делают дибилы (они говорят читай мануал или google в помощ)

если бы там всё было написано нормальным доступным языком, я бы и не спрашивал.


Вернуться к началу
 Заголовок сообщения: Re: ряд вопросов по FASM
СообщениеДобавлено: Сб дек 17, 2011 8:07 am 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
scuter писал(а):
mike.dld писал(а):
Открываем документацию по FASM (кстати, а почему бы было не прочитать её до создания темы?) и видим, что формат объявления структуры немного другой: кто самый внимательный, тот замечает точки в начале имён членов.

Для дальнейшего развития, можно из стандартной поставки FASM посмотреть в файл struct.inc (он есть, кстати, и на SVN в несчётном количестве экземпляров, вместе с кучей примеров его использования).


вот только не надо тыкать носом в документацию,
так обычно делают дибилы (они говорят читай мануал или google в помощ)

если бы там всё было написано нормальным доступным языком, я бы и не спрашивал.


Ты бы не спрашивал, если бы читал. Причем если читал бы литературу в нужном порядке. Если ты первоклассника заставишь читать учебник по квантовой механике, он мало что из этого учебника для себя откроет. Понимаешь, о чем я?
В процессе работы над Колибри у меня тоже возникает немало вопросов. Но, прежде чем задавать вопросы на форуме, я стараюсь всеми силами разобраться самостоятельно: читаю книжки, руководства пользователей, ищу в google, читаю исходный код других программ, где используются подобные решения. Сразу никогда ничего не работает. Одну программу приходится перекомпилировать десятки и сотни раз. Толково заданный вопрос - это уже половина ответа. Факт.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 137 сообщений ]  На страницу 1 2 3 4 510 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB