1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
сумма и разность 2-х чисел, не могу разобраться с разностью
Программа находит сумму и разность 2-х чисел, помимо этого записывает в "1.exe" количество запусков, после 10 запусков перестаёт работать. Работаю в TASMe, в ассемблере совсем нуб. Не могу разобраться с разностью... Выводит неправильный результат. Помгите, Plz...
P.S.: файл .asm соответсвенно должен называеться 1.asm, а экзешник 1.exe
;выводим сообщение о вводе числа mov ah,09h mov dx,offset message3 int 21h
;вводим с клавиатуры число mov bx,0 ;номер страницы mov cx, len_string ;записываем количество повторений ввода символа lea dx,string ;записываем символы в массив string mov ah,3fh ;номер функции int 21h sub ax,2 mov bx,ax ;получаем из цифр число mov si,0 ;номер элемента массива string cikl1: cmp si,bx ;сравниваю цифру числа с числом 10, чтобы проверить что была введена цифра с клавиатуры jnb M1 ;если равно, то выходим из цикла mov ax,chislo1 ;записываю число в 10-ной СС в ах mul ten ;умножаю число на 10 sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру add ax,string[si] ;прибавляю к ax цифру числа mov ah,0 mov chislo1,ax ;записываю результат в chislo inc si ;увеличиваю номер элемента на 1 jmp cikl1 ;если меньше, то переходим на cikl1
M1:
;выводим сообщение о вводе числа mov ah,09h mov dx,offset message3 int 21h
;вводим с клавиатуры число mov bx,0 ;номер страницы mov cx, len_string ;записываем количество повторений ввода символа lea dx,string ;записываем символы в массив string mov ah,3fh ;номер функции int 21h sub ax,2 mov bx,ax ;получаем из цифр число mov si,0 ;номер элемента массива string cikl2: cmp si,bx ;сравниваю цифру числа с числом 10, чтобы проверить что была введена цифра с клавиатуры jnb M2 ;если равно, то выходим из цикла mov ax,chislo2 ;записываю число в 10-ной СС в ах mul ten ;умножаю число на 10 sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру add ax,string[si] ;прибавляю к ax цифру числа mov ah,0 mov chislo2,ax ;записываю результат в chislo inc si ;увеличиваю номер элемента на 1 jmp cikl2 ;если меньше, то переходим на cikl1
M2:
cmp chislo1, 0FAh ;правильные ли числа введены? jl z1 jmp err1 Z1: cmp chislo2, 0FAh jl M4 jmp err1
M4:
mov ax, chislo1 ;начало суммы, в ах 1-ое число mov bx, chislo2 ;в bx 2-ое число add bx, ax ;складываем mov chislo3, bx ;результат в chislo3
R2: mov ax, chislo3 ;в ах сумму(модуль разности) mov chast, ax mov si, 0 mov itter, 0 ;обнуляем кол-во повторений cikl3: ;деление на 10, подготовка к выводу mov ax, chast div ten ;делим на 10 mov ost[si], ah ;остаток от деления в ost inc itter ;увеличиваем кол-во повторений mov ah, 0 ;обнуляем ah, в al частное mov chast, ax ;чстное от деления в chast inc si ;увеличиваем эл-т массива ost cmp chast, 0 ;сранвиваем частное с 0 jne cikl3 ;если не равно то повторяем
mov ah,09h ;подфункция вывода строки cmp f, 1 ;смотрим выводилась ли сумма je R3 ;если выводилась mov dx,offset summa ;выводим сообщение сумма int 21h jmp vivod ;уходим на вывод R3: mov dx, offset raznost ;записываем в dx строку разность cmp i, 1 ;смотрим отрицательная или положительбная разность je R4 ;если отрицательная разность int 21h jmp vivod ;уходим на вывод R4: mov dx, offset raznost1 ;записываем в dx сообщение для отрицательной разности int 21h
Vivod: mov si, 4 ;si=4 mov cx, itter ;в cx кол-во повторений mov ah, 02h ;водфункция вывода символа для int 21h cikl4: cmp ost[si], 0 ;сравниваем остаток с нулём jne M3 ;если не равно, то уходим из цикла cmp cx, si ;сраниваем cx И si jg M3 ;если cx больше, то уходим из цикла dec si ;уменьшаем si jmp cikl4 M3: mov dl, ost[si] ;в dl выводимое число add dl, 30h ;преобразуем число в символ int 21h dec si ;уменьшаем si loop cikl4 ;если si не 0 то повторяем cikl4 inc f ;увеличиваем флаг(признак), того выводилась ли уже сумма или нет cmp f, 2 ;сравниваем флаг с 2 je konec ;если вывели разность то выходим
mov ax, chislo1 ;начало разности, в ax 1-ое число mov bx, chislo2 ;в bx 2-ое число mov chislo3, 0h ;обнуляем результат cmp bx, ax ;сравниваем 2-ое число с 1-ым jg R1 ;если больше 2-ое sub ax, bx ;если 1-ое больше, то вычитаем из него 2-ое ; jnc R6 ;так тоже пробывал ; neg ax ;R6: mov chislo3, ax ;результат в chislo3 jmp R2 ;уходим на подготовку и вывод R1: sub bx, ax ;если больше 2-ое вычитаем из него 1-ое ; jnc R5 ; neg bx ;R5: mov chislo3, bx ;результа в chislo3 inc i ;увеличиваем флаг отрицательности разности jmp R2 ;уходим на подготовку и вывод
err1: ;вывод сообщения о том что введено неверное число и выход mov ah, 09h mov dx, offset error1 int 21h jmp konec
jmp konec avaria: mov ah,09h mov dx,offset message2 int 21h mov ah,0 int 16h
konec: mov ax,4c00h int 21h error: mov cx,ax mov ah,09h mov dx,offset errormessage int 21h mov ah,02h mov dl,cl int 21h jmp konec text ends
data segment message db 10,13,'Programma rabotaet$',10,13 message2 db 10,13,'Vremja isteklo',13,10,'Nazhmite lubuju klavishu$',10,13 filename db '2.EXE',0 diskriptor dw 0 header dw 256 dup(0) errormessage db 10,13,'Oshibka rabotji s faylom $' zapusk2 db 0
message3 db 10,13,"Vvedite chislo iz (0;250], $" summa db 10,13,'summa = $',10,13 raznost db 10,13,'raznost = $',10,13 raznost1 db 10,13,'raznost = -$',10,13 error1 db 10,13,'nevernii vvod$',10,13
ost db 4 dup (0) ;массив остатков из 4-х эл-ов chast dw ? ;частное от деления itter dw 0 ;число повторений f db 0 ;флаг суммы i db 0 ;флаг отрицательности разности
string dw 4 dup (0) ;массив, который будет содержать 4 цифры числа len_string =$-string ;длина массива chislo1 dw 0 ;число в 10-ной СС chislo2 dw 0 ;число в 10-ной СС chislo3 dw 0 ;число в 10-ной СС ten db 10 mas db 4 dup (0) ;массив из 4 эл-тов, содержащих число 10, который будет содержать цифры числа в новой СС
data ends
stk segment stack db 256 dup(0) ends
end begin
Сообщение отредактировано: Despot - 19.05.2008 14:49