IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> сумма и разность 2-х чисел, не могу разобраться с разностью
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Программа находит сумму и разность 2-х чисел, помимо этого записывает в "1.exe" количество запусков, после 10 запусков перестаёт работать. Работаю в TASMe, в ассемблере совсем нуб. Не могу разобраться с разностью... Выводит неправильный результат. Помгите, Plz...

P.S.: файл .asm соответсвенно должен называеться 1.asm, а экзешник 1.exe

text segment

text segment
assume cs:text,ds:data,ss:stk

zapusk db 0

begin:

mov ax,data
mov ds,ax

cmp cs:zapusk,10
jne J1
jmp avaria

J1:

mov bh,cs:zapusk
add bh,1
mov zapusk2,bh

mov ah,09h
mov dx,offset message
int 21h

;otkritie fayla
mov ah,3dh
mov al,2
mov dx,offset filename
int 21h
jnc J2
jmp error

J2:

mov diskriptor,ax
;chtenie zagolovka
mov ah,3fh
mov bx,diskriptor
mov cx,512
mov dx,offset header
int 21h
jnc J3
jmp error

J3:
;poisk jacheyki dlja hranenija chisla zapuskov
mov dx,header+08h
add dx,header+16h
mov cl,4
shl dx,cl
mov cx,0
mov ah,42h
mov al,0
mov bx,diskriptor
int 21h
jnc J4
jmp error
;zapis v fayl
J4:

mov ah,40h
mov bx,diskriptor
mov cx,1
mov dx,offset zapusk2
int 21h
jnc P1
jmp error

P1:





;выводим сообщение о вводе числа
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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Всем наиагроооооооооооооомнейшее спасибо!!! я сам разобрался уже

Сообщение отредактировано: Despot -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 19:10
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name