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

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

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

 
 Ответить  Открыть новую тему 
> Оформить программу в виде прерывания, Подскажите почему не работает?
сообщение
Сообщение #1


Пионер
**

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

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


Надо оформить программу перевода чисел из 10-ной системы счисления в 15-ричную в виде прерывания. Надо перехватить свободное програмное прерывание и заменить его на своё. Потом вернуть стандартное прерывание. Процедуре обработки прерывания надо передать число, которое надо перевести (его я ввожу с клавиатуры). [b]Программа перевода чисел правильная, а вот после оформления в виде прерывания программа не работает. Я наверно что-то неправильно делаю. Объясните плиз что не так.
Программа:

model small
stack 100h
.data
tekst db "Vvedite chislo ne bolee 4-x cifr:",'$' ;сообщение ввести число
string db 6 dup (0) ;массив, который будет содержать 4 цифры числа
len_string =$-string ;длина массива
delitel db 15 ;основание новой системы счисления
mas db 6 dup (0) ;массив из 4 эл-тов, содержащих число 10, который будет содержать цифры числа в новой СС
chislo1 db 0
chislo dw 0 ;число в 10-ной СС
ten db 10
tekst2 db "Chislo v 15-richnoi SS:",'$'
ost dw 0
sto db 100
tekst3 db "Oshibka!",'$'
smesh dw 0
segm dw 0
.code

my_proc proc
.code
pushf
push ds es ax di bx cx
mov ax, @data
mov ds, ax
;перевод в 15-ричную СС
mov si,0
cikl2:
mov ax,bx
div delitel ;делю число в 10-ной СС на 15
mov mas[si],ah
inc ost
mov ah,0
mov chislo,ax
inc si
cmp chislo,0
jne cikl2

;замена цифр остатков, если они от 10 до 14, на буквы
mov si,0
zamena:
cmp si,ost
jnb vivod
cmp mas[si],10
jb net
add mas[si],55
inc si
jmp zamena
net:
add mas[si],30h
inc si
jmp zamena

;вывод символов на экран
vivod:
mov ax,0B800h
mov es,ax
mov di,0C8Ah
mov si,ost
mov cx,ost
mov ah,02h
cikl3:
cmp mas[si],0
jne m2
dec si
jmp cikl3
m2:
mov al,mas[si]
mov es:[di],ax
dec si
loop cikl3

pop cx bx di ax es ds
popf
jmp dword ptr cs:[smesh]
iret
my_proc endp
start:
mov ax,@data
mov ds,ax

;выводим сообщение о вводе числа
mov ah,09h
mov dx,offset tekst
int 21h

;вводим с клавиатуры число
mov bx,0 ;номер страницы
mov cx, len_string ;записываем количество повторений ввода символа
lea dx,string ;записываем символы в массив string
mov ah,3fh ;номер функции
int 21h
jnc dal
mov ah,09h
mov dx,offset tekst3
int 21h
jmp exit
dal:
mov bx,ax
sub bx,2

;получаем из цифр число
mov si,0
mov ost,0
cikl1:
cmp bx,4
je n1
cmp bx,3
je n2
cmp bx,2
je n3
cmp bx,1
je n4
cmp bx,0
je n5
n1:
sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру
mov al,string[si] ;записываю число в 10-ной СС в ах
mul ten
mul sto
add chislo,ax
jmp n5
n2:
sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру
mov al,string[si] ;записываю число в 10-ной СС в ах
mul sto
add chislo,ax
jmp n5
n3:
sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру
mov al,string[si] ;записываю число в 10-ной СС в ах
mul ten
add chislo,ax
jmp n5
n4:
sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру
mov al,string[si]
add chislo,ax
n5:
dec bx
inc si
inc ost
cmp bx,0
jne cikl1
mov bx,chislo

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


mov ah,35h
mov al,10h
int 21h
mov cs:[smesh],bx
mov cs:[segm],es
mov ah,25h
mov al,10h
mov dx,offset my_proc
push cs
pop ds
int 21h

int 10h

mov ah,25h
mov al,10h
mov dx,cs:[smesh]
mov ds,cs:[segm]
int 21h

exit:
mov ax,4c00h
int 21h
end start



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

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

 





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