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