Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Массивы в Turbo Assembler / 13 сообщений из 13, страница 1 из 1
17.11.2008, 23:33:06
    #35659177
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
Найти сумму всех положительных элементов квадратной матрицы.

Код: 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
18.11.2008, 00:44:00
    #35659261
Quartz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
JNA как раз не учитывает знак. Исправьте на JLE nextline.
...
Рейтинг: 0 / 0
18.11.2008, 17:13:10
    #35661246
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
Спасибо 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
18.11.2008, 17:26:35
    #35661294
TeXpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
А n почему не инициализован?
...
Рейтинг: 0 / 0
18.11.2008, 17:30:51
    #35661316
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
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
18.11.2008, 17:31:48
    #35661318
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
Код: 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
18.11.2008, 17:52:44
    #35661373
TeXpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
У тебя объявлено
Код: plaintext
n,i,j: Byte;
и при
Код: plaintext
n*n
можно запросто можно получить переполнение, учти это. После
Код: plaintext
Readln(n);
сразу же выведи значение
Код: plaintext
n
и
Код: plaintext
n*n
обратно для верности, если сомневаешься
...
Рейтинг: 0 / 0
19.11.2008, 09:01:19
    #35662236
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
TeXpertУ тебя объявлено
Код: plaintext
n,i,j: Byte;
и при
Код: plaintext
n*n
можно запросто можно получить переполнение, учти это. После
Код: plaintext
Readln(n);
сразу же выведи значение
Код: plaintext
n
и
Код: plaintext
n*n
обратно для верности, если сомневаешься

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

...
Рейтинг: 0 / 0
19.11.2008, 11:52:50
    #35662809
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
Код: 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
19.11.2008, 11:52:53
    #35662810
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
Код: 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
19.11.2008, 11:53:50
    #35662816
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
Код: 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
19.11.2008, 12:15:49
    #35662901
Evgeshka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы в Turbo Assembler
На Турбо Паскале 7.0 вот это прекрасно работает:

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


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