Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2670
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2258
∙ повысить рейтинг »
Жерар
Статус: Профессор
Рейтинг: 2253
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1453
Дата выхода:29.05.2011, 02:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:216 / 64
Вопросов / ответов:1 / 1

Вопрос № 183305: Здравствуйте, уважаемые эксперты! Прошу помощи в следующем вопросе: Необходимо разработать программу обработки символьной информации, реализующую функции: - инициализация ( вывод титульной таблички ); - передача строки символо...



Вопрос № 183305:

Здравствуйте, уважаемые эксперты! Прошу помощи в следующем вопросе:
Необходимо разработать программу обработки символьной информации, реализующую
функции:
- инициализация ( вывод титульной таблички );
- передача строки символов, длиной не более Nmax, из задан-
ной области памяти в буферную область;
- выполнение заданного в задании 1 преобразования введенной
строки, вывода результирующей строки символов на экран и
передача в приемную область памяти.
Также разработать на языке Pascal тестирующую программу для проверки
функционирования ассемблерной программы. Ассемблерную программу
включить в программу нa Pascal по принципу встраивания (in-line).

Задание 1.
Преобразование введенных во входной строке десятичных цифр
в шестнадцатиричную систему счисления и вывод на экран.
Предпочтителен MASM 6.11, заранее огромное спасибо.

Отправлен: 24.05.2011, 01:55
Вопрос задал: Митиоглов Борис (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Зенченко Константин Николаевич (Модератор) :
Здравствуйте, Митиоглов Борис !

Программа на паскале(ТР7):
Код :
program q183305;
  const
    nMax=10;
  type
    tA=array[1..nMax]of integer;
  procedure convert(z:tA;var y:string;x:integer);external;
{$L q183305}
  var
    a:tA;
    b:string;
    c:integer;
  begin{main}
    c:=nMax;
    while c>0 do{цикл ввода массива}
      begin
        write('Enter A[',c:2,']:=');
        readln(a[c]);
        dec(c);
      end;
    convert(a,b,nMax);{конвертируем массив в строку}
    writeln('Result:',b);{выводим результат}
    readln;
  end.{main}


Подпрограмма на ассемблере(TASM):
Код :
model small
code
public convert
proc convert
;организуем стековый кадр
 push bp
 mov bp,sp
;загружаем переменные подпрограммы
        mov  cx,[bp+04];{nMax}
        mov  di,[bp+06];{offset string}
        mov  es,[bp+08];{segment string}
        mov  si,[bp+10];{offset matrix}
        mov  ds,[bp+12];{segment matrix}
;
        mov  bx,di;запоминаем адрес длины строки
        inc  di;переходим на поле строки
 @00:   lodsw;очередное число
        push bx;сохраняем счетчик в стеке
        mov  bx,4;длина слова
 @01:   push ax;сохраняем число
        and  ax,0Fh;младшая тетрада
        cmp  al,9;больше 9 - 16-я цифра
        jbe  @@02;нет переход
        add  al,7;корректируем 16-ю цифру
 @02:   add  al,'0';переводим число в символ
        mov  es:[bx+di],al;записываем в строку
        pop  ax;востанавливаем число
        shr  ax,1;сдвигаем проверенную тетраду
        shr  ax,1
        shr  ax,1
        shr  ax,1
        dec  bx;уменьшаем счетчик
        jnz  @@01;не ноль переходим
        mov  al,' ';символ разделитель
        mov  es:[di],al;записываем в строку
        mov  ax,5;константа коррекции
        add  di,ax;в регистрах
        pop  bx;востанавливаем указатель на длину строки
        add  es:[bx],al;корректируем длину строки
        loop @@00;пока СХ больше нуля преходим
;
;убираем стековый кадр
 mov sp,bp
 pop bp
;освобождаем память под переменными подпрограммы
 ret 10
endp
end


Подпрограмма convert подключается в основную программу во время компиляции. Слишком большое nMax делать не нужно, т.к. длина строки в паскале 256 символов, а под 16-ое число отводится 4-е символа и один символ разделитель, всего получается 50 с копейкой.
вопросы задавайте в мини-форум.
Удачи!
-----
Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч

Ответ отправил: Зенченко Константин Николаевич (Модератор)
Ответ отправлен: 26.05.2011, 13:31
Номер ответа: 267395
Украина, Киев
Тел.: +38-097-238-60-03
Адрес: Украина, Киев

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267395 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное