Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2014, 10:47   #1
necromicus
Новичок
Джуниор
 
Регистрация: 23.01.2014
Сообщений: 3
По умолчанию Вычислить сумму квадратов чисел от 1 до N. N≤100

Помогите с прогой. Не могу понять где косяк. Не работает.
Код:
%nolist
include mac.lib
%list

data segment para
n	dw	?
s	dw	?

mes1 db 10,13,'n=$'
mes2 db 10,13,'s=$'
mes3 db 10,13,'nedopustimoe znachenie$'
data ends
stk	 segment	para
db 256 dup(?)
stk ends
code	segment para
assume ds:data,ss:stk, cs:code
start: mov	ax,data
mov ds,ax
; инициализация ds выполнена
message mes1
key_$2bin
mov n,ax

mov ax,n
cmp ax,0
jg m1

mov ax,n
cmp ax,100
jl m1


m3:mov ax,n;	n->ax
imul n;	ax*ax
add cx,ax
mov cx,ax
sub n,1;	ax-1
jne m3
jmp m2

m1: mov ah,9
mov dx, offset mes3
int 21H
jmp exit

m2: mov ah,9
mov dx, offset mes2
int 21H
jmp exit

PRINT_NUMBER
exit: mov ah,4Ch
int 21h
code ends
end start
end
Вложения
Тип файла: rar MAC.rar (7.8 Кб, 6 просмотров)

Последний раз редактировалось necromicus; 23.01.2014 в 13:58.
necromicus вне форума Ответить с цитированием
Старый 23.01.2014, 14:03   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, когда Вы пишете:
Цитата:
Код:
add cx,ax
то результат суммирования получается в cx, не надо его уничтожать содержимым ax:
Цитата:
Код:
mov cx,ax  <- это явно ошибка!
во-вторых.
но это всё не главное..
я прикинул сейчас сумму, там получается 338350
это число явно больше, чем может вместить в себя один 16-битный регистр (если не ошибаюсь, Вы сумму накапливаете в cx ?).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.01.2014, 14:48   #3
necromicus
Новичок
Джуниор
 
Регистрация: 23.01.2014
Сообщений: 3
По умолчанию

да, сумма копится в сх. Разве используя
Код:
add cx,ax
я не суммирую cx c ax и оставляю это в регистре сх. Насчет переполнения вы правы. А если применить cwd (расширение до 2 слов)?
necromicus вне форума Ответить с цитированием
Старый 23.01.2014, 15:38   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
да, сумма копится в сх. Разве используя
Код:
add cx,ax
я не суммирую cx c ax и оставляю это в регистре сх.
всё так.
Но вы посмотрите, Вы следующей командой портите результат суммирования!!
Код:
imul n          ;	ax*ax
add cx,ax     ;	сx := cx + ax
mov cx,ax       ;	потеряли результат суммирования!!!

А насчёт cwd не подскажу, у меня знаний и опыта не хватает, а лазить по доками сейчас нет свободного времени!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.01.2014, 07:25   #5
necromicus
Новичок
Джуниор
 
Регистрация: 23.01.2014
Сообщений: 3
По умолчанию

все равно не помогает, я просто убрал эту строку и пытался менять местами регистры
necromicus вне форума Ответить с цитированием
Старый 24.01.2014, 08:57   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

код, который работает при малых значениях n (при n<=45)

Код:
%nolist
include mac.lib
%list

data segment para
n       dw      ?
s       dw      ?

mes1 db 10,13,'n=$'
mes2 db 10,13,'s=$'
mes3 db 10,13,'nedopustimoe znachenie$'
data ends
stk      segment        para
db 256 dup(?)
stk ends
code    segment para
assume ds:data,ss:stk, cs:code
start: 
  mov      ax,data
  mov ds,ax
  ; инициализация ds выполнена

  message mes1

  key_$2bin

  mov n,ax

  cmp ax,1
  jl wrongNumber

  cmp ax,45   ; свыше 45 и подсчёт и тем более процедура вывода результата  НЕ ГОДЯТСЯ!
  jg wrongNumber

  mov cx,0
m3:
  mov ax,n;    n->ax
  imul n; ax*ax
  add cx,ax
  sub n,1;        ax-1
  jne m3
  jmp writeSum

wrongNumber: 
  message mes3
  jmp exit

writeSum: 
  message mes2

  mov ax, cx
  PRINT_NUMBER

exit: 
 
  ;ожидание нажатия любой клавиши и выход 
  mov ah, 01h
  int 21h

  mov ah,4Ch
  int 21h
code ends
end start
end

Последний раз редактировалось Serge_Bliznykov; 24.01.2014 в 09:40.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.01.2014, 13:50   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

процедуру вычисления можно заменить на такую:

Код:
  mov ax,0
  mov dx,0
m3:
  push ax
  push dx
  mov ax,n;    n->ax
  imul n; ax*ax
  mov bx, dx
  mov cx, ax
  pop dx
  pop ax
  add ax,cx
  adc dx,bx
  sub n,1;        ax-1
  jne m3
  jmp writeSum
вычисление сделано очень не оптимально, "в лоб", зато работает корректно!

результат будет в двух регистрах (double word):
в dx старшее слово
в ax младшее слово.

Но для вывода данного числа на экран Вам потребуется процедура, которая работает с двойным словом...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пользователь вводит действительные числа a, b, c,.d. Если а ≤ b ≤ c ≤ d, то каждое число заменить наибольшим из них. Vanya_11 Помощь студентам 0 25.05.2013 20:02
Вычислить сумму квадратов простых чисел (PascalABC)! Amid1990 Помощь студентам 5 04.07.2011 14:08
Вычислить сумму квадратов kuholor Помощь студентам 4 20.10.2010 16:42
[Pascal] Вычислить сумму квадратов элементов, кратных 3. eliminate Паскаль, Turbo Pascal, PascalABC.NET 3 24.05.2010 14:25