Ошибка, не выводится измененный массив Паскаль-Ассемблер TASM - Assembler

Узнай цену своей работы

Формулировка задачи:

В строках матрицы, содержащих нуль, элементы сортируются по убыванию. Исходная задача решена через ASM встроенный ассемблер паскаля
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.
Теперь при помощи TASM создается объектный файл .OBJ для паскаля код паскаля
{$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.
и код ассмеблера для TASM.exe
.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

Объяснение кода листинга программы

  1. Переменная cx содержит значение, полученное из области памяти, на которую указывает смещение 4 от базы bp.
  2. Значение переменной cx уменьшается на единицу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы