Помощь - Поиск - Пользователи - Календарь
Полная версия: вывод массива на встроенном ассемблере в паскале
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Tanchik
Как написать вывод одномерного массива на встроенном ассемблере в Паскале
volvo
1) массив чего (Целых? Вещественных? Строк?) ?
2) тебе надо процедуру, которая напечатает глобальный массив, или переданный как параметр? Или это вообще должно быть без процедур?
Tanchik
Цитата(volvo @ 14.01.2009 20:28) *

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

массив целых чисел формируется в ассемблере, мне надо вывести этот массив на экран но не при помощи паскаля а циклов с метками на встроенном ассемблере через asm/ Массив чисел у меня формируется проблема с выводом
volvo
Цитата
Массив чисел у меня формируется
Код - в студию
Tanchik
Цитата(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
Она немножко из другого блока. То есть метка @M не видима из точки, где ты вызываешь loop. Вот и ругается.
Tanchik
А как это исправить? чтоб метку он видел?
volvo
Цитата
А как это исправить?
Или описывать глобальную метку:
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
Спасибо огромное за помощь!
Tanchik
теперь другой прикол он выводит цифры както странно mad.gif
volvo
А я тебе давно говорил:
Цитата
Код - в студию
Понимаешь, КОД, а не ОБРЫВКИ. Ты выбрала для себя дать обрывки, получила - то, что получила... Я ж не знаю НИ описания твоих массивов, НИ того, заполняется ли массив действительно правильно, или это только ДОЛЖНО происходить, а ты выдаешь желаемое за действительное... Я не телепат...
volvo
Вот тебе пример вывода массива байт. Все прокомментировано, читай, разбирайся, ищи ошибки в своей реализации. Что непонятно - спрашивай.

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
Спасибо за задачку. Я сделала программу, только псле вывода массива еще выдает зачем то нули, хотя массив считает правильно. А почему нули выдает не понятно
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.