Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MASM] арифметика элементов масcивов 
V
    Опции темы
dimas_sceen
Дата 18.6.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Здравствуйте!
Помогите решить задачу. Заданы два массива А и В по 20 элементов. Создать массив  С,  элемент  С[i]  которого  равен А[i]-B[i] при A[i]>B[i] и B[i]-A[i] при A[i]<B[i]. Это должна быть функция на ассемблере, которая будет вызивытся с программы на С++.

Код

extern void pr(int ,int *,int *,int *);
.....
//M-розмерность масивов
pr(M,A,B,C);


и код на ассемблере

Код

cseg segment PARA 'CODE'
  Assume cs:cseg
;==========================
_pr proc far
 push bp
mov bp,sp 
    push ds
    pusha

    mov si,[bp+6]
    mov cx,[si]
    mov si,[bp+8]
    mov ax,[bp+10]
    mov ds,ax
    mov di,[bp+12]
    mov bx,[bp+16]
    xor ax,ax
    mov dx,ax
m1: mov ax,[si]
    mov dx,[di]
    cmp ax,dx
    jnl m2
    sub dx,ax
    mov [bx],dx
    jmp m3
m2: sub ax,dx
    mov [bx],ax
m3: add bx,2
    add si,2
    add di,2
    loop m1
    popa
    pop ds
    pop bp
    retf
_pr endp
 cseg ends
end




Сейчас врезультате функция записует чтото в А и B масив C отсается пустым.
Помогите найти ошибки. Спасибо!



PM MAIL   Вверх
Mikl_
Дата 19.6.2009, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



dimas_sceen
Заданы два массива А и В по 20 элементов. Создать массив  С,  элемент  С[i]  которого  равен А[i]-B[i] при A[i]>B[i] и B[i]-A[i] при A[i]<B[i].
Перефорулирую твою задачу if a>=b then a-b>=0 if a<b then a-b<0 отсюда c[i]:=abs(a[i]-b[i])
Код
;pr(M,A,B,C)
;M - размерность массивов
;А - адрес 0-го элемента массива А
;В - адрес 0-го элемента массива В
;С - адрес 0-го элемента массива С
_pr proc far
   push bp
   mov bp,sp 
    push ds
    pusha
    mov cx,[bp+6];размерность массива в байтах но у нас элементы массива слова, 
    shr cx,1; поэтому корректируем содержимое cx 
;хотя если количество элементов известно можно и совсем просто mov cx,20 и никаких параметров в процедуру
    mov si,[bp+8];- адрес 0-го элемента массива А
    mov ax,[bp+10]<-- вот это что за бардак! похоже, что в процедуру ты передаешь пять! параметров а не четыре
    mov ds,ax
    mov bx,[bp+12];адрес 0-го элемента массива В
    mov di,[bp+16];адрес 0-го элемента массива С  
    cld; будем пересылать элементы от младших номеров к старшим  
m1: lodsw; mov ax,[si] si+=2;очередной элемент массива
    sub ax,[bx]; ax:=a[i]-b[i]
    cwd; если ax>=0 dx=0 если ax<0 dx=0FFFFh
    xor ax,dx; если ax>=0 ax не меняется иначе ax:=not ax
    sub ax,dx; если ax>=0 ax не меняется иначе ax:= -ax и тогда ax:=abs(a[i]-b[i])
    stosw; mov [di],ax di+=2
    add bx,2; переходим к следующему элементу массива B    
    loop m1; в цикле обрабатываем массивы A и B
    popa
    pop ds
    pop bp
    retf
_pr endp
 smile как-то так!

Это сообщение отредактировал(а) Mikl_ - 19.6.2009, 06:06
PM MAIL   Вверх
Mikl_
Дата 19.6.2009, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



dimas_sceen
добавь после mov ds,ax строку mov es,ax
PM MAIL   Вверх
dimas_sceen
Дата 19.6.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Mikl_,
В массив С записует только результат при B[i]>A[i].
A при A[i]>B[i] не записует.


Цитата

Перефорулирую твою задачу if a>=b then a-b>=0 if a<b then a-b<0 отсюда c[i]:=abs(a[i]-b[i])

Немного не так.
Нужно
if a>=b then a-b>=0 
if a<b then b-a>0 

Это сообщение отредактировал(а) dimas_sceen - 19.6.2009, 11:12
PM MAIL   Вверх
Mikl_
Дата 19.6.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



dimas_sceen
Я не понял -- моя программа не работает, или ты техзадание меняешь?
Что значит "Нужно
if a>=b then a-b>=0 
if a<b then b-a>0
 

if a>=b then с = a-b = |a - b|
if a<b then c= b-a = -(a-b) = |a - b| smile 


PM MAIL   Вверх
dimas_sceen
Дата 19.6.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Цитата(Mikl_ @ 19.6.2009,  12:28)
dimas_sceen
Я не понял -- моя программа не работает, или ты техзадание меняешь?
Что значит "Нужно
if a>=b then a-b>=0 
if a<b then b-a>0
 

if a>=b then с = a-b = |a - b|
if a<b then c= b-a = -(a-b) = |a - b| smile

Извини, я нетак понял.
Техзадание тоже. 
От 2 результата функции.

1-й
user posted image

2-й
user posted image

Масив С инициализирован значениями "-1"

PM MAIL   Вверх
Mikl_
Дата 19.6.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



dimas_sceen
внимательно просмотри текст программы -- у тебя ошибка smile 
PM MAIL   Вверх
turbanoff
Дата 19.6.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009

Репутация: нет
Всего: 1



есть предложение, вместо мудреных операций нахождения модуля числа просто, сравнить ax с 0
Код

   cmp ax, 0
   jg m2
   neg ax
 m2:
   ;....

и если надо применить neg

так я считаю, хотя бы понятней....

Это сообщение отредактировал(а) turbanoff - 19.6.2009, 15:11
PM MAIL   Вверх
dimas_sceen
Дата 19.6.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Цитата(Mikl_ @ 19.6.2009,  15:01)
dimas_sceen
внимательно просмотри текст программы -- у тебя ошибка smile

Код

;********
  .286
;********

PUBLIC _pr

cseg segment PARA 'CODE'
  Assume cs:cseg
;==========================
_pr proc far
   push bp
   mov bp,sp 
    push ds
    pusha
    mov cx,[bp+6];размерность массива в байтах но у нас элементы массива слова, 
    shr cx,1; поэтому корректируем содержимое cx 
;хотя если количество элементов известно можно и совсем просто mov cx,20 и никаких параметров в процедуру
    mov si,[bp+8];- адрес 0-го элемента массива А
    mov ax,[bp+10];<-- вот это что за бардак! похоже, что в процедуру ты передаешь пять! параметров а не четыре
    mov ds,ax
    mov es,ax
    mov bx,[bp+12];адрес 0-го элемента массива В
    mov di,[bp+16];адрес 0-го элемента массива С  
    cld; будем пересылать элементы от младших номеров к старшим  
m1: lodsw; mov ax,[si] si+=2;очередной элемент массива
    sub ax,[bx]; ax:=a[i]-b[i]
    cwd; если ax>=0 dx=0 если ax<0 dx=0FFFFh
    xor ax,dx; если ax>=0 ax не меняется иначе ax:=not ax
    sub ax,dx; если ax>=0 ax не меняется иначе ax:= -ax и тогда ax:=abs(a[i]-b[i])
    stosw; mov [di],ax di+=2
    add bx,2; переходим к следующему элементу массива B    
    loop m1; в цикле обрабатываем массивы A и B
    popa
    pop ds
    pop bp
    retf
_pr endp
 cseg ends
end



Код

#include<dos.h>
#include<stdio.h>
#include<conio.h>
#define M 15
extern void pr(int ,int *,int *,int *);

main()
{
 int A[M],B[M],C[M],i;
 clrscr();
 textcolor(10);
 for(i=0; i<M; i++)
 {
     A[i]=i;
     B[i]=M-i;
     C[i]=-1;
     cprintf("A[%d]= %d B[%d]= %d \n\r",i,A[i],i,B[i]);
 }
 getch();
 /************************/
    pr(M,A,B,C);
 /************************/
 for(i=0; i<M; i++)
 {
     cprintf("A[%d] = \"%d\"     ",i,A[i]);
     cprintf("B[%d] = \"%d\"     ",i,B[i]);
     cprintf("C[%d] = \"%d\" \n\r",i,C[i]);
 }
 getch();




Вроде все правельно, но не работает так как нада   smile 

Это сообщение отредактировал(а) dimas_sceen - 19.6.2009, 16:02
PM MAIL   Вверх
Mikl_
Дата 22.6.2009, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



dimas_sceen
убери 16 строку shr cx,1 и будет тебе счатье!
PM MAIL   Вверх
dimas_sceen
Дата 23.6.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Mikl_
Спасибо за помощь, все работает как нада  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0837 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.