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

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

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

 
 Ответить  Открыть новую тему 
> Оформить программу в виде прерывания, Подскажите почему не работает?
Neon6868
сообщение 23.04.2008 18:05
Сообщение #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 - 23.04.2008 18:56
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

- Текстовая версия 28.07.2025 10:19
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"