Ошибка, не выводится измененный массив Паскаль-Ассемблер TASM - Assembler
Формулировка задачи:
В строках матрицы, содержащих нуль, элементы сортируются по убыванию.
Исходная задача решена через ASM встроенный ассемблер паскаля
Теперь при помощи TASM создается объектный файл .OBJ для паскаля
код паскаля
и код ассмеблера для TASM.exe
и в результате все компилируется без ошибок, создается, но когда запускаю паскаль, он выводит только исходный массив и прога зависает, ни на что не реагирует
Тоесть ошибка точно в коде ассемблера, вот только в чем хз
program test; uses crt; const n=5; m=25; var a:array[1..n,1..m]of integer; b:array[1..n]of integer; i,j,p,k:integer; begin clrscr; randomize; writeln('Ishodniy massiv:'); for i:=1 to n do begin for j:=1 to m do begin a[i,j]:=random(20)-10; write(a[i,j],' '); {Создание исходного двумерного массива} end; writeln; end; asm lea bx,a mov cx,n @1: mov bp,cx mov cx,m mov si,0 @2: mov ax,[bx+si] cmp ax,0 {Сравнивание элементов с нулем} jne @3 mov di,cx @4: mov cx,m-1 mov p,0 mov si,0 @5: mov ax,[bx+si] cmp ax,[bx+si+2] jge @6 mov dx,[bx+si+2] mov [bx+si],dx mov [bx+si+2],ax mov p,1 @6: add si,2 loop @5 cmp p,0 jne @4 {Сортировка пузырьком одномерных массивов(строк) по убыванию} mov cx,di @3: add si,2 loop @2 mov cx,bp add bx,2*m loop @1 end; {---------------} writeln('Izmen massiv:');; for i:=1 to n do begin for j:=1 to m do write(a[i,j],' '); writeln; end; readln; end.
{$L 5laba.obj} program 5laba; uses crt; const n=4; m=20; type t1=array[1..n,1..m]of integer; var a:t1; i,j,p:integer; procedure mas(var a:t1; n,m:integer); external; begin clrscr; randomize; for i:=1 to n do begin for j:=1 to m do begin a[i,j]:=random(10)-5; write(a[i,j],' '); end; writeln; end; mas(a,n,m); writeln; for i:=1 to n do begin for j:=1 to m do write(a[i,j],' '); writeln; end; readln; end.
.286 public mas stack1 segment STACK db 128 dup(?) stack1 ends data segment k dw (?) p db (?) data ends code segment byte public assume cs:code,ss:stack1, ds:data mas proc near push bp mov bp,sp pusha lds bx,[bp+8] mov cx,[bp+6] @1: mov bp,cx mov cx,[bp+4] mov si,0 @2: mov ax,[bx+si] cmp ax,0 jne @3 mov di,cx @10: mov cx,[bp+4]-1 mov p,0 mov si,0 @11: mov ax,[bx+si] cmp ax,[bx+si+2] jge @14 mov dx,[bx+si+2] mov [bx+si],dx mov [bx+si+2],ax mov p,1 @14: add si,2 loop @11 cmp p,0 jne @10 mov cx,di @3: add si,2 loop @2 mov cx,bp add bx,2*[bp+4] loop @1 popa pop bp RET 8 mas endp code ends end
наверно нельзя писать так
mov bp,cx
mov cx,[bp+4]-1
add bx,2*[bp+4]
Решение задачи: «Ошибка, не выводится измененный массив Паскаль-Ассемблер TASM»
textual
Листинг программы
mov cx,[bp+4] dec cx
Объяснение кода листинга программы
- Переменная
cx
содержит значение, полученное из области памяти, на которую указывает смещение4
от базыbp
. - Значение переменной
cx
уменьшается на единицу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д