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

Assembler programming questions
  • Могу посоветовать из свежего, книга "Аблязов Р.З. - Программирование на ассемблере на платформе 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 и ещё что-то используетя.

    Ну вообщем, думай сам.
  • я бы еще добавил довольно неплохой отладчик от OpenWatcom, тоже под ДОС. Отлаживает как ассемблерные программы, так и Сишные.
  • Увидел статью
    Барьеры доступа к памяти в Linux
    Интересно а есть какие либо проблемы доступа памяти в fasm и в Kolibri в частности?
  • Unduing, Колибри рассчитана исключительно на x86, а в x86 аппаратно гарантируется strong memory ordering. За исключением специальных SSE-инструкций типа movnt*. Подробности - в третьем томе мануалов Intel, 8.2 Memory Ordering. На Linux макросы барьеров раскрываются просто в инструкции компилятору, чтобы сам компилятор не переупорядочивал слишком много - что, естественно, неактуально для fasm.
    Сделаем мир лучше!
  • Ясно.
    Т.е. все написанное в статье связано с оптимизацией компилятора и работой ядра.

    А в одноядерном x64 могут возникнуть проблемы?
    Last edited by Unduing on Wed Oct 31, 2012 10:26 am, edited 1 time in total.
  • x86_64 архитектурно очень похож на x86, в том числе в этом месте.

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

    Code: Select all

    mov [eax], ebx
    mov [eax+4], ecx
    
    попадание значения в [eax] не может осуществиться "раньше" попадания значения в [eax+4] ни с какой точки зрения, включая параллельные ядра и процессоры. Но всегда, даже на насквозь однопроцессорной машине, возможно переключение потоков именно в момент времени между приведёнными двумя инструкциями, и новый поток может сильно удивиться, увидев несогласованные значения в [eax] и [eax+4].
    Сделаем мир лучше!
  • Начал разбираться с работой с ini используя библиотеку libini. За основу взял ассамблерную версию job (сорци для удобства прилагаются). Кое с чем уже разобрался, непойму только как вывести данные из структуры на экран, в этом собственно и вопрос.
    Attachments
    JOB.7z (9.84 KiB)
    Downloaded 200 times
    to infinity and beyond
  • Структура виртуальная.
    Считаем количество джобов, указанное в файле и выделяем необходимый размер памяти
    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, ... ?
  • Who is online

    Users browsing this forum: No registered users and 1 guest