powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Подсчёт суммы в ассемблере (TASM)
16 сообщений из 16, страница 1 из 1
Подсчёт суммы в ассемблере (TASM)
    #38794400
Vladimir1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, мне очень сильно нужна ваша помощь, возможно данная тему уже поднималась, но я не смог ничего найти, поэтому написал так! Данная программа должна подсчитывать сумму от 0 до n y=(b+c*b-a/4)/(a*b-1). С клавиатуры задаются переменные a,b,c и количество интеграций n. К моему великому сожалению, почему то данная программа при вводе любых значений (пока не смог сделать ввод n, по этому он подсчитывает от 0 до 4) выдаёт неправильную сумму, где ошибка и как её исправить я не знаю, надеюсь на вашу помощь!

.model small
.stack 200h
.data

a db ?
b db ?
c db ?

q dw ?
p dw ?
y dw ?
t dw 4

D16 db '0123456789ABCDEF'
BUF db 4 DUP (20h),13,10,'$'
str1 db 'Resultat',13,10,'$'

.code

funk1 proc near ;расчет q
mov AL, a ;AL=a
cbw
mov BL, b ;BL=b
imul BL ;AL=AL*B
mov BX, 1
sub AX, BX ;AL=AL-1
mov q, AX ;q=AX
mov AX, 0 ;AX=0
mov BX, 0 ;BX=0
ret
funk1 endp

funk2 proc near ;расчет p
mov AL, b ;AL=b
cbw
mov p, AX ;p=AX
mov AX, 0 ;AX=0
mov AL, c ;AL=c
cbw
mov BL, b ;BL=b
imul BL ;AX=AX*BL
adc AX, p ;AX=AX+b
mov p, AX ;p=AX
mov AX, 0 ;AX=0
mov AL, a ;AX=a
cbw
mov BL, 4 ;BX=4
idiv BL ;AX=AX/BX
sub p, AX
mov AX, 0
ret
funk2 endp

InputInt proc
mov ah, 0ah
xor di, di
mov dx, offset buff ;адрес буфера
int 21h ;принимаем строку
mov dl, 0ah
mov ah, 02
int 21h
; выводим перевод строки и обрабатываем
; содержимое буфера
mov si, offset buff+2 ; берем адрес начала строки
cmp byte ptr [si], "-" ; если первый символ минус
jnz ii1
mov di, 1 ; устанавливаем флаг
inc si ; и пропускаем его
ii1: xor ax, ax
mov bx, 10 ; основание сc

ii2: mov cl, [si] ; берем символ из буфера
cmp cl, 0dh ; проверяем не последний ли он
jz endin
; если символ не последний, то проверяем его
; на правильность
cmp cl, '0' ; если введен неверный символ <0
jl er
cmp cl, '9' ; если введен неверный символ >9
ja er
sub cl, '0' ; делаем из символа число
mul bx ; умножаем на 10
add ax, cx ; прибавляем к остальным
inc si ; указатель на следующий символ
jmp ii2 ; повторяем
er: mov dx, offset error ; если была ошибка, то выводим сообщение об
; этом и выходим

mov ah,09
int 21h
int 20h ; все символы из буфера обработаны число
; находится в ax
endin: cmp di,1 ; если установлен флаг, то
jnz ii3
neg ax ; делаем число отрицательным
ii3: ret
error db "incorrect number$"
buff db 6,7 Dup(?)
InputInt endp

OutInt proc near ;=====Процедура вывода
test ax, ax ; проверяем число на знак.
jns oi1
mov cx, ax ; eсли оно отрицательное, выведем минус и
; оставим его модуль
mov ah, 02h
mov dl, '-'
int 21h
mov ax, cx
neg ax
oi1: xor cx, cx ; количество цифр будем держать в CX
mov bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2: xor dx, dx
div bx ;делим число на основание сс, в остатке
;получается последняя цифра
push dx ;сразу выводить её нельзя, поэтому сохраним
;её в стэке
inc cx
; а с частным повторяем то же самое, отделяя
; от него очередную
test ax, ax ; цифру справа, пока не останется ноль, что
;значит, что дальше
jnz oi2 ; слева только нули

;========Вывод=========
mov ah, 02h
oi3: pop dx
add dl, '0' ; извлекаем очередную цифру, переводим её в
; символ и выводим
int 21h
loop oi3 ; повторим ровно столько раз, сколько цифр
; насчитали
ret
OutInt endp

Begin:
mov ax, @Data
mov ds, ax

call InputInt ; ввод числа а
mov a, AL
call InputInt ; ввод числа b
mov b, AL
call InputInt ; ввод числа с
mov c, AL

call funk1 ;вызов funk1
mov CX, 0
LEA BX, D16
mov AX, q
mov DX, AX ;DX:=AX
call OutInt

call funk2 ;вызов funk2
mov CX, 0
LEA BX, D16
mov AX, p
mov DX, AX ;DX:=AX
call OutInt

mov SI, 0
mov CX, 4
mov y, 0
mov AX, 0

per: mov BX, p ;AL=p (до этого было BX)
cbw
idiv q ;AL=AL/q
cbw

adc y, AX ;y=y+AX
add SI, 1 ;SI=SI+1
loop per ;безусловный переход к per

mov CX, 0
LEA BX, D16
mov AX, y
mov DX, AX ;DX:=AX

call OutInt

mov AX,4c00h ; 4c00h
int 21h
end Begin
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38796508
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir1111Данная программа должна подсчитывать сумму от 0 до n y=(b+c*b-a/4)/(a*b-1). С клавиатуры задаются переменные a,b,c и количество интеграций n.
ничего не понял
сумму чего? при чем тут какие-то y,b,c,a и странная формула?
и нафига какие-то массивы в программе, что бы подсчитать "сумму"?
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38796641
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevVladimir1111Данная программа должна подсчитывать сумму от 0 до n y=(b+c*b-a/4)/(a*b-1). С клавиатуры задаются переменные a,b,c и количество интеграций n.
ничего не понял
сумму чего? при чем тут какие-то y,b,c,a и странная формула?
и нафига какие-то массивы в программе, что бы подсчитать "сумму"?


я ваще не понял, кого он на асемблере пытаеться надурить! да даже в высокоуровневом языке трудно вериться в

пока не смог сделать ввод н...тоесть другие величины смог, а вот одна - несмог.

ну ересь... скопипастил задачу откудато горе студент, и терь голову ломает - как не уча ассемблер - сделать её рабочей.
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38796662
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ладно ассемблер. Он бы хоть исходную задачу скопи-пастил корректно, а не сделав ее набором каких-то бессвязных слов.
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38796696
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir1111, сомневаюсь что в нашем форуме есть энтузиасты которые будут копать твой код.
Ассемблер давно не в фаворе и компилляторов под рукой почти не осталось.

Но попробуй закомментарив или побив его на части посчитать следующие кейсы, значения которых ты 100% знаешь.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
y=b

y=c*b

y=(b+c*b)

y=(b+c*b-a/4)

----

y=(a*b)

y=(a*b-1)



А потом в самом конце снова

Код: sql
1.
y=(b+c*b-a/4)/(a*b-1)



Поверь это будет самый быстрый способ тем более что, дебаггером ты скорее всего еще не умеешь
пользоваться.
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38797139
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделайте свою формулу на форте (это проще), после этого использованное подмножество форта реализуйте на ассемблере.
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38797621
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For AllСделайте свою формулу на форте (это проще)
Это... совет автору? Или мне?
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38798378
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonFor AllСделайте свою формулу на форте (это проще)
Это... совет автору? Или мне? Автору
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38801470
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir1111,

ваша формула не зависит от индекса суммы.

А ему бы подошёл такой вариант: написать эту программу на каком-либо языке высокого уровня, а потом дизассемблировать её и сдать ?)
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38801474
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Позже, если не забуду, напишу эту программу на MIXAL. Но позже
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38801484
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА ему бы подошёл такой вариант: написать эту программу на каком-либо языке высокого уровня, а потом дизассемблировать её и сдать ?)
1. Дизассемблировать не нужно,приличные компиляторы давно имеют ключик - создать ассемблерное порождение
2. Компилятор нужно искать под 16 бит, далее - очень аккуратно вызовы рантайма выкусить,
ввод вывод - ручками прописать (или ассемблерные вставки сразу делать в программе на ЯВУ)

PS при наличии соотв навыков писать можно сразу на асме
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38801828
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил2. Компилятор нужно искать под 16 бит, далее - очень аккуратно вызовы рантайма выкусить,
ввод вывод - ручками прописать (или ассемблерные вставки сразу делать в программе на ЯВУ)

PS при наличии соотв навыков писать можно сразу на асме
+1

Для изучающих АСМ это хорошо. Только нужно фильтровать "лишний" код который
продуцирует компиллятор высокого уровня.

Препод попалит - будет стыд и позор. Тема - АСМ значит нужен именно pure-АСМ.
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38802305
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...Для изучающих АСМ это хорошо. Только нужно фильтровать "лишний" код который
продуцирует компиллятор высокого уровня.

Препод попалит - будет стыд и позор. Тема - АСМ значит нужен именно pure-АСМ.
Там еще другая проблема, оптимизирующий компилятор генерит такой код, что и палить не нужно. Такие выверты не в каждом technical guide от Intel'а прочтешь, а авторы компилятора их знают.

В общем, учиться по коду от оптимизирующего компилятора - задача опасная. Простейшие операции и циклы могут породить код "левой пяткой почесать в правом ухе" дабы так быстрее. Без пол-бутылки старинного русского напитка - не разберешься. Учиться по такому коду, сопьешься быстрее, чем ассемблер выучишь.

Если же опция оптимизации выключена, код становится "дубовым". Взяли из памяти в аккумулятор, добавили, сохранили, обратно взяли из памяти... тут уже действительно придется ручками "вычищать"

AFAIK.
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38802310
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думал о ПОЛИЗ-е и цепной дроби недавно ( https://ru.wikipedia.org/wiki/Непрерывная_дробь) в разрезе Java.

IMHO ее красиво можно закодить зная байткод или ассемблер для Java. На языках высокого уровня - хрен
такое опишешь.
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38802904
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ думал о ПОЛИЗ-е и цепной дроби недавно ( https://ru.wikipedia.org/wiki/Непрерывная_дробь) в разрезе Java.

IMHO ее красиво можно закодить зная байткод или ассемблер для Java. На языках высокого уровня - хрен
такое опишешь.

не очень понял. Объясните пожалуйста ещё раз :)
...
Рейтинг: 0 / 0
Подсчёт суммы в ассемблере (TASM)
    #38803014
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то у нас была дискуссия. Где я и ДивиженХ обсуждали стековые машины.
Не могу найти.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Подсчёт суммы в ассемблере (TASM)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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