ряд вопросов по FASM
-
В общем объясняя на пальцах - найди и скопируй файл struct.inc в директорию со своим файлом, который ты компилируешь.
Могу посоветовать из свежего, книга "Аблязов Р.З. - Программирование на ассемблере на платформе x86-64 - 2011". Там и учебник фасма и разбор использования апика с его 24 и более аппаратными прерываниями и разбор работы с несколькими процами. Я перевёл пример на загрузчик с комавского, было интересно.
Дабы не создавать еще одну тему, спрошу сдесь. В общем я недавно только начал изучать FASM. Следую урокам и изучая основы пишу пока что 16-битные програмки под DOS. Когда дошел до мат. операций, возник такой вопрос, как узнать значение переменной в результате определенных вычислений? Т.е как понять, что программа работает именно так как нужно. Имеется Turbo Debugger.
to infinity and beyond
Ну я лично, знаю только три способа:punk_joker wrote:Когда дошел до мат. операций, возник такой вопрос, как узнать значение переменной в результате определенных вычислений? Т.е как понять, что программа работает именно так как нужно. Имеется Turbo Debugger.
1. Отладка в голове.
2. Отладка в отладчике (получая дамп памяти с переменной(ными)).
3. Если проверить работу программы первыми двумя способами невозможно или неудобно, то можно сделать проверку результата, кодом индикатором (также, как делается в радиоэлектронике или химии).
P.S. Для отладки в отладчике, есть очень полезная команда int3, кторая помогает сделать остановку выполнения кода, на заданном участке. Напиши её в исходнике, откампилируй программу, запусти отладчик и нажми g. Команда выполнится, ровно до того участка кода, где находится команда int3.
Rock_maniak_forever, насчет второго способа, можно подробней?
to infinity and beyond
А это уже вопрос по turbo debugger. Скорее всего, он описан в справке и многочисленных учебниках. Turbo debugger - далеко не единственный отладчик, кстати сказать.
SoUrcerer, чтож, порыскаю в нете. У меня есть еще OllyDbg, но он не хочет работать с досовскими 16-биными программами.
to infinity and beyond
Оладчиков под DOS, существует не мало.
1. Debug (находится в Wind'е) (самый простой, без наворотов) (документирован лучше, чем остальные отладчики).
2. AFD Pro (Advanced Fullscreen Debug Pro) (считается лучшим под DOS, но его описания, я нигде не встречал).
3. CodeView (Очень тяжёлый ИМХО).
4. Turbo Debugger (тоже очень тяжёлый ИМХО).
5. Emu8086 (компилятор и отладчик, одновременно, но имеет свой синтаксис) (довольно интересная прога, но всё описание на Английском).
Советую начать с Debug'а, так как по программированию с его использованием, есть куча статей, с великолепным описанием, ИМХО.
Например (там всё подробно описано):
a) Сам себе компилятор (или руководство по мазохизму для дзенствующих)
b) Введение в машинный код.
c) DZebug: руководство юZверя.
d) Программирование на Ассемблере под DOS.
Правда, Debug немного неудобный, но - тяжело в учении, легко в бою. Я сам с него начинал.
Ну, а если ты всё таки хочешь использовать TD, то тебе сюда.
Да, чуть не забыл, есть ещё Калашников, там в уроках, CodeView и ещё что-то используетя.
Ну вообщем, думай сам.
1. Debug (находится в Wind'е) (самый простой, без наворотов) (документирован лучше, чем остальные отладчики).
2. AFD Pro (Advanced Fullscreen Debug Pro) (считается лучшим под DOS, но его описания, я нигде не встречал).
3. CodeView (Очень тяжёлый ИМХО).
4. Turbo Debugger (тоже очень тяжёлый ИМХО).
5. Emu8086 (компилятор и отладчик, одновременно, но имеет свой синтаксис) (довольно интересная прога, но всё описание на Английском).
Советую начать с Debug'а, так как по программированию с его использованием, есть куча статей, с великолепным описанием, ИМХО.
Например (там всё подробно описано):
a) Сам себе компилятор (или руководство по мазохизму для дзенствующих)
b) Введение в машинный код.
c) DZebug: руководство юZверя.
d) Программирование на Ассемблере под DOS.
Правда, Debug немного неудобный, но - тяжело в учении, легко в бою. Я сам с него начинал.
Ну, а если ты всё таки хочешь использовать TD, то тебе сюда.
Да, чуть не забыл, есть ещё Калашников, там в уроках, CodeView и ещё что-то используетя.
Ну вообщем, думай сам.
я бы еще добавил довольно неплохой отладчик от OpenWatcom, тоже под ДОС. Отлаживает как ассемблерные программы, так и Сишные.
Увидел статью
Барьеры доступа к памяти в Linux
Интересно а есть какие либо проблемы доступа памяти в fasm и в Kolibri в частности?
Барьеры доступа к памяти в Linux
Интересно а есть какие либо проблемы доступа памяти в fasm и в Kolibri в частности?
Unduing, Колибри рассчитана исключительно на x86, а в x86 аппаратно гарантируется strong memory ordering. За исключением специальных SSE-инструкций типа movnt*. Подробности - в третьем томе мануалов Intel, 8.2 Memory Ordering. На Linux макросы барьеров раскрываются просто в инструкции компилятору, чтобы сам компилятор не переупорядочивал слишком много - что, естественно, неактуально для fasm.
Сделаем мир лучше!
Ясно.
Т.е. все написанное в статье связано с оптимизацией компилятора и работой ядра.
А в одноядерном x64 могут возникнуть проблемы?
Т.е. все написанное в статье связано с оптимизацией компилятора и работой ядра.
А в одноядерном x64 могут возникнуть проблемы?
Last edited by Unduing on Wed Oct 31, 2012 10:26 am, edited 1 time in total.
x86_64 архитектурно очень похож на x86, в том числе в этом месте.
Проблемы могут возникнуть везде и всегда. Strong memory ordering гарантирует, например, что в коде
попадание значения в [eax] не может осуществиться "раньше" попадания значения в [eax+4] ни с какой точки зрения, включая параллельные ядра и процессоры. Но всегда, даже на насквозь однопроцессорной машине, возможно переключение потоков именно в момент времени между приведёнными двумя инструкциями, и новый поток может сильно удивиться, увидев несогласованные значения в [eax] и [eax+4].
Проблемы могут возникнуть везде и всегда. Strong memory ordering гарантирует, например, что в коде
Code: Select all
mov [eax], ebx
mov [eax+4], ecx
Сделаем мир лучше!
Начал разбираться с работой с ini используя библиотеку libini. За основу взял ассамблерную версию job (сорци для удобства прилагаются). Кое с чем уже разобрался, непойму только как вывести данные из структуры на экран, в этом собственно и вопрос.
- Attachments
-
-
JOB.7z (9.84 KiB)Downloaded 203 times
-
to infinity and beyond
Структура виртуальная.
Считаем количество джобов, указанное в файле и выделяем необходимый размер памяти
А потом забиваем выделенную память данными джобов, прочитанными из файла. Каждый проход по циклу, это один элемент типа JOB в памяти.
В итоге указатель Jobs, указывает на массив элементов типа JOB.
Соответственно выводить данные ты можешь либо непосредственно в цикле загрузки джобов в память, либо после загрузки адресуясь через указатель Jobs.
Считаем количество джобов, указанное в файле и выделяем необходимый размер памяти
Spoiler:
Code: Select all
; Get jobs number
invoke ini_get_int, ini_path, aMain, aJobsNum, 0
;and eax, 0xFF
test al, al
jz close_app
mov [jobs_num], al
imul eax, JOB.sizeof
mcall 68, 12, eax ; Get memory for Jobs
mov [Jobs], eax
Spoiler:
Code: Select all
mov edi, [Jobs]
movzx ecx, byte [jobs_num]
.get_next_job:
movzx eax, byte [jobs_num]
sub eax, ecx
call set_job_section_name
push ecx
; Clear done flag
xor al, al
stosb
; Get job TimeH
invoke ini_get_int, ini_path, aJob, aTimeH, -1
cmp eax, -1
je .out1
stosb
; Get job TimeM
invoke ini_get_int, ini_path, aJob, aTimeM, 0
stosb
; Get job application path and param
invoke ini_get_str, ini_path, aJob, aApp, edi, PATH_MAX_CHARS, 0
add edi, PATH_MAX_CHARS
invoke ini_get_str, ini_path, aJob, aParam, edi, PATH_MAX_CHARS, 0
add edi, PATH_MAX_CHARS
pop ecx
dec ecx
test ecx, ecx
jnz .get_next_job
ret
.out1:
pop ecx
sub [jobs_num], cl
ret
Соответственно выводить данные ты можешь либо непосредственно в цикле загрузки джобов в память, либо после загрузки адресуясь через указатель Jobs.
На экран куда? У программы своего окна нет. board, @notify, ... ?punk_joker wrote:Кое с чем уже разобрался, непойму только как вывести данные из структуры на экран, в этом собственно и вопрос.
Who is online
Users browsing this forum: No registered users and 0 guests