Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.
 
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи
 
некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс. https://wasm.in/
Ассемблер - книги (ASM, Assembler)
 
Просьба все большие листинги оформлять тегом more.
 
если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:42 29-11-2006 | Исправлено: akaGM, 17:44 11-06-2020
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
if key <= 31 then
  обработка контрол-кода
else
  печать как есть...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 16:27 23-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maksim_Avrorov
Тогда придется немного допилить алгоритм. Сперва выводим содержимое регистра как есть, потом преобразуем в читаемый вид и выводим снова.
Сейчас попробую набросать.
 
Добавлено:
Вот набросал нечто более менее наглядное.

Код:
.model tiny
.code
ORG 100h
start:
       mov cx,100h
cycle:
       mov ax,100h
       sub ax,cx
       mov ascii,al
       shl ax,4
       shr al,4
       cmp ah,9
       ja F1
       or ah,30h
       mov hex1,ah
       jmp next
F1:
       add ah,37h
       mov hex1,ah
next:
       cmp al,9
       ja F2
       or al,30h
       mov hex2,al
       jmp next2
F2:
       add al,37h
       mov hex2,al
next2:
       lea dx,ascii
       mov ah,9
       int 21h
       loop cycle
       int 20h
data:
ascii db 0
      db '='
hex1  db 0
hex2  db 0
      db 0dh,0ah,'$'
end start

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 16:32 23-05-2012
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте.
Сначала распишу всё задание полностью:
1. Необходимо в программе C# считать файл, на каждой строке которого находится арифметическое выражение.
2. Затем необходимо сгенерировать код на ассемблере, который бы вычислял каждое выражение.
3. Откомпилировать программу и запустить, как ехе файл.
 
Теперь, что касается ассемблера.
Необходимо на ассемблере решать арифметические выражения вида:
А := K + 4 * (10-8) / 8
P := A + 8
 
A,K,P - это переменные, которые мы получаем из файла
4,8,10,8 - числа
+-*/ - арифметические знаки
() скобки
 
Как я вижу решение этого задания:
Разбиваем выражение на элементарные действия, т.е.
Сначала в А заносим значение 10-8, затем 4 умножаем на значение в А и т.д.
 
Однако, для того, чтобы реализовать само присваивание, умножение, деление - необходимы шаблоны на ассемблере, которые буду вставлять в нужное место. Если мои рассуждения верны, то прошу помощи в данных шаблонах. Если же нет - подскажите, пожалуйста, как можно реализовать поставленную задачу.
И ещё, как себя поведет ассемблер, если мы будем суммировать переменную, которая была не объявлена? Как в примере переменная "К", ещё надо будет заменять на ноль или выдавать ошибку?  
 
P.S.
Готов рассчитаться за помощь.

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 11:29 28-05-2012 | Исправлено: ForposT_ForeveR, 11:29 28-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ForposT_ForeveR
Всего один вопрос. Переменные это целые положительные числа без знака?

Цитата:
И ещё, как себя поведет ассемблер, если мы будем суммировать переменную, которая была не объявлена?

Если в коде ты попробуешь подставить имя переменной которой нигде нет, то он конечно ругнется. Тут вопрос немного в дургом. Существует ли переменная? Если есть число из файла, значит его можно загрузить в регистр и работать с ним не выделяя под него отдельную переменную.

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 15:38 28-05-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
странное какое-то задание...
я лично не понял эту межъязыковую C#-ASM связь...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 16:10 28-05-2012
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
В C# я обязан написать все свои учебные работы.
Мне в C# необходимо написать этакий генератор асмовских файлов, которые бы решали арифметические выражения, затем я его откомпилирую тасмом и получу ехе, ч.т.д.
В ходе данной работы ещё много чего требовалось, однако всё это уже решил. Остался только асм.
Говорят, что есть какой-то скриптовый язык, на котором пишешь, а ещё уже написанный конвертер, который сам всё переведет в асм. Говоря по секрету, мне он тоже подойдет. Лишь бы уже решить этот вопрос с асмом.
Очень прошу, если кто может чем-то помочь пишите на alexey @ f_o_r_p_o_s_t.md (без _) и (два-девять-три-один-пять-ноль-два-девять-семь ICQ).
Готов рассчитаться за помощь.

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 18:21 28-05-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хе-хе... C# (.NET & Co) для того и изобретали, чтоб ни у кого не было соблазна не то что в АСМ, а даже в классический Си выходить... Препода надо сдать Мелкомягким, за сей страшный грех...
 
Добавлено:

Цитата:
Мне в C# необходимо написать этакий генератор асмовских файлов, которые бы решали арифметические выражения, затем я его откомпилирую тасмом и получу ехе, ч.т.д.

это не проблема, вопрос только, как данные туда сюда перегонять? через комстроку что ли?

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 19:00 28-05-2012
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Да, через ком строку. Всё верно.
 

Цитата:
это не проблема

Для меня это огромнейшая проблема, на которую никто не может дать ответ. Ни преподаватели, ни коллеги-программисты.
Если же у Вас есть такая возможность - моей благодарности не было бы границ, а радости - уж и словами не передать. Свяжитесь, пожалуйста, со мной, если Вас не затруднит.

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 20:42 28-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а ещё уже написанный конвертер, который сам всё переведет в асм.

Дизассемблер называется
Опиши конкретнее чем тебе помочь.

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 22:21 28-05-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ForposT_ForeveR, ну приблизительно так:
на стороне си# создаем файл - полный ассемблерный сырец, в который напрямую пишем все операции и данные, чтоб не мучиться с парсингом комстроки. Вызываем шелл два раза: 1 - ассемблер, 2 - сам полученный ехе. Проблему получаем, когда ехе должен вернуть результат - записать его прямо в память родителя не получится из-за защиты. Выход - записать данные в файл? И потом прочитать из родителя? Больше идей нету

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 22:45 28-05-2012
cp58

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ForposT_ForeveR
Решений множество.
 
Есть вариант "ленивый". Выражения достаточно похожи на delphi-синтаксис, что может позволить использовать delphi компилятор, а соответственно сгенерировать asm код(впрочем, я не уверен, позволяет ли это сделать, например, компилятор borland).
 
Также можно преобразовать код в C-подобный и тогда точно выйдет получить ассемблерный код, используя, например, gcc или vc от microsoft.
 
Посложнее сделать парсер на C++, с использованием boost::spirit, портировать api к нему.
 
Ну и самый трудозатратный. Практически компилятор. Написать лексический анализатор, выделить токены, затем парсер, который преобразует токены в древовидную структуру, потом генерировать код, на основе дерева.
 
Как со вторым и третьим вариантом, в конечном итоге придется генерировать ассемблерный код, под заданную архитектуру(x86 я так понимаю) и синтаксис(intel наверно) и лучше использовать какие-либо наработки из области open-source.

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 23:25 28-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так он вроде не говорил, что результат нужно возвращать в родитель. Просто сгенерировать, откомпилить и запустить.

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 23:28 28-05-2012
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

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

Да, именно такая задача состоит изначально.
Однако, таблица лексем, древо вывода тоже сделал. А вот как генерировать код на асме не знаю. Поэтому и спрашиваю у Вас.  
Остаётся задача сгенерировать асмовский файл, далее я уже разберусь что с ним сделать.
Помогите, пожалуйста, написать генератор асма для решения поставленной задачи.

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 00:40 29-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ForposT_ForeveR
В общем, я так понимю тебе нужно набросать набор макросов на все случаи жизни.
Давай опрелелимся с несколькими вещами.
  • С какими числами работаем? Со знаком/без знака? От 0 до...? Целые/дробные? Вообще есть ли ограничения?
  • Какие выражения необходимо решать? В твоем примере вижу лишь сложение, вычитание, деление, умножение. Это все? Никаких корней и синусов?
  • 1 файл для решения одного выажения? Или надо чтоб один файл решал несколько выражений и выдавал несколько ответов?

  • Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 00:53 29-05-2012
    cp58

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ForposT_ForeveR
    Без оптимизации это не так сложно.
     
    Если будут использоваться числа с плавающей запятой, то можно использовать сразу мат. сопроцессор и объявлять переменные соответствующе. Пройтись по дереву, выделить переменные, которые будут использоваться, объявить в начале файла(для masm/fasm/tasm это db,dw,dd для gas - .byte, .word, .int).
    Затем подгружать переменные в регистры и производить мат. операции, потом сохранять(mov eax, [some_variable] mov ebx, [some_variable2] add eax, ebx mov [some_variable3], eax для intel синтаксиса).
    С оптимизациями дольше, заменять операции чтения из памяти, контролировать свободные регистры и т.д.

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 01:04 29-05-2012
    ForposT_ForeveR



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
     нужно набросать набор макросов на все случаи жизни.  

    Именно!
     

    Цитата:
    С какими числами работаем? Со знаком/без знака? От 0 до...? Целые/дробные? Вообще есть ли ограничения?  

    Дробные и со знаками. Ограничений нет.

    Цитата:
    Какие выражения необходимо решать? В твоем примере вижу лишь сложение, вычитание, деление, умножение. Это все? Никаких корней и синусов?  

     
    Только умножение, деление, сложение, вычитание.

    Цитата:
    1 файл для решения одного выажения? Или надо чтоб один файл решал несколько выражений и выдавал несколько ответов?

    Нет, 1 строка - 1 выражение.
    Причем последующие строки могут связаны с предыдущими выражениями.
    И самое главное, значение каждого выражения надо выводить на экран, также с новой строки.
     

    Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 02:09 29-05-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ForposT_ForeveR
    так кинул бы просто для примера входный файл, а то уже целую страницу у тебя выпытывают его формат...

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 02:13 29-05-2012
    ForposT_ForeveR



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Необходимо на ассемблере решать арифметические выражения вида:
    А := K + 4 * (10-8) / 8
    P := A + 8
     
    A,K,P - это переменные, которые мы получаем из файла
    4,8,10,8 - числа
    +-*/ - арифметические знаки
    () скобки  

    Читай выше

    Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 11:14 29-05-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ForposT_ForeveR
    если это мне, то это всё описалово, кот. не заменит реального файла данных, как любой обучающий текст сопровождается иллюстрациями...
    при чём тут, например, паскалевское присваивание? или это псевдокод?
    у тебя уже есть готовый и надёжный парсер, кот. хотя бы вложенные скобки отрабатывает?
     
    т.е., в конце-концов всё это будет выглядеть так, да?

    Код:

    printf(".model small\n");
    printf(".code\n");
    printf(".start:\n");
    printf("   mov ax, 10\n");
    printf("   add ax, 8\n");
     
    printf("   ; ещё и вывод здесь генерить?\n");
     
    printf("   add ax, 4c00h\n");
    printf("   int 21h\n");
    printf("end start\n");

     
    душевный онанизм...

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 12:18 29-05-2012 | Исправлено: akaGM, 12:20 29-05-2012
    ForposT_ForeveR



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    akaGM
    Да, парсер написать не проблема.
    Софтина разобьёт всё на элементарные операции, потом для каждой операции будет вызываться соответствующая функция и генерировать асмовский код.
     

    Цитата:
    если это мне, то это всё описалово, кот. не заменит реального файла данных, как любой обучающий текст сопровождается иллюстрациями...  

    Понимаю, но тестовых данных нет. Самому надо придумывать.
     

    Цитата:
     при чём тут, например, паскалевское присваивание? или это псевдокод?  

    А что насчет знака присваивания - так это по ТЗ именно такой он и будет. Почему он схож с паскалевским знает только преподаватель.
     

    Цитата:
    душевный онанизм...

    Правильный синоним тяжелых будней учебного процесса.

    Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 13:46 29-05-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru