Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ вывод массива на встроенном ассемблере в паскале

Автор: Tanchik 14.01.2009 18:23

Как написать вывод одномерного массива на встроенном ассемблере в Паскале

Автор: volvo 14.01.2009 20:28

1) массив чего (Целых? Вещественных? Строк?) ?
2) тебе надо процедуру, которая напечатает глобальный массив, или переданный как параметр? Или это вообще должно быть без процедур?

Автор: Tanchik 14.01.2009 20:59

Цитата(volvo @ 14.01.2009 20:28) *

1) массив чего (Целых? Вещественных? Строк?) ?
2) тебе надо процедуру, которая напечатает глобальный массив, или переданный как параметр? Или это вообще должно быть без процедур?

массив целых чисел формируется в ассемблере, мне надо вывести этот массив на экран но не при помощи паскаля а циклов с метками на встроенном ассемблере через asm/ Массив чисел у меня формируется проблема с выводом

Автор: volvo 14.01.2009 21:09

Цитата
Массив чисел у меня формируется
Код - в студию

Автор: Tanchik 14.01.2009 21:16

Цитата(volvo @ 14.01.2009 21:09) *

Код - в студию

короче касяк вот в чем
@M:
mov ah,[si]
mov t,ah
push si
end;
write(t);
asm
pop si
loop @M
end;
паскаль ругается на строчку loop

Автор: Archon 14.01.2009 21:29

Она немножко из другого блока. То есть метка @M не видима из точки, где ты вызываешь loop. Вот и ругается.

Автор: Tanchik 15.01.2009 16:03

А как это исправить? чтоб метку он видел?

Автор: volvo 15.01.2009 16:11

Цитата
А как это исправить?
Или описывать глобальную метку:
label M;
begin
...
asm
M:
mov ah,[si]
mov t,ah
push si
end;
write(t);
asm
pop si
loop M
end;
...

или выводить элемент T на экран средствами ассемблера, а не Паскаля, тогда и метка и переход на нее будут в одном и том же блоке asm ... end.

Автор: Tanchik 15.01.2009 16:18

Спасибо огромное за помощь!

Автор: Tanchik 15.01.2009 16:54

теперь другой прикол он выводит цифры както странно mad.gif

Автор: volvo 15.01.2009 17:20

А я тебе давно говорил:

Цитата
Код - в студию
Понимаешь, КОД, а не ОБРЫВКИ. Ты выбрала для себя дать обрывки, получила - то, что получила... Я ж не знаю НИ описания твоих массивов, НИ того, заполняется ли массив действительно правильно, или это только ДОЛЖНО происходить, а ты выдаешь желаемое за действительное... Я не телепат...

Автор: volvo 15.01.2009 17:56

Вот тебе пример вывода массива байт. Все прокомментировано, читай, разбирайся, ищи ошибки в своей реализации. Что непонятно - спрашивай.

const size = 10;
var
a: array[1 .. size] of byte;
i: integer;

begin
{ заполняем массив значениями 101, 102, 103, ..., 110 }
for i := 1 to size do a[i] := 100 + i;

asm
mov cx, size { размер массива }
lea si, a { начало массива }

{ основной цикл, перебор всех элементов массива }
@@m:
xor ax, ax { обнуляем AX }
mov al, [si] { берем байт, чье содержимое будем печатать }
push cx { сохраняем кол-во элементов, которые осталось напечатать }

{ это - дополнительные движения, для того, чтобы разбить AL на цифры }
xor cx, cx
mov bx, 10
@@next:
xor dx, dx { обнуляем DX , чтобы можно было делить DX:AX на BX }
div bx
push dx { запоминаем остаток, это цифра, которую надо напечатать }
inc cx { число цифр в числе, хранящемся в AL }
or ax, ax { AX = 0? Нет? Продолжаем }
jnz @@next

{ Здесь, собственно, печатаем все сохраненные в стеке цифры }
@@digits:
pop ax
add al, '0' { преобразование цифры в символ }
int 29h { вывод на консоль }
loop @@digits
{ Все, со второстепенной задачей закончили, продолжаем основную }

pop cx { прежде всего - восстановим количество печатаемых элементов }

mov al, ' ' { напечатаем пробел, чтоб числа не сливались }
int 29h
inc si { переходим к следующему элементу массива }
loop @@m
end;
end.


Автор: Tanchik 16.01.2009 20:32

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