Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 30.07.2020
Сообщений: 15
FASM

Не работает программа

02.04.2022, 19:49. Показов 3071. Ответов 18
Метки asm, fasm (Все метки)

Студворк — интернет-сервис помощи студентам
Только начал изучать assembler(FASM). Решил написать программу из учебника, но она не заработала. Как можно решить проблему? Может я что-то делаю не так?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
format PE Console 
entry start 
; Сохраняем информацию
section '.data' data readable writeable
    hello db 'Hello, FASM!',0
; Выполняем код
section '.program' code readable writeable executable
start:
    mov ah, 9
    mov dx, offset hello
    int 21h
    int 20h
end start
Ошибка:
Assembler
1
2
processed: mov dx,offset hello
error: extra characters on line.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2022, 19:49
Ответы с готовыми решениями:

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

Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает
почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает. Имею в ввиду что сделал прогу которая меняет...

не пойму в чем дело, программа должна работать, но она черт побери не работает :( (программа по работе с реестром)
Программа предназначена для поиска какого-нить слова по реестру и удаления ключа или раздела если в нем встречается искомое слово. С...

18
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
02.04.2022, 20:17
Есть несколько операционных систем, есть несколько режимов работы процессора (16, 32, 64), есть несколько форматов исполняемых файлов, есть несколько компиляторов ассемблера со своим уникальным синтаксисом. Путать и смешивать нельзя - в неправильном сочетании работать не будет.

Для какой операционной системы пишите программу?
0
0 / 0 / 0
Регистрация: 30.07.2020
Сообщений: 15
02.04.2022, 20:27  [ТС]
Пишу на windows 10.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
02.04.2022, 21:16
Для Windows x64 пример программы на FASM будет следующим
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
format  PE64    console
entry start
 
include 'win64ax.inc'
 
section '.data' data readable writeable
        iFirst          dq      1234560
        iSecond         dq      987654
 
section '.const' readable
        aszFmt          db      "Сумма: %d + %d", 0Dh, 0Ah
                        db      "в результате: %d", 0
        aszMsgBoxTitle  db      "MessageBox title", 0
 
section '.bss' readable writeable
        buffer          db      1024 dup (?)
        iResult         dq      ?
 
section '.text' code readable executable
start:
        sub     rsp,    28h
        mov     rbp,    rsp
 
        ;вычисление
        mov     rax,    [iFirst]
        add     rax,    [iSecond]
        mov     [iResult],      rax
 
        ;вывод результата
        lea     rcx,    [buffer]
        lea     rdx,    [aszFmt]
        mov     r8,     [iFirst]
        mov     r9,     [iSecond]
        mov     rax,    [iResult]
        mov     [rsp+20h],      rax
        call    [wsprintfA]
 
        xor     ecx,    ecx
        lea     rdx,    [buffer]
        lea     r8,     [aszMsgBoxTitle]
        mov     r9d,    MB_ICONINFORMATION
        call    [MessageBoxA]
        ;завершение программы
        xor     ecx,    ecx
        call    [ExitProcess]
 
 
section '.idata' import data readable writeable
 
  dd 0,0,0,RVA kernel_name,RVA kernel_table
  dd 0,0,0,RVA user_name,RVA user_table
  dd 0,0,0,0,0
 
  kernel_table:
    ExitProcess dq      RVA _ExitProcess
    dq 0
  user_table:
    MessageBoxA dq      RVA _MessageBoxA
    wsprintfA   dq      RVA _wsprintfA
    dq 0
 
  kernel_name   db      'KERNEL32.DLL', 0
  user_name     db      'USER32.DLL', 0
 
  _ExitProcess  dw      0
                db      'ExitProcess', 0
  _MessageBoxA  dw      0
                db      'MessageBoxA', 0
  _wsprintfA    dw      0
                db      'wsprintfA', 0
Видны обращения к функциям операционной системы для вывода на экран, завершения программы, преобразования чисел в строку.
Соглашение о вызове (передаче параметров):
https://docs.microsoft.com/ru-... w=msvc-160
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
02.04.2022, 22:41
sh1Fr,
проверьте не включена ли кириллица в данную строку.
перепишите на латинице еще раз.


ФедосеевПавел, прерывания же досовские.

Добавлено через 1 минуту
Цитата Сообщение от sh1Fr Посмотреть сообщение
Решил написать программу из учебника, но она не заработала
скопипастил похоже из e-учебника, я так думаю
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
02.04.2022, 22:59
Исходник топикстартера жутчайшая смесь кода для DOS и формата исполняемого файла для Windows i386 (32 разряда). Она не будет работать.

Если нужна программа для DOS, то потребуется эмулятор DOS или виртуальная машина с DOS.
Значит это должно быть в учебнике.

Да и голова у топикстартера будет быстрее работать, когда поймёт, что удачная компиляция и выполнение программы, написанной на ассемблере, зависит от:
- режима процессора (16/32/64, Real/Protect mode)
- операционной системы
- названия компилятора
- формата исполняемого файла и соответственно состава и структуры исходника

Формально, мой исходник скомпилируется и выполнится из IDE FASM.

Перед публикацией кода я уточнил целевую операционку.
0
6 / 6 / 5
Регистрация: 21.10.2021
Сообщений: 31
02.04.2022, 23:12
В диалекте FASM нету offset.
2
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
02.04.2022, 23:55
RatOSER,
и в самом деле
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.04.2022, 00:35
И программа для DOS, которую нужно запускать через DOSBox имеет формат MZ
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
format  MZ                      ;Исполняемый файл DOS EXE (MZ EXE)
entry   code_seg:start          ;Точка входа в программу
;--------------------------------------------------------------------
stack   200h                ;Размер стека
;--------------------------------------------------------------------
segment data_seg                ;Cегмент данных
    CrLf        db  0Dh, 0Ah, '$'   ;перевод строки
    msgPressAnyKey  db  0Dh, 0Ah, 'Press any key to exit...', '$'
;--------------------------------------------------------------------
segment code_seg                ;Сегмент кода
start:                              ;Точка входа в программу
    mov     ax, data_seg        ;Инициализация регистра DS
    mov     ds, ax
 
    mov     ah, 09h
    mov     dx, msgPressAnyKey
    int     21h
    mov ah, 0
    int 16h
 
    mov     ax, 4C00h
    int     21h                 ;Завершение программы
Если же программа для DOS формата com, то
Assembler
1
2
3
4
5
6
7
8
9
10
use16                           ;Генерировать 16-битный код
org 100h                        ;Программа начинается с адреса 100h
 
    mov     dx, hello       ;В DX адрес строки.
    mov     ah, 9           ;Номер функции DOS.
    int     21h                 ;Обращение к функции DOS.
 
    int     20h                 ;Завершение программы
;-------------------------------------------------------
hello db 'Hello, world!$'
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
03.04.2022, 07:29
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Для Windows x64 пример программы на FASM будет следующим
1. Зачем размазывать данные по трём секциям data\const\bss с одинаковыми атрибутами?
2. format console + MessageBox() - отличное решение!
3. call используют только не оторвавшиеся от досовской сиськи ламеры - для этого есть invoke.
4. Если уж воткнул в шапку инклуд win64ax.inc, то потрудись заглянуть в его содержимое.
5. Что за оформление секции-импорта? Всю эту шнягу заменяет всего один макрос .end start.

В общем - полное витание в облаках, но в тему залезть обязательно нужно.

sh1Fr, вот типичный пример вывода текста и числа 102345 в виндовое окно MessageBox(). Вторая функция wsprintf() переводит число в строку, и записывает результат в буфер секции-данных. Инклуд "win32ax.inc" позволяет задавать укороченные директивы типа .data, а так-же использовать макрос .end, чтобы одной строчкой оформить всю секцию импорта функций, из системных библиотек DLL:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
format   pe gui
include 'win32ax.inc'
;------
.data
buff    db   0
;------
.code
start:  invoke  MessageBox,0,<'Hello World!',0>,<'Заголовок',0>,0
        invoke  wsprintf,buff,<'Dec: %d',10,\
                               'Hex: %Xh',0>,\
                                102345,102345
        invoke  MessageBox,0,buff,<'Конвертер',0>,0
 
        invoke  ExitProcess,0
.end start
2
0 / 0 / 0
Регистрация: 30.07.2020
Сообщений: 15
03.04.2022, 10:10  [ТС]
Спасибо, работает. Только остался один вопрос. При компилировании мне выходит такая ошибка:
Assembler
1
2
3
flat assembler  version 1.73.30  (1048576 kilobytes memory)
4 passes, 2048 bytes.
Ok!
Это критично?
0
6 / 6 / 5
Регистрация: 21.10.2021
Сообщений: 31
03.04.2022, 10:12
Ошибки нет, все нормально скомпилировалась
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
03.04.2022, 10:27
Цитата Сообщение от sh1Fr Посмотреть сообщение
Это критично?
Это досовская версия компилятора FASM.EXE сообщает, что всё ОК!
Вам нужно использовать из той-же папки файл FASMW.EXE для виндовс,
и скопировав в его окно исходник, нажать клавишу F9.
2
0 / 0 / 0
Регистрация: 30.07.2020
Сообщений: 15
03.04.2022, 10:29  [ТС]
Всё понял, спасибо
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.04.2022, 12:36
Цитата Сообщение от R71MT Посмотреть сообщение
1. Зачем размазывать данные по трём секциям data\const\bss с одинаковыми атрибутами?
Атрибуты разные, можно убедиться.
Сейчас не найду это соглашение, но его смысл следующий - в data инициализированные данные, в bss неинициализированные (они не влияют на размер исходника, секция формируется операционкой при запуске программы), в const содержатся неизменяемые данные типа строк (это элемент защиты целостности программы).
И если новичок узнает о таких секциях - разве хуже?
Видел, что вы сваливаете всё в один сегмент данных, у студентов видел даже вариант сваливания в сегмент кода - так тоже можно для достижения некоторых целей.
Приведите свой пример и поясните различия, какие ошибки или неточности устранены тем или иным способом.

Цитата Сообщение от R71MT Посмотреть сообщение
2. format console + MessageBox() - отличное решение!
Тут недоглядел. Можно было бы и
Assembler
1
format  PE64    GUI
ошибкой это не является, только небрежностью.
Различие проявляется в создании (console) или отсутствии (GUI) консольного окна при запуске программы.
Для консольной программы можно использовать связку wsprintf+WriteConsole (WriteFile) или printf.
Для демонстрации различий между DOS и Windows программами я решил вывод осуществить во всплывающее окно.

Да, признаю, что в данном случае использование формата консольной программы - небрежность.

Цитата Сообщение от R71MT Посмотреть сообщение
4. Если уж воткнул в шапку инклуд win64ax.inc, то потрудись заглянуть в его содержимое.
Какой-то бред несёте. Если есть замечания - перечисляйте вместе со способами решения.

Цитата Сообщение от R71MT Посмотреть сообщение
5. Что за оформление секции-импорта? Всю эту шнягу заменяет всего один макрос .end start.
Да вы что, не знаете, что в однобортном сейчас уже никто не воюет?

Виноват! Не уследил! Исправлюсь!

По поводу использования макросов для сокращения и объявления строк из секции кода - иногда удобно, иногда не удобно. В данной ситуации я счёл необходимым показать "потроха" обращения к операционке, наиболее интересный момент при вызове wsprintf - количество параметров превышает количество регистров и параметры необходимо размещать в стеке.

Мой исходник содержит ошибку - обратно не освобождаю фрейм стека. И балансирую на грани разрушения содержимого стека. Этого можно было бы избежать, применяя макрос frame, но у меня не разработка на скорость набора, поэтому все манипуляции со стеком наглядно показаны.

Просмотрите ещё раз собственный пример. Как понимаю - это заготовка для последующего изучения отказа в доступе к памяти.
Assembler
4
5
.data
buff    db   0
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
03.04.2022, 14:08
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Сейчас не найду это соглашение,
Здесь уместна лишь .data, а остальные-то зачем?

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
это элемент защиты целостности программы
За защиту целостности в Windows отвечает механизм "Integrity Control", и это совсем из другой оперы.

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Какой-то бред несёте. Если есть замечания - перечисляйте вместе со способами решения.
Тогда зачем ты вообще подключил этот инклуд, если не знаешь его назначение?

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
В данной ситуации я счёл необходимым показать "потроха" обращения к операционке,
Для начинающих понятен минимальный пример, а не километровые портянки - потроха он изучит потом сам.

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Как понимаю - это заготовка для последующего изучения отказа в доступе к памяти.
В данном случае, отказ в доступе к памяти ты получишь по истечении 4Кб пространства,
т.к. именно такого мин.размера в дефолте выделяется секция. То-есть эта комбинация резервирует 4К-буфер. Открыл-бы хоть отладчик, и посмотрел.
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.04.2022, 15:01
Все замечания по поводу .data, буфера нулевой длины, макросов invoke, определения строк из сегмента кода - чистой воды вкусовщина.

Буфер нулевой длины - это ошибка, т.к. новички будут копировать код, не зная о неявном правиле Windows, и располагать следом за буфером другие переменные. Мне уже несколько раз в прошлом семестре попадались такие исходники. Я всё гадал, кто же способствует распространению. Тогда уж добавляйте комментарии, что используете хак.
Кстати, использовали бы секцию bss и трюк бы не понадобился.
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
03.04.2022, 15:17
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
чистой воды вкусовщина
угу.. скажи это разрабу фасма,
который ночами пилил для тебя эти макросы, а ты даже не подозреваешь об их присутствии.
продолжай в том-же духе..
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.04.2022, 16:24
Почему, же... Знаю. Но не использую, т.к. после макросов проблематичен перенос на другой компилятор.

Секции data, const, bss использую сознательно.
Макрос invoke для x64 имеется только у FASM, у MASM64 он реализован не компилятором, как раньше, а тоже макросом из включаемого файла, и не все реализации удачны, всё зависит от включаемого файла. Т.е. для x64 много удобнее не использовать его совсем.
Анонимные метки @@:, @f, @b - использую.
В режиме x64 не использую макрос frame{} - опять же, из-за его отсутствия в MASM64.
Секцию импорта использую по инерции, можно избавиться от неё, но пока не мешает. Хотя знакомство с ней, помогло недавно подключить какую-то нештатную динамическую библиотеку. Если на форуме будут рабочие примеры с секцией импорта - хуже не станет.
Могу перейти на code/data/const/bss/end - это непринципиально.
Макрос proc - использовал бы, но размеры программ малы.

Пожалуй и всё - из часто употребимого нечего больше перечислить.

Предлагаю, в темах для FASM публиковать по два варианта решения - моё (с базовым синтаксисом) и ваше (с синтаксисом, расширенном макросами). Так будет нагляднее видны различия и достоинства применения наработок во включаемых файлах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2022, 16:24
Помогаю со студенческими работами здесь

Программа работает, но частично (косяк с вводом строк и не работает определение принадлежности элемента списка)
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; class Node { public: char* rayon; Node* next; ...

Программа работает на Delphi 2007 или более ранней но не работает на старших версиях (10.1 например)
В программе используются дополнительные файлы и dll написанные на fortran их кода нет ;( в ранних вернсиях все хорошо, в старшей 10.1 или...

Почему программа работает с английскими буквами и не работает с русскими?
Здравствуйте! Столкнулся с такой проблемой: нужно сравнить две буквы слова, которое в файле записано русскими буквами. Считал, все...

После AVZ не работает программа Credo Межевой план автоматически закрывается и не работает цифровая подпись
После AVZ не работает программа Credo Межевой план автоматически закрывается и не работает цифровая подпись. Помогите пожалуйста!

Программа не работает правильно. Программа должна брать значения из файла Avto_a.accdb из третьих столбцов таблицы TOYOT
Программа не работает правильно. Программа должна брать значения из файла Avto_a.accdb из третьих столбцов таблицы TOYOTA_95_TS18.csv,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru