Консультация № 182750
05.04.2011, 21:04
63.01 руб.
0 11 1
Здравствуйте! Прошу помощи в следующем вопросе:
Есть код ассемблера, нужно устроить ввод через процедуру в паскале:


Приложение:
1 0000 .model small
2 0000 .stack 100h
3 0000 .data
4 0000 00 00 01 64 array db 0,0,1,'d'
5 0004 .code
6 0000 begin:
7 0000 BF 0000r lea di,array
8 0003 B9 0004 mov cx,4
9 0006 33 C0 xor ax,ax
10 0008 F3> AE repe scasb
11 000A B8 0000r lea ax, array
12 000D 97 xchg ax, di
13 000E 2B C7 sub ax, di
14 0010 C3 ret
15 0011 B8 4C00 mov ax,4c00h
16 0014 CD 21 int 21h
17 end begin

Обсуждение

давно
Посетитель
7438
7205
05.04.2011, 21:28
общий
Есть код ассемблера, нужно устроить ввод через процедуру в паскале
Есть несколько вопросов:
1) "код на ассемблере" ищет смещение байта за байтом 00h в строке из 4 байт
Именно это требуется?
2) Требуется из программы на Ассемблере вызвать подпрограмму на Паскале,
которая осуществляет ввод строки. Так?
3) Как Вы предполагаете ввести строку с нулем посередине?
4) Команда scasb ищет по адресу es:di. Только вот в Вашей программе ES не равен сегменту данных...
PS Если я неправильно понял, то опишите словами, что должна делать программа...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
05.04.2011, 21:29
общий
Уточните, что Вы хотите?

Паскаль и ввод на ассемблере?
Ассемблер и ввод процедурой паскаля?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
05.04.2011, 22:54
общий
Паскаль вызывает файл ассемблера через процедуру. И через паскаль осуществляется задание строки.
Программа ищет первый не нулевой член.
Неизвестный
07.04.2011, 19:20
общий
Уважаемые эксперты помогите!
давно
Посетитель
7438
7205
08.04.2011, 09:23
общий
Сегодня сделаем, не переживайте...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.04.2011, 10:53
общий
это ответ
Здравствуйте, JohnyWayne!
Программа на Паскале.
Сначала вводим строку. Для ввода нулевых байт используем тот факт,
что функциональные клавиши сначала дают код 0, для отображения 0 выводим <0>
Затем вызываем функцию, написанную на ассемблере, которая ищет индекс первого ненулевого элемента
Проверено в TP 7.1
Чтобы в среде TP правильно отображались комментарии, требуется переконвертирровать текст программы в ASCII
[code h=200]program a1;
{$L NotZero}
uses crt;
var str1:string; {строка}
var ch:char; {символ}
var i:integer; {индекс ненулевого элемента}
function NotZero(str:string):integer;external;
begin
clrscr;
{Вводим строку. Для задания нулевых элементов используем любую из F1-F12}
write('Enter string (F1 for 0, Enter for finish): ');
repeat
ch:=ReadKey; {читаем поток ввода}
if ord(ch)=0 then {функциональные клавиши сначала дают нулевой байт}
begin
ReadKey; {гасим второй байт клавиши}
write('<0>'); {выведем для наглядности}
end
else
write(ch); {выведем ненулевой символ}
str1:=str1+ch; {добавляем в строку}
until ord(ch)=13; {выход по Enter}

i:=NotZero(str1); {получаем позицию первого ненулевого символа}
writeln;
if i<>Length(str1) then {проверим, а есть ли вообще ненулевые символы}
writeln('First not zero symbol: str1[',i,'] = ',str1[i])
else
writeln('Not zero symbol not found');
readkey;
end.[/code]
Внешний модуль NotZero, написанный на ассемблере
[code h=200]
.model large, pascal
.code
public NotZero
;функция, ищущая в паскалевской строке первый ненулевой символ
;индекс которого возвращается в AX
;если все символы равны 0, то вернется длина строки
;параметр - длинный указатель на строку
NotZero proc array:dword
push es ;сохраним сегментный регистр ES
les di, array ;ES:DI - адрес строки
xor cx, cx
mov cl, es:[di] ;CX - длина строки
inc di ;DI - адрес самой строки
mov dx, di ;сохраним для дальнейших вычислений
xor ax, ax ;будем искать AL=0
repe scasb ;ищем в ES:DI
mov ax, di
sub ax, dx ;AX - индекс (с 1) первого ненулевго символа
pop es
ret
NotZero endp
end
[/code]
Примерный вывод на экран:
Код:
Enter string (F1 for 0, Enter for finish): <0><0><0>qwerty
First not zero symbol: str1[4] = q
5
спасибо вам большое)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
08.04.2011, 21:54
общий
хм, правда на код паскаля ругается, точнее происходит ошибка (вылетает окно об обращении паскаля к диску) использую TP 7.1
давно
Посетитель
7438
7205
08.04.2011, 21:57
общий
Что именно пишет?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.04.2011, 21:59
общий
Если не находит NotZero.obj, то укажите полный путь к файлу.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
08.04.2011, 22:01
общий

Привет.
Только, что скомпилировал код паскаля и ассемблера - все работает, сгенерироавна ЕХЕ-программа.
Как Вы запускаете?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
08.04.2011, 23:46
общий


Обращаем внимание на эту опцию(красное), она влияет на модель памяти small(зеленое) и large(голубое)-нарушение стека.
Тут ещё кусочек экрана выполнения программы.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа