Вопрос № 183305: Здравствуйте, уважаемые эксперты! Прошу помощи в следующем вопросе: Необходимо разработать программу обработки символьной информации, реализующую функции: - инициализация ( вывод титульной таблички ); - передача строки символо...
Вопрос № 183305:
Здравствуйте, уважаемые эксперты! Прошу помощи в следующем вопросе: Необходимо разработать программу обработки символьной информации, реализующую функции: - инициализация ( вывод титульной таблички ); - передача строки символов, длиной не более Nmax, из задан- ной области памяти в буферную область; - выполнение заданного в задании 1 преобразования введенной строки, вывода результирующей строки символов на экран и передача в приемную область памяти. Также
разработать на языке Pascal тестирующую программу для проверки функционирования ассемблерной программы. Ассемблерную программу включить в программу нa Pascal по принципу встраивания (in-line).
Задание 1. Преобразование введенных во входной строке десятичных цифр в шестнадцатиричную систему счисления и вывод на экран. Предпочтителен MASM 6.11, заранее огромное спасибо.
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 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.