Имеется программа на паскале, в ней массив 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. Вопрос, как это сделать в виде кода, если можно
Helenka Похоже задание из раздела WASM.BEGINNERS->"Студентам с вопросами о лабораторных работах сюда" но всё равно отвечу -- вставки в Паскаль на ассемблере используются для расчета, а ввод и вывод данных происходят средствами Паскаля -- иначе вам требуется указать какой Паскаль вы используете (TurboPascal, Borland Pascal, ABCPascal) и операционная система под которой планируется вывод на экран, если я не ошибаюсь TurboPascal это DOS, Borland Pascal -- Windows хотя могут быть и варианты -- Уточните пожалуйста вывод под DOS или Windows , а я тем временем напишу код
можно так Код (Text): const n=4; var i,j: word; a: array[1..n,1..n]of integer; procedure print(x: integer); begin asm pusha end; write(x:3); asm popa end; end; procedure println; begin asm pusha end; writeln; asm popa end; end; begin for i:=1 to n do begin for j:=1 to n do write(a[i,j]:3); writeln; end; asm push si mov dx,n mov si,offset a @2:call println mov cx,n @1:lodsw push ax call print dec cx jne @1 dec dx jne @2 pop si end; readln; end. Но фактически вывод на экран производится средствами паскаля (write/writeln).
Helenka Пока ответа нет -- предположим что вывод в DOS так как написано, что write(a[i,j]:3) значит число максимум 2-х значное, про то что a[i,j] могут быть меньше нуля тоже ничего не сказано, пусть a[i,j] число от 0 до 99 тогда Код (Text): asm mov ax,3 int 10h; стираем все с экрана mov si,offset a; адрес массива a:array[1..8,1..8]of integer mov di,offset b; адрес массива куда будет происходить вывод b db 64*3 dup ('$') mov cx,8; 8 строк a0: push cx mov cx,8; 8 столбцов a1: lodsb; загружаем очередной элемент aam xchg ah,al add ax,3030h; получаем из числа ASCII-строку stosw; выводим ASCII-строку в массив mov al,20h stosb; между каждым числом ставим пробел loop a1 mov ax,0D0Ah; если вывели 8 элементов переходим в начало следующей строки stosw; выводим символ pop cx loop a0 mov ah,9; выводим то, что у нас получилось на экран mov dx,offset b int 21h mov ah,0; ждем нажатия на любую клавишу int 16h end;
Helenka массив для вывода var b: string; (* строка которая будет использована для вывода матрицы на экран *) begin b[208]:='$'; (* 208 = 64 числа * 3 символа + 8 строк * 2 символа перевод на др. строку счет идет от нуля *)
Mikl___ Подскажите, пожалуйста, как побороть расширение до 2 байт т.е. выводится матрица видe 01 00 02 00 03 00 04 00 .. .. .. .. .. .. 29 00 30 00 31 00 32 00
В смысле убрать первый 0? (09 -> 9)? Код (Text): xchg ah,al add ax,3030h; получаем из числа ASCII-строку cmp al,30h jne a2 sub al,10h a2: stosw; выводим ASCII-строку в массив
Кажется понял a:array[1..8,1..8]of integer замените на a:array[1..8,1..8]of byte все равно a[i,j]<100
Mikl___ Хитро изменил ТЗ ) задача выводить 3х значный integer, который ещё и знаковый - так что замути в 16 разрядном виде что нибудь типа этого или этого )
Y_Mur Я ТЗ не меняю, когда пишут "write(a[i,j]:3);" подразумевается что 2 цифры и пробел, иначе чтобы не сливалось пишут "write(a[i,j]:2,' ');" я могу и WORD с учетом знака, но ТС об этом прямо не пишет... Helenka Чтобы не гадать -- прикрепи заархивированные *.pas и *.exe к сообщению
Прикрепила. исход.* это первоначальная версия Там матрица по хитрому формируется, змейкой, задача такая )
Helenka Так ты же заполняешь массив через 2 байта Код (Text): begin asm mov si,offset a; mov cx,n mov dx,-1 xor ax,ax @1: push cx mov cx,n mov di,n and di,dx add ax,di @2: mov [si],ax add si,2 <-- вот здесь add ax,dx loop @2 mov di,n and di,dx add ax,di not dx inc dx add ax,dx pop cx loop @1 end; следовательно и Код (Text): @a1: lodsb<-- поменяй на lodsw aam xchg ah,al add ax,3030h и должно быть a:array[1..8,1..8]of integer