powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Массивы в Turbo Assembler
13 сообщений из 13, страница 1 из 1
Массивы в Turbo Assembler
    #35659177
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Найти сумму всех положительных элементов квадратной матрицы.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
data segment ; Сегмент данных
; Инициализируем массив m из  16 -ти элементов
m dw  1 ,- 2 , 3 , 4 , 5 ,- 6 , 7 , 8 , 9 , 10 , 0 , 12 , 0 , 14 , 15 ,- 16 
s dw ?
data ends
code segment ; Сегмент кода
assume es: data, cs: code
start:
mov ax, data
mov es, ax
; bx - базовый регистр, имитирует номер строки в двумерном массиве.

mov cx,  16  ; в сx загружаем число итераций цикла
mov bx,  0 
mov ax, 0 

cikl:     ; метка начала внешнего цикла

mov dx, m[bx] ; загружаем в регистр dx элемент
cmp dx, 0 
jna nextline
add ax, dx
nextline:
add bx, 2 
dec cx
jnz cikl

mov ax,s

mov ax, 4c00h
int 21h   ; завершение работы программы
code ends
end start

Проблема в том, что программа мне суммирует все элементы массива,
хотя оператор условного перехода JNA используется вроде для знаковых чисел.
Помогите разрулить проблему.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35659261
Quartz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JNA как раз не учитывает знак. Исправьте на JLE nextline.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35661246
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо QUARTZ на асссемблере прога получилась.

Теперь вот на Delphi выдает ошибку:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
program laba5;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
n,i,j: Byte;
m: array [ 0 .. 9 ] of Word;

procedure Calculate;
var
 s: Word;
begin
for i :=  0  to n*n -  1  do
     begin
       asm
       mov ax, m[ 0 ];
       end;
     end;
end;

Ругается на строчку mov ax, m[0]; Operand size mismatch
Размерность регистра AX 16 разрядов, т.е. если верить хэлпу 2 байта (16 бит) Word.
Да и оператор SizeOf(m[0]) 2 выдает. Среда разработки Delphi 2007.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35661294
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А n почему не инициализован?
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35661316
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TeXpertА n почему не инициализован?

program laba5;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
n,i,j: Byte;
m: array [0..9] of Word;

procedure Calculate;
var
s: Word;
begin
for i := 0 to n*n - 1 do
begin
asm
mov ax, m[0];
end;
end;
end;

procedure OutputMatrix;
begin
for i := 0 to n*n - 1 do
begin
write(m[i]:8);
if (i+1) mod n = 0 then Writeln;
end;
Writeln('For exit press Enter');
Readln;
end;

begin
try
{ TODO -oUser -cConsole Main : Insert code here }

Write('Input matrix size: ');
Readln(n);
Writeln('Input the matrix:');
for i := 0 to n*n - 1 do
begin
Write('Input ',i+1,'-th element of ',(i div n)+1,'-th line: ');
Readln(m[i]);
end;

Calculate;
OutputMatrix;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35661318
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
program laba5;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
n,i,j: Byte;
m: array [ 0 .. 9 ] of Word;

procedure Calculate;
var
 s: Word;
begin
for i :=  0  to n*n -  1  do
     begin
       asm
       mov ax, m[ 0 ];
       end;
     end;
end;

procedure OutputMatrix;
begin
   for i :=  0  to n*n -  1  do
    begin
    write(m[i]: 8 );
    if (i+ 1 ) mod n =  0  then Writeln;
    end;
Writeln('For exit press Enter');
Readln;
end;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }

  Write('Input matrix size: ');
  Readln(n);
  Writeln('Input the matrix:');
  for i :=  0  to n*n -  1  do
      begin
      Write('Input ',i+ 1 ,'-th element of ',(i div n)+ 1 ,'-th line: ');
      Readln(m[i]);
      end;

  Calculate;
  OutputMatrix;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

Извините что без подсветки синтаксиса.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35661373
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя объявлено
Код: plaintext
n,i,j: Byte;
и при
Код: plaintext
n*n
можно запросто можно получить переполнение, учти это. После
Код: plaintext
Readln(n);
сразу же выведи значение
Код: plaintext
n
и
Код: plaintext
n*n
обратно для верности, если сомневаешься
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35662236
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TeXpertУ тебя объявлено
Код: plaintext
n,i,j: Byte;
и при
Код: plaintext
n*n
можно запросто можно получить переполнение, учти это. После
Код: plaintext
Readln(n);
сразу же выведи значение
Код: plaintext
n
и
Код: plaintext
n*n
обратно для верности, если сомневаешься

У меня квадратная матрица небольшая, да и меня не этот вопрос сейчас интересует.
Как мне нужно в регистр АХ засунуть элемент массива.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35662409
SLab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeshka
Как мне нужно в регистр АХ засунуть элемент массива.
Код: plaintext
1.
2.
mov ax, word ptr m[ 0 ]

...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35662809
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var
n,i,j: Integer;
m: array [ 0 .. 99 ] of Integer;

procedure Calculate;
label cikl, nextline;
var
 s: Word;
begin
       asm
       mov ax, 0 
       mov bx, 0 
       mov cx, word ptr n
       add cx, word ptr n
       cikl:
       mov dx, word ptr m[bx]
       cmp ax,  0 
       jle nextline
       add s, ax
       nextline:
       add bx, 2 
       dec cx
       jnz cikl
       end;
Writeln('The sum equal is ',s);
end;

На строчке
Код: plaintext
mov dx, word ptr m[bx]
выдает ошибку Access Violation при любом bx, причем строчки
Код: plaintext
1.
2.
3.
 
mov cx, word ptr n
add cx, word ptr n
выполняются успешно, я проверял в отладчике.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35662810
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var
n,i,j: Integer;
m: array [ 0 .. 99 ] of Integer;

procedure Calculate;
label cikl, nextline;
var
 s: Word;
begin
       asm
       mov ax, 0 
       mov bx, 0 
       mov cx, word ptr n
       add cx, word ptr n
       cikl:
       mov dx, word ptr m[bx]
       cmp ax,  0 
       jle nextline
       add s, ax
       nextline:
       add bx, 2 
       dec cx
       jnz cikl
       end;
Writeln('The sum equal is ',s);
end;

На строчке
Код: plaintext
mov dx, word ptr m[bx]
выдает ошибку Access Violation при любом bx, причем строчки
Код: plaintext
1.
2.
3.
 
mov cx, word ptr n
add cx, word ptr n
выполняются успешно, я проверял в отладчике.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35662816
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var
n,i,j: Integer;
m: array [ 0 .. 99 ] of Integer;

procedure Calculate;
label cikl, nextline;
var
 s: Word;
begin
       asm
       mov ax, 0 
       mov bx, 0 
       mov cx, word ptr n
       add cx, word ptr n
       cikl:
       mov dx, word ptr m[bx]
       cmp ax,  0 
       jle nextline
       add s, ax
       nextline:
       add bx, 2 
       dec cx
       jnz cikl
       end;
Writeln('The sum equal is ',s);
end;

На строчке
Код: plaintext
mov dx, word ptr m[bx]
выдает ошибку Access Violation при любом bx, причем строчки
Код: plaintext
1.
2.
3.
 
mov cx, word ptr n
add cx, word ptr n
выполняются успешно, я проверял в отладчике.
...
Рейтинг: 0 / 0
Массивы в Turbo Assembler
    #35662901
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На Турбо Паскале 7.0 вот это прекрасно работает:

Код: plaintext
mov dx, word ptr m[bx]
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Массивы в Turbo Assembler
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]