|
|
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, мне очень сильно нужна ваша помощь, возможно данная тему уже поднималась, но я не смог ничего найти, поэтому написал так! Данная программа должна подсчитывать сумму от 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 21:52 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Vladimir1111Данная программа должна подсчитывать сумму от 0 до n y=(b+c*b-a/4)/(a*b-1). С клавиатуры задаются переменные a,b,c и количество интеграций n. ничего не понял сумму чего? при чем тут какие-то y,b,c,a и странная формула? и нафига какие-то массивы в программе, что бы подсчитать "сумму"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 16:13 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevVladimir1111Данная программа должна подсчитывать сумму от 0 до n y=(b+c*b-a/4)/(a*b-1). С клавиатуры задаются переменные a,b,c и количество интеграций n. ничего не понял сумму чего? при чем тут какие-то y,b,c,a и странная формула? и нафига какие-то массивы в программе, что бы подсчитать "сумму"? я ваще не понял, кого он на асемблере пытаеться надурить! да даже в высокоуровневом языке трудно вериться в пока не смог сделать ввод н...тоесть другие величины смог, а вот одна - несмог. ну ересь... скопипастил задачу откудато горе студент, и терь голову ломает - как не уча ассемблер - сделать её рабочей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 18:11 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Да ладно ассемблер. Он бы хоть исходную задачу скопи-пастил корректно, а не сделав ее набором каких-то бессвязных слов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 18:32 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Vladimir1111, сомневаюсь что в нашем форуме есть энтузиасты которые будут копать твой код. Ассемблер давно не в фаворе и компилляторов под рукой почти не осталось. Но попробуй закомментарив или побив его на части посчитать следующие кейсы, значения которых ты 100% знаешь. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. А потом в самом конце снова Код: sql 1. Поверь это будет самый быстрый способ тем более что, дебаггером ты скорее всего еще не умеешь пользоваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 19:27 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Сделайте свою формулу на форте (это проще), после этого использованное подмножество форта реализуйте на ассемблере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 12:08 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
For AllСделайте свою формулу на форте (это проще) Это... совет автору? Или мне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 18:05 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
maytonFor AllСделайте свою формулу на форте (это проще) Это... совет автору? Или мне? Автору ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2014, 12:35 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Vladimir1111, ваша формула не зависит от индекса суммы. А ему бы подошёл такой вариант: написать эту программу на каком-либо языке высокого уровня, а потом дизассемблировать её и сдать ?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 06:37 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Позже, если не забуду, напишу эту программу на MIXAL. Но позже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 06:42 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryА ему бы подошёл такой вариант: написать эту программу на каком-либо языке высокого уровня, а потом дизассемблировать её и сдать ?) 1. Дизассемблировать не нужно,приличные компиляторы давно имеют ключик - создать ассемблерное порождение 2. Компилятор нужно искать под 16 бит, далее - очень аккуратно вызовы рантайма выкусить, ввод вывод - ручками прописать (или ассемблерные вставки сразу делать в программе на ЯВУ) PS при наличии соотв навыков писать можно сразу на асме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 07:13 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Изопропил2. Компилятор нужно искать под 16 бит, далее - очень аккуратно вызовы рантайма выкусить, ввод вывод - ручками прописать (или ассемблерные вставки сразу делать в программе на ЯВУ) PS при наличии соотв навыков писать можно сразу на асме +1 Для изучающих АСМ это хорошо. Только нужно фильтровать "лишний" код который продуцирует компиллятор высокого уровня. Препод попалит - будет стыд и позор. Тема - АСМ значит нужен именно pure-АСМ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 12:14 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
mayton...Для изучающих АСМ это хорошо. Только нужно фильтровать "лишний" код который продуцирует компиллятор высокого уровня. Препод попалит - будет стыд и позор. Тема - АСМ значит нужен именно pure-АСМ. Там еще другая проблема, оптимизирующий компилятор генерит такой код, что и палить не нужно. Такие выверты не в каждом technical guide от Intel'а прочтешь, а авторы компилятора их знают. В общем, учиться по коду от оптимизирующего компилятора - задача опасная. Простейшие операции и циклы могут породить код "левой пяткой почесать в правом ухе" дабы так быстрее. Без пол-бутылки старинного русского напитка - не разберешься. Учиться по такому коду, сопьешься быстрее, чем ассемблер выучишь. Если же опция оптимизации выключена, код становится "дубовым". Взяли из памяти в аккумулятор, добавили, сохранили, обратно взяли из памяти... тут уже действительно придется ручками "вычищать" AFAIK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 15:56 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
Я думал о ПОЛИЗ-е и цепной дроби недавно ( https://ru.wikipedia.org/wiki/Непрерывная_дробь) в разрезе Java. IMHO ее красиво можно закодить зная байткод или ассемблер для Java. На языках высокого уровня - хрен такое опишешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 16:01 |
|
||
|
Подсчёт суммы в ассемблере (TASM)
|
|||
|---|---|---|---|
|
#18+
maytonЯ думал о ПОЛИЗ-е и цепной дроби недавно ( https://ru.wikipedia.org/wiki/Непрерывная_дробь) в разрезе Java. IMHO ее красиво можно закодить зная байткод или ассемблер для Java. На языках высокого уровня - хрен такое опишешь. не очень понял. Объясните пожалуйста ещё раз :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 01:51 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=40&tid=1341164]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 368ms |

| 0 / 0 |
