Page 3 of 10

Re: ряд вопросов по FASM

Posted: Tue Dec 20, 2011 1:16 am
by Mario
В общем объясняя на пальцах - найди и скопируй файл struct.inc в директорию со своим файлом, который ты компилируешь.

Re: ряд вопросов по FASM

Posted: Thu Mar 22, 2012 2:09 pm
by Стас
Могу посоветовать из свежего, книга "Аблязов Р.З. - Программирование на ассемблере на платформе x86-64 - 2011". Там и учебник фасма и разбор использования апика с его 24 и более аппаратными прерываниями и разбор работы с несколькими процами. Я перевёл пример на загрузчик с комавского, было интересно.

Posted: Sun Jun 24, 2012 12:35 am
by punk_joker
Дабы не создавать еще одну тему, спрошу сдесь. В общем я недавно только начал изучать FASM. Следую урокам и изучая основы пишу пока что 16-битные програмки под DOS. Когда дошел до мат. операций, возник такой вопрос, как узнать значение переменной в результате определенных вычислений? Т.е как понять, что программа работает именно так как нужно. Имеется Turbo Debugger.

Re:

Posted: Sun Jun 24, 2012 4:47 am
by Rock_maniak_forever
punk_joker wrote:Когда дошел до мат. операций, возник такой вопрос, как узнать значение переменной в результате определенных вычислений? Т.е как понять, что программа работает именно так как нужно. Имеется Turbo Debugger.
Ну я лично, знаю только три способа:
1. Отладка в голове.
2. Отладка в отладчике (получая дамп памяти с переменной(ными)).
3. Если проверить работу программы первыми двумя способами невозможно или неудобно, то можно сделать проверку результата, кодом индикатором (также, как делается в радиоэлектронике или химии).

P.S. Для отладки в отладчике, есть очень полезная команда int3, кторая помогает сделать остановку выполнения кода, на заданном участке. Напиши её в исходнике, откампилируй программу, запусти отладчик и нажми g. Команда выполнится, ровно до того участка кода, где находится команда int3.

Posted: Sun Jun 24, 2012 9:57 pm
by punk_joker
Rock_maniak_forever, насчет второго способа, можно подробней?

Re: ряд вопросов по FASM

Posted: Sun Jun 24, 2012 11:00 pm
by SoUrcerer
А это уже вопрос по turbo debugger. Скорее всего, он описан в справке и многочисленных учебниках. Turbo debugger - далеко не единственный отладчик, кстати сказать.

Posted: Sun Jun 24, 2012 11:06 pm
by punk_joker
SoUrcerer, чтож, порыскаю в нете. У меня есть еще OllyDbg, но он не хочет работать с досовскими 16-биными программами.

Re: ряд вопросов по FASM

Posted: Mon Jun 25, 2012 1:21 am
by Rock_maniak_forever
Оладчиков под 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 и ещё что-то используетя.

Ну вообщем, думай сам.

Re: ряд вопросов по FASM

Posted: Mon Jun 25, 2012 8:20 am
by XVilka
я бы еще добавил довольно неплохой отладчик от OpenWatcom, тоже под ДОС. Отлаживает как ассемблерные программы, так и Сишные.

Re: ряд вопросов по FASM

Posted: Tue Oct 30, 2012 3:13 pm
by Unduing
Увидел статью
Барьеры доступа к памяти в Linux
Интересно а есть какие либо проблемы доступа памяти в fasm и в Kolibri в частности?

Re: ряд вопросов по FASM

Posted: Tue Oct 30, 2012 5:23 pm
by CleverMouse
Unduing, Колибри рассчитана исключительно на x86, а в x86 аппаратно гарантируется strong memory ordering. За исключением специальных SSE-инструкций типа movnt*. Подробности - в третьем томе мануалов Intel, 8.2 Memory Ordering. На Linux макросы барьеров раскрываются просто в инструкции компилятору, чтобы сам компилятор не переупорядочивал слишком много - что, естественно, неактуально для fasm.

Re: ряд вопросов по FASM

Posted: Tue Oct 30, 2012 5:51 pm
by Unduing
Ясно.
Т.е. все написанное в статье связано с оптимизацией компилятора и работой ядра.

А в одноядерном x64 могут возникнуть проблемы?

Re: ряд вопросов по FASM

Posted: Tue Oct 30, 2012 8:06 pm
by CleverMouse
x86_64 архитектурно очень похож на x86, в том числе в этом месте.

Проблемы могут возникнуть везде и всегда. Strong memory ordering гарантирует, например, что в коде

Code: Select all

mov [eax], ebx
mov [eax+4], ecx
попадание значения в [eax] не может осуществиться "раньше" попадания значения в [eax+4] ни с какой точки зрения, включая параллельные ядра и процессоры. Но всегда, даже на насквозь однопроцессорной машине, возможно переключение потоков именно в момент времени между приведёнными двумя инструкциями, и новый поток может сильно удивиться, увидев несогласованные значения в [eax] и [eax+4].

Re: ряд вопросов по FASM

Posted: Thu Jul 11, 2013 3:10 pm
by punk_joker
Начал разбираться с работой с ini используя библиотеку libini. За основу взял ассамблерную версию job (сорци для удобства прилагаются). Кое с чем уже разобрался, непойму только как вывести данные из структуры на экран, в этом собственно и вопрос.

Re: ряд вопросов по FASM

Posted: Thu Jul 11, 2013 7:28 pm
by Asper
Структура виртуальная.
Считаем количество джобов, указанное в файле и выделяем необходимый размер памяти
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
А потом забиваем выделенную память данными джобов, прочитанными из файла. Каждый проход по циклу, это один элемент типа JOB в памяти.
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, указывает на массив элементов типа JOB.
Соответственно выводить данные ты можешь либо непосредственно в цикле загрузки джобов в память, либо после загрузки адресуясь через указатель Jobs.
punk_joker wrote:Кое с чем уже разобрался, непойму только как вывести данные из структуры на экран, в этом собственно и вопрос.
На экран куда? У программы своего окна нет. board, @notify, ... ?