Вывод двухмерного массива на экран, встроенный в "ТрупоПаскаль" asm

Тема в разделе "WASM.BEGINNERS", создана пользователем Helenka, 18 июн 2009.

  1. Helenka

    Helenka New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    9
    Имеется программа на паскале, в ней массив 8*8

    program ХХХ;
    ...
    ...
    ...
    a:array[1..n,1..n]of integer;
    ...
    begin
    ...
    тут массив заполняется цифрами
    ...
    ...
    так он выводится на экран на паскале в виде квадратной матрицы
    for i:=1 to n do
    begin
    for j:=1 to n do
    write(a[i,j]:3);
    writeln;
    end;

    ...
    begin
    asm
    !!!!! тут нужно вывести его на экран, используя встроенный ассемблер !!!!
    ...

    readln;
    end.


    Вопрос, как это сделать в виде кода, если можно
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Helenka
    Похоже задание из раздела WASM.BEGINNERS->"Студентам с вопросами о лабораторных работах сюда" но всё равно отвечу -- вставки в Паскаль на ассемблере используются для расчета, а ввод и вывод данных происходят средствами Паскаля -- иначе вам требуется указать какой Паскаль вы используете (TurboPascal, Borland Pascal, ABCPascal) и операционная система под которой планируется вывод на экран, если я не ошибаюсь TurboPascal это DOS, Borland Pascal -- Windows хотя могут быть и варианты -- Уточните пожалуйста вывод под DOS или Windows , а я тем временем напишу код
     
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    можно так
    Код (Text):
    1. const
    2.     n=4;
    3. var
    4.     i,j:   word;
    5.     a:     array[1..n,1..n]of integer;
    6.  
    7. procedure print(x: integer);
    8. begin
    9.     asm
    10.     pusha
    11.     end;
    12.     write(x:3);
    13.     asm
    14.     popa
    15.     end;
    16. end;
    17.  
    18. procedure println;
    19. begin
    20.     asm
    21.     pusha
    22.     end;
    23.     writeln;
    24.     asm
    25.     popa
    26.     end;
    27. end;
    28.  
    29. begin
    30.     for i:=1 to n do
    31.     begin
    32.         for j:=1 to n do
    33.             write(a[i,j]:3);
    34.         writeln;
    35.     end;
    36.     asm
    37.     push si
    38.     mov  dx,n
    39.     mov  si,offset a
    40.     @2:call println
    41.        mov  cx,n
    42.        @1:lodsw
    43.           push ax
    44.           call print
    45.           dec  cx
    46.        jne @1
    47.        dec dx
    48.     jne @2
    49.     pop  si
    50.     end;
    51.     readln;
    52. end.
    Но фактически вывод на экран производится средствами паскаля (write/writeln).
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Helenka
    Пока ответа нет -- предположим что вывод в DOS так как написано, что write(a[i,j]:3) значит число максимум 2-х значное, про то что a[i,j] могут быть меньше нуля тоже ничего не сказано, пусть a[i,j] число от 0 до 99 тогда
    Код (Text):
    1. asm
    2.     mov ax,3
    3.     int 10h; стираем все с экрана
    4.     mov si,offset a; адрес массива a:array[1..8,1..8]of integer
    5.     mov di,offset b; адрес массива куда будет происходить вывод b db 64*3 dup ('$')
    6.     mov cx,8; 8 строк
    7. a0: push cx
    8.     mov cx,8; 8 столбцов
    9. a1: lodsb; загружаем очередной элемент
    10.     aam
    11.     xchg ah,al
    12.     add ax,3030h; получаем из числа ASCII-строку
    13.     stosw; выводим ASCII-строку в массив
    14.     mov al,20h
    15.     stosb; между каждым числом ставим пробел
    16.     loop a1
    17.     mov ax,0D0Ah; если вывели 8 элементов переходим в начало следующей строки
    18.     stosw; выводим символ
    19.     pop cx
    20.     loop a0
    21.     mov ah,9; выводим то, что у нас получилось на экран
    22.     mov dx,offset b
    23.     int 21h
    24.     mov ah,0; ждем нажатия на любую клавишу
    25.     int 16h
    26. end;
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Helenka
    массив для вывода
    var
    b: string; (* строка которая будет использована для вывода матрицы на экран *)

    begin
    b[208]:='$'; (* 208 = 64 числа * 3 символа + 8 строк * 2 символа перевод на др. строку счет идет от нуля *)
     
  6. Helenka

    Helenka New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    9
    Извиняюсь, не указала сразу TURBO Pascal. DOS (эмулятор)
    Числа от 0..64

    Mikl___, murder

    Спасибо!
     
  7. Helenka

    Helenka New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    9
    Mikl___

    Подскажите, пожалуйста, как побороть расширение до 2 байт
    т.е. выводится матрица видe

    01 00 02 00 03 00 04 00
    ..
    ..
    ..
    ..
    ..
    ..

    29 00 30 00 31 00 32 00
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    В смысле убрать первый 0? (09 -> 9)?
    Код (Text):
    1.     xchg ah,al
    2.     add ax,3030h; получаем из числа ASCII-строку
    3.     cmp al,30h
    4.     jne a2
    5.     sub al,10h
    6. a2: stosw; выводим ASCII-строку в массив
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Кажется понял a:array[1..8,1..8]of integer замените на a:array[1..8,1..8]of byte
    все равно a[i,j]<100
     
  10. Helenka

    Helenka New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    9
    попробовала, то же самое
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Mikl___
    Хитро изменил ТЗ :)) задача выводить 3х значный integer, который ещё и знаковый - так что замути в 16 разрядном виде что нибудь типа этого или этого :))
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Y_Mur
    Я ТЗ не меняю, когда пишут "write(a[i,j]:3);" подразумевается что 2 цифры и пробел, иначе чтобы не сливалось пишут "write(a[i,j]:2,' ');" я могу и WORD с учетом знака, но ТС об этом прямо не пишет...
    Helenka
    Чтобы не гадать -- прикрепи заархивированные *.pas и *.exe к сообщению
     
  13. Helenka

    Helenka New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    9
    Прикрепила.
    исход.* это первоначальная версия

    Там матрица по хитрому формируется, змейкой, задача такая )
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Helenka
    Так ты же заполняешь массив через 2 байта
    Код (Text):
    1.   begin
    2.       asm
    3.       mov si,offset a;
    4.       mov cx,n
    5.       mov dx,-1
    6.       xor ax,ax
    7. @1:   push cx
    8.       mov cx,n
    9.       mov di,n
    10.       and di,dx
    11.       add ax,di
    12. @2:   mov [si],ax
    13.       add si,2 <-- вот здесь
    14.       add ax,dx
    15.       loop @2
    16.       mov di,n
    17.       and di,dx
    18.       add ax,di
    19.       not dx
    20.       inc dx
    21.       add ax,dx
    22.       pop cx
    23.       loop @1
    24.     end;
    следовательно и
    Код (Text):
    1. @a1:    lodsb<-- поменяй на lodsw
    2.     aam
    3.     xchg ah,al
    4.     add ax,3030h
    и должно быть a:array[1..8,1..8]of integer
     
  15. Helenka

    Helenka New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    9
    Так ты же заполняешь массив через 2 байта


    Точно, блииин, вот я слепая!

    Спасибо!!!!! Все работает!!!!