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