Не запускается программа на ассемблере

Выпуск № 633
от 18.12.2006, 20:05

Администратор: Калашников О.А.
В рассылке: Подписчиков: 372, Экспертов: 30
В номере: Вопросов: 1, Ответов: 2

Вопрос № 66705: Здравствуйте …Есть вопросы о самом начале изучения ассемблера (точнее: относительно ассемблирования программы и ПО с эти связанным). Может эти вопросы покажутся «детскими», но помогите, пожалуйста, разобраться. Просмотрев несколько учебн.

«текст.редактор — MASM — линковщик — готовая программа» — так и есть.
*.АSМ-файлы можно писать в любом текстовом редакторе, который не добавляет дополнительных символов форматирования. Затем запускаем ассемблер и передаём ему в командной строке название *.asm-файла (файлов), управляющие параметры, а он выдаёт *.obj-файл.
*.obj-файл — это объектный файл, в нём мнемокоды заменены уже на бинарный код, а имена и метки ещё не заменены, они остаются в текстовом виде.

ВИРУС на Ассемблере | Как программно отключить монитор?


Затем запускаем линковщик, передаём ему полученный *.obj-файл и если нужно *.lib-файлы, линковщик из них создаёт *.exe, *.com или *.dll -файлы.
Линковщик смотрит на текстовые имена, оставшиеся в *.obj-файлах. Например, объявлена функция func1, но её кода не было в asm-файле, её код находится в *.lib-файле. Линковщик записывает весь код (и главную программу, и функцию) в исполняемый файл, причём вместо текстовых имён функций и переменных подставляет их реальные адреса, по которым они находятся в исполняемом файле. (поэтому линковщик ещё называют редактором связей — он приводит в порядок связи между переменными и функциями в разных объектных модулях.
Если редактор интегрированный, то при нажатии определённой кнопки (ну предположим F9) он сам запускает ассемблер и линковщик, сам передаёт им нужные параметры, и может даже запускать полученные исполняемые файлы.
программа ML может сама вызывать линковщика, т.е. мы задаём ей файл, она его ассемблирует и запускает линковщик с нужными параметрами, и в итоге мы получаем выполняемый файл.

Лично я делают так: пишу текст в редакторе rpad32 или notepad++ (с подсветкой синтаксиса), сохраняю, потом запускаю файл build.bat («вручную», кликнув на нём мышью), в котором записано что-то вроде:
cd c:masmprog
c:masminml.exe c:masmprogprog.asm /zi
c:masminlink.exe c:masmprogprog.obj
для каждой программы свой bat-файл (build_win.bat, build_plan.bat, . )
Не самое удобное решение, но меня устраивает.

Читайте также:
Как перезапустить программу на ПК

Источник: subscribe.ru

Не запускается программа на ассемблере

Здравствуйте, я пытаюсь создать консольное приложение на ASM для windows. MASM32 откомпилировал и отлинковал мой ASM код без единой ошибки. Но EXE зависает. При проходе EXE в OllyDBG видно, что в main вход нормальный, но при первом (и всех последующих) call-s СИ-функций (FOPEN, FSCANF, FPRINTF, MALLOC) при call происходит переход за пределы памяти программы и OllyDBG зависает на первом же call.

#1 Первая программа на ассемблере MASM

Не пойму, как справится с этой ошибкой — ведь линк прошел без единого сообщения об ошибке. Все внешние ссылки были разрешены ОК. Посмотрите, пожалуйста, мои ASM, OBJ,EXE в облаке по адресу https://drive.google.com/drive/folde. i?usp=sharingh Заранее спасибо!

Регистрация: 15.02.2010
Сообщений: 15,416

1. А зачем вы выкладываете листинг сгенерированный С/С++ компилятором вместо исходника? При этом выдавая его за свой код?

2. Линк без ошибок не говорит, что программа корректна и зкогда-нибудь завершится. Невыделенная память, выход за границы, вечные циклы и блокировки и т.д.

Регистрация: 20.03.2018
Сообщений: 9

Я не совсем еще пока разбираюсь в АСМ — поэтому сначала написал код на СИ и получил сгенерированный код на АСМ. В чем моя вина? Кстати, исходный СИ код идет абсолютно без ошибок в Microsoft Visual Studio 2017 — так почему сгенерированный им ассемблер не идет? Я пробовал определить внешние функции СИ как: EXTRN C (имя):FAR — не помогло.

Линкер создает точно одинаковый EXE, как бы не определять эти СИ функции. А вы что — видите какие-то ошибки в асм коде? Их там не может быть, потому что эквивалентная ему СИ прг идет без ошибок.

Регистрация: 20.03.2018
Сообщений: 9

Я вам конкретно могу сказать — где ошибка — но она не моя и не ошибка АСМ кода — это ошибка скорее всего линка. Вы это можете видеть на скриншоте OllyDBG. В месте, где идет call FOPEN = call DWORD PTR DS:[401036] ( это по IP=00401773) если выполнить этот call, то происходит переход на адрес 202425FF — что вне пределов исходной программы. Как это исправить?

Читайте также:
Как подключиться от компьютера к компьютеру в помощью какой программы

Регистрация: 15.02.2010
Сообщений: 15,416

Вы не указали соглашения о вызовах, вы неправильно определили указатели и вызовы функций (нафига вы это делали раз у вас есть инклуды и либы с масм32 я так и не понял), и т.д.

если выполнить этот call, то происходит переход на адрес 202425FF — что вне пределов исходной программы.

А если вызвать что-то из ntdll то там вообще адрес будет страшный.

Как это исправить?

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

Возьмите ваш исходник на С и прям по нему пишите вызовы на асм. масм32 достаточно высокоуровневый, чтобы такой простейший код мало отличался от С.

Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,419
я пытаюсь создать консольное приложение на ASM для windows.

..а что вообще должна делать-то программа?
сгенерированый сишным компилем ASM не будет работать. Его надо править.

Нашедшего выход — затаптывают первым..
Регистрация: 20.03.2018
Сообщений: 9

..а что вообще должна делать-то программа?
сгенерированый сишным компилем ASM не будет работать. Его надо править.

посмотрите по ссылке https://drive.google.com/drive/folde. Xi?usp=sharing все исходные коды, в том числе CPP исх. код, из которого MSVS C++ сгенерировал АСМ код. А почему сгенерированный MSVS C++ код нерабочий? Если так, то всю компанию микрософт надо уволить. Ведь любой СИ компилятор транслирует через ассемблер ( а как же иначе?) — ведь надо в машинные команды все перевести.

При проходе СИ в дизассемблере отладчика MSVS 2017 — сгенерированный асм код совпадает с тем, что видно в окне «к дизассемдированному коду». Если в сгенерированном асм коде есть ошибки, то, пожалуйста, укажите мне на них. АСМ код вы видите по ссылке в облаке.

Я там кое что изменил сам — в частности, EXTRN написал так EXTRN C (func_name):FAR — но это не помогло — все равно идет переход на адрес вне программы при call этих СИ функций. Что касается самих команд ассемблера — (помимо вызовов СИ функций) — то там ошибок в логике программы нет. В отладчике OLLYDBG видно, что все команды main выполняются правильно и адекватно.

Регистрация: 20.03.2018
Сообщений: 9
Не заниматься ерундой,

мне не нравится тон ваших ответов. Я пытаюсь понять, где майкрософт генерирует асм код, неадекватный СИ коду. В ассемблере я немного разбираюсь. Если вы считаете, что вижуал СИ сгенерировал ошибочный асм код — то , пожалуйста, вы ( как профессионал) покажите мне ошибки в сгенерированном асм коде. И не надо грубить.

Читайте также:
Как пользоваться программой reg organizer видео

Источник: www.programmersforum.ru

при ассемблировании программы

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

Возможные решения проблем:

1. Tlink32.exe не компилирует файл, выдает ошибку:

Fatal: 16 bit segments not supported in module prog.asm

TASM32.EXE и TLINK32.EXE – ассемблер и компоновщик только для программ, написанных под ОС Windows!

Для ассемблирования программ под ОС MS-DOS необходимы TASM.EXE и TLINK.EXE (я рекомендую MASM 6.11 – 6.13).

2. Ассемблер (TASM.EXE) не может найти файл 32RTM.EXE.

TASM 5.0 работает только под управлением ОС Windows. Если Windows у Вас нет, то придется искать TASM более старых версий (1.0 — 4.0), MASM до версии 5.10 включительно либо файл 32RTM.EXE.

3. LINK при компилации выдает:

однако файл с раширением EXE создается.

Данная надпись свидетельствует о том, что Вы забыли указать стек в *.EXE-файле. Если Вы написали программу типа *.COM, а ассемблируете ее как *.EXE, опуская необходимые параметры для *.COM-файла, то данная *.COM программа будет работать некорректно.

Если Вы создаете *.EXE-файл, то просто игнорируйте эту надпись, либо создайте сегмент стека.

Обратите внимание, что в настоящей книге рассматриваются в большинстве своем программы типа *.COM. Как получить *.COM-файл – см. Приложение №01.

4. Ассемблер (TASM) выдает ошибку:

**Error** prog4.asm(15) Near jump or call to different CS

Поместите в Вашу программу после строки CSEG segment следующее:

ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG

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

Проблема, вероятно, в том, что Вы написали *.COM-файл, а ассемблируете его, как *.EXE. Как правильно сассемблировать *.COM-файл см. Приложение №01.

«Ассемблер? Это просто! Учимся программировать»

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru