Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Сакен
0 / 0 / 1
Регистрация: 23.08.2010
Сообщений: 66
1

интереснейшее программное прерывание

31.03.2011, 19:07. Просмотров 2232. Ответов 26
Метки нет (Все метки)

всем еще раз привет! в одной из веток я спрашивал про подсчет факториала на ассемблере, и вроде начал понимать- что с чем едят, но на самом деле задание к лабораторной работе у меня более широкое. Приведу его полностью, ну и приведу то, что я сделал (у меня есть костяк, на основе которого и необходимо выполнить задание)
думаю, что из кода программы, который я приведу, все будет ясно
Цель работы:
освоить принципы построения программ обработки прерываний и обращение к ним командой INT.
Индивидуальное задание:
вычислить N! для числа в формате двойного слова. Предусмотреть ошибки:
число отрицательное, переполнение двойного слова и число размещется в слове.
Задание:
1. составить подпрограмму обработки программного прерывания с косвенным обращением к одной из нескольких подпрограмм по номеру, разместить ее в отдельном кодовом сегменте.
в моей программе в подпрограммы, к которым мы обращаемся по номеру,- нужно занести:
а. вывод начальных данных- что-то вроде- "Введите число", ну и прочитать это число
б. расчет факториала
в. вывод результата- число F (F=N!), если мы обратимся к этой подпрограмме
2. составить еще одну подпрограмму обработки прерывания для выдачи сообщений по коду ошибки в регистре AX, разместить ее в отдельном кодовом сегементе.
в моем случае в этом кодовом сегменте нужно разместить обработку ошибок:
а. число отрицательное
б. переполнение двойного слова
в. число размещается в слове...
получается следующее-
- если входное число- отрицательное, то обращаемся к подпрограмме, которая выводит сообщение о том, что число отрицательное, и выходим из программы
- если после расчета факториала (п. 1.(б) ) произошло переполнение слова, то также выводим сообщение о ошибке, и выходим из программы
- если после расчета факториала (п. 1. (б) ) число размещается в слове, то аналогично выводим сообщение о том, что результат не выходит за пределы слова, и прекращаем работу нашей программы.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
; Обработка программных прерываний
;
; Вычислить N! для числа в формате двойного
; слова. Ошибки:
; число отрицательное
; переполнение двойного слова
; число размещается в слове.
 
; Шапка программы        
title   myprog8
    page    52,72   ; формат страницы листинга:
    ; строк на странице -52, символов в строке - 72
    include macroio.inc ;подключение б-ки макроопределений
; Сегменты данных и стека
Data    segment
cr  equ 13  ; символ возврат каретки
lf  equ 10  ; символ перевода строки
N   dw  ?   ;
F   dd  ?
nm  equ 1
n2  dw  nm
str0    db  'Вычислим факториал числа $'
str1       db           'Введите число'
str2    db  'Факториал числа равен $'
strm    db  240 dup (?) ; строка для вывода чисел
Data    ends    ; конец сегмента данных
 
; Сегмент программы обработки прерывания
SEGMP1  SEGMENT 'CODE'
        ASSUME      CS:SEGMP1
MNTR        PROC
;   Стандартный пролог подпрограммы обработки прерывания
        PUSH       BP
        MOV        BP,SP
; Сохранение используемых регистров
;        ...
; Определение смещения в списке адресов по номеру
        MOV        BL,AH  ; извлечение номера подпрограммы
        MOV        BH,0   ; и пересылка его с удвоением
        SHL        BX,1   ; в регистр BX
        CALL       CS:SUBAD[BX] ; обращение к подпрограмме
;        ...
; Восстановление регистров
;        ...
; Стандартный эпилог подпрограмы обработки прерывания
        MOV        SP,BP
        POP        BP
        IRET      ; выход из программы обработки прерывания
SUBAD   DW   SUBR0,SUBR1,SUBR2 ; список адресов подпрограмм
MNTR    ENDP
;        ...
; Подпрограммы
SUBR0   PROC
; тело подпрограммы с номером 0
; вывод строки - "Введите число" на экран и чтение с экрана
; вот тут нужно вывести строку "Введите число" и прочитать это число
; я не знаю - как прочитать число с экрана- 
    @Dispstr    str0    ;
    @DispCh     cr,lf 
        RET
SUBR0   ENDP
 
SUBR1   PROC
; тело подпрограммы с номером 1
; подсчитываем факториал
    MOV CX,DX
    MOV AX,1
LP1:    
    IMUL    CX
LOOP    LP1
    MOV DX,AX
; после всех этих манипуляций результат будет хранится в регистрах AX(мл. разряд) и DX(ст. разряд)
        RET
SUBR1   ENDP
;        ...
SUBR2   PROC
; тело подпрограммы с номером 2
; вывод результатов- факториала числа
 mov ah,9
 mov dx,offset str1
 int 21h
 ret
SUBR2   ENDP
;        ...
SEGMP1  ENDS
;        ...
; Главная программа
 
prog    segment 'code'
    assume  DS: data,ES: data,CS:PROG,SS: Stk
 
START:
; Установка регистров DS и ES на сегмент данных
    mov AX,data
    mov DS,AX
    mov ES,AX   
 
;   Установка вектора прерывания
        PUSH       DS        ; сохранение DS
        @SetInt    60h,MNTR ; установка вектора прерывания
                             ; с номером 60h на программу MNTPR
        POP        DS        ; восстановление DS
; Подготовка аргументов для обращения к подпрограмме 0
        MOV     AH,0
        INT     60h   ; обращение к подпрограмме с номером 0
; Обработка результатов работы подпрограммы 0
       
; Подготовка аргументов для обращения к подпрограмме 1
        MOV     AH,1
        INT     60h       ; обращение к подпрограмме 1
; ОБработка результатов работы подпрограммы 1
; тут я прочитываю регистры и присваиваю значению этих регистров переменное F
    MOV word ptr F,AX
    MOV word ptr F+2,DX
    
; Обращение к подпрограмме 2    
 
    MOV AH,2
    INT 60h
; Обработка результатов работы подпрограммы 2
;      
        @Exit
 
        prog    ends
stk segment stack'stack'
    db  256 dup(?)
stk ends
        
    END START
Добавлено через 3 минуты
а вот скелет подпрограммы № 2, которая должна будет обрабатывать ошибки (это нам дал преподаватель):
Подпрограмму обработки ошибок можно организовать как програм-
му обработки прерывания. В следующем примере выводится сообщение о
причине ошибки, по значению кода возврата в регисте AX.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Seg2   segment   'code'
       assume   CS:Seg2,DS:seg2
Cr     EQU      13
Lf     EQU      10
Tm     EQU      '$'
Er0    db       'Текст для кода 0',Cr,Lf,Tm
       ...
ErN    db       'Текст для кода N',Cr,Lf,Tm
Ertab  dw       Er0,Er1,...,ErN      ; список адресов сообщений
 
Erpr   proc
    push    DS
    mov BX,CS
    mov DS,BX
Inran: lea     BX,CS:Ertab
       shl     AX,1
       add     BX,AX
       mov     DX,[BX]
DispM: @DispStr DX
    pop DS
       iret
Erpr   endp
SEg2   ends
Вызов такой программы обработки ошибочных ситуаций делает-
ся командой int n2, например

Assembler
1
2
3
4
5
6
7
8
9
  ...
        Int n       ; Прерывание для выполнения функции
    ...
        jnc     Norm    ; Переход при нормальном завершении
        int n2      ; Прерывание по вектору программы
            ;    обработки ошибок   
        @Exit         ; Завершение работы по ошибке
Norm:           ; Нормальное продолжение работы программы
        ...
Добавлено через 3 минуты
вопросов у меня несколько:
1. как подключить подпрограмму № 2 к главной программе
2. как прочитать число с экрана (и как дать возможность пользователю ввести это число)
3. как вывести результаты подсчета факториала в подпрограмме

Добавлено через 16 минут
приведу нить своих суждений:
как я понял,слово может принимать значения от 0 до 65535 или от -32768 до 32767. Два слова образуют двойное слово (обозначается DWORD или DD). Двойное слово может принимать значения от 0 до 4294967295 или от -2147483648 до 2147483647
в моем случае, вводимое значение (N) имеет формат- слово, и имеет знак, поэтому принимает значения
от -32768 до 32767, но мы должны отсечь отрицальное число, поэтому оно будет от 0 до 32 767
а результат F (F=N!) имеет формат - двойное слово, поэтому принимает значения -2147483648 до 2147483647, но мы должны вызвать прерывание, если значение не выходит за размер слова, т.е. в пределах 32 767...
вывод такой: результат F должен быть в промежутке от 32 767 до 2 147 483 647

я правильно рассуждаю? если что-то неверно, прошу поправить меня
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2011, 19:07
Ответы с готовыми решениями:

Программное прерывание...
Не совсем понял задание, которое мне далпреподаватель, хотелось бы помощи в...

Прерывание
после запуска программы(изменение системной даты и времени) после того как я...

прерывание в fasm
Я создал программу вывода на экран веке кода клавиши. С помощью int 16h .но за...

Собственное прерывание
Доброго всем времени. Нужна помощь с работой по прерываниям. От программы...

Прерывание таймера 8h.
Ребята, помогите. Задали задачку на асме. Необходимо переопределить прерывание...

26
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
31.03.2011, 19:25 2
Цитата Сообщение от Сакен Посмотреть сообщение
в моем случае, вводимое значение (N) имеет формат- слово, и имеет знак, поэтому принимает значения
от -32768 до 32767, но мы должны отсечь отрицальное число, поэтому оно будет от 0 до 32 767
Не обязательно. Вводите до 0ffffh включительно, знак определит "-", введённый перед числом. И учитывайте это при вычислениях.
0
Сакен
0 / 0 / 1
Регистрация: 23.08.2010
Сообщений: 66
31.03.2011, 20:10  [ТС] 3
как мне проверить знак вводимого числа N ?
есть способ- просто сравнить с нулем, команда cmp
а как проверить знак, используя флаг?
0
Сакен
0 / 0 / 1
Регистрация: 23.08.2010
Сообщений: 66
31.03.2011, 20:58  [ТС] 4
в программе я использую макросы, которые дал преподаватель
если кто-нибудь захочет посмотреть программу- как она работает, то я загружаю папку с самой программой и макросами...
надеюсь, что кто-нибудь даст мне совет...
0
Вложения
Тип файла: rar Assem.rar (293.3 Кб, 17 просмотров)
Сакен
0 / 0 / 1
Регистрация: 23.08.2010
Сообщений: 66
31.03.2011, 22:06  [ТС] 5
написал программу, которая выполняет полностью пункт 1 (а,б,в), то есть
обращением к подпрограммам выводит сообщение, подсчет факториала и вывод результата на экран...
(причем в разных подпрограммах)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
; Обработка программных прерываний
;
; Вычислить N! для числа в формате двойного
; слова. Ошибки:
; число отрицательное
; переполнение двойного слова
; число размещается в слове.
; Шапка программы        
title   myprog8
    page    52,72   ; формат страницы листинга:
    ; строк на странице -52, символов в строке - 72
    include macroio.inc ;подключение б-ки макроопределений
; Сегменты данных
Data    segment
cr  equ 13  ; символ возврат каретки
lf  equ 10  ; символ перевода строки
n   dw  ?   ;
F   dd  ?
nm  equ 1
mass    dd  nm dup (?)
str0    db  'Вычислим факториал числа $'
str1    db  'Факториал числа равен $'
str3    db  'Переполнение $'
strm    db  240 dup (?) ; строка для вывода чисел
Data    ends    ; конец сегмента данных
 
; Сегмент программы обработки прерывания
SEGMP1  SEGMENT 'CODE'
        ASSUME      CS:SEGMP1
W   dd  ?
MNTR        PROC
;   Стандартный пролог подпрограммы обработки прерывания
        PUSH       BP
        MOV        BP,SP
; Сохранение используемых регистров
;        ...
; Определение смещения в списке адресов по номеру
        MOV        BL,AH  ; извлечение номера подпрограммы
        MOV        BH,0   ; и пересылка его с удвоением
        SHL        BX,1   ; в регистр BX
        CALL       CS:SUBAD[BX] ; обращение к подпрограмме
;        ...
; Восстановление регистров
;        ...
; Стандартный эпилог подпрограмы обработки прерывания
        MOV        SP,BP
        POP        BP
        IRET      ; выход из программы обработки прерывания
SUBAD   DW   SUBR0,SUBR1,SUBR2,SUBR3 ; список адресов подпрограмм
MNTR    ENDP
; Подпрограммы
SUBR0   PROC
; тело подпрограммы с номером 0
; вывод данных на экран
    @DispCh     cr,lf
    @Dispstr    str0    ;
    mov ah,2
    mov dl,'5'
    int 21h
    @DispCh     cr,lf 
        RET
SUBR0   ENDP
SUBR1   PROC
; тело подпрограммы с номером 1
; подсчитываем факториал
    MOV CX,DX
    MOV AX,1
LP1:    
    IMUL    CX
LOOP    LP1
        RET
SUBR1   ENDP
SUBR2   PROC ; тело подпрограммы с номером 2
    mov ah,9
    mov dx,offset str1
    int 21h
    puti    4,F,strm
    @DispStr strm
    @DispCh cr,lf
    RET
SUBR2   ENDP
 
SUBR3 PROC
    @DispStr str3
    RET
SUBR3   ENDP
    
SEGMP1  ENDS
;        ...
Seg2   segment   'code'
       assume   CS:Seg2,DS:seg2
Cr     EQU      13
Lf     EQU      10
Tm     EQU      '$'
Er4    db       'Текст для кода 4',Cr,Lf,Tm
Er5 db  'Текст для кода 5',Cr,Lf,Tm
Er6    db       'Текст для кода 6',Cr,Lf,Tm
Ertab  dw       Er4,Er5,Er6      ; список адресов сообщений
 
Erpr   proc
    push    DS
    mov BX,CS
    mov DS,BX
Inran: lea     BX,CS:Ertab
       shl     AX,1
       add     BX,AX
       mov     DX,[BX]
DispM: @DispStr DX
    pop DS
       iret
Erpr   endp
SEg2   ends
 
; Главная программа
 
prog    segment 'code'
    assume  DS: data,ES: data,CS:PROG,SS: Stk
START:
; Установка регистров DS и ES на сегмент данных
    mov AX,data
    mov DS,AX
    mov ES,AX   
;Установка вектора прерывания
        PUSH       DS        ; сохранение DS
        @SetInt    60h,MNTR ; установка вектора прерывания
                             ; с номером 60h на программу MNTPR
        POP        DS        ; восстановление DS
; Подготовка аргументов для обращения к подпрограмме 0
    MOV     AH,0
        INT     60h   ; обращение к подпрограмме с номером 0
; Обработка результатов работы подпрограммы 0
       
; Подготовка аргументов для обращения к подпрограмме 1
        MOV N,5
    MOV DX,N
        MOV     AH,1
        INT     60h       ; обращение к подпрограмме 1
; ОБработка результатов работы подпрограммы 1
 
;   jno Norm
;   mov AH,3
;   int 60h
;   @Exit
;Norm:
    MOV word ptr F,AX
    MOV word ptr F+2,DX
    
; Обращение к подпрограмме 2 (вывод на экран)   
    MOV AH,2
    INT 60h
        
; Обработка результатов работы подпрограммы 2
;      
        @Exit
 
        prog    ends
stk segment stack'stack'
    db  256 dup(?)
stk ends
        
    END START
как быть с сегментом seg2 ?
я его подключил, но он ничего не делает...
нужно, что бы программа обращалась к нему, если :
а) вводимое число - отрицательное
б) число в результате - переполнение, т.е. больше размером, чем двойное слово
в) число в результате- умещается в слово....

Добавлено через 10 минут
факториал-то программа подсчитывает, но (!) только до 7-и,
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5 040
а вот, если ввести число 8, то вместо 40320 программа выводит -25 216 (со знаком минус)

как я понимаю- происходит переполнение, но почему?
ведь я определил переменную, в которую я записываю результат как двойное слово !
в чем ошибка?
0
Сакен
0 / 0 / 1
Регистрация: 23.08.2010
Сообщений: 66
03.04.2011, 16:37  [ТС] 6
лабораторная работа выполнена, экзамен сдан..
тема закрыта
0
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
11.06.2011, 11:09 7
Когда создаю .exe файл пишет
какие то разные символы...
Я пишу так
masm.exe myprog8.asm;
link.exe myprog8.obj;
myprog.exe
Что не правильно?

Добавлено через 42 минуты
я все это делаю в FAR MANAGER
0
Goodwin98
2522 / 818 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
11.06.2011, 11:37 8
Что еще за "какие то разные символы..." ?
0
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
11.06.2011, 12:39 9
а все исправил
masm asd,,,,;
link asd,,,ioint;
где asd - имя *.asm файла.


А вот по программе вопрос есть когда вожу неотрицательное число, выдает +1...
0
Квент
11 / 11 / 1
Регистрация: 11.06.2011
Сообщений: 36
11.06.2011, 12:41 10
mario[x], У вас ошибка в коде.
0
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
11.06.2011, 13:14 11
факториал 0!=1 равен!

Добавлено через 20 минут
Как сделать чтобы при вводе 0 выдало 1?

Например есть какая-то процедура CALC_FACT, вычисляющий факториал
И делаем сравнение какое-то
MOV AX, 1 ;0! == 1! == 1
JMP END_FACT ;тоже процедура,т.е. извлекаем из стека регистры, кроче выход
;из процедуры CALC_FACT

Вот в таком примере как здесь делать?)))

Добавлено через 8 минут
по этой теме именно
0
Квент
11 / 11 / 1
Регистрация: 11.06.2011
Сообщений: 36
11.06.2011, 13:17 12
Assembler
1
2
3
4
5
6
7
...
cmp <Нечто, факториал чего вычисляется>,0
JNE  dalshe
MOV AX,1     ;если вычисляем факториал нуля, то записываем результат 
JMP END_FACT ;в АХ (единица) и выходим
dalshe:
....
Вероятность того, что вы об этом мала, но конкретность вашего вопроса доставляет))
0
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
11.06.2011, 13:28 13
Квент ну да)

я имею ввиду по этой программе, которая написана здесь.

При вводе 0 дает 0.
Как это сделать?
0
Квент
11 / 11 / 1
Регистрация: 11.06.2011
Сообщений: 36
11.06.2011, 13:35 14
Лень компилить и проверять, но должно быть так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        
SUBR1   PROC
; тело подпрограммы с номером 1
; подсчитываем факториал
        MOV     CX,DX
        MOV     AX,1
        CMP CX,0
        JE NULL
LP1:    
        IMUL    CX
LOOP    LP1
        MOV     DX,AX ; после всех этих манипуляций результат будет хранится в регистрах AX(мл. разряд) и DX(ст. разряд)
        JMP end_proc
NULL:
        SUB DX,DX
end_proc:
        RET
SUBR1   ENDP
0
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
11.06.2011, 13:42 15
при 0!=1
а при 5!= там уже переполнение у вас...
0
Квент
11 / 11 / 1
Регистрация: 11.06.2011
Сообщений: 36
11.06.2011, 13:50 16
а в программе ТопикСтартера нет переполнения? оО просто я вычисление факториала не трогал )
0
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
11.06.2011, 14:11 17
там нету переполнения...

MOV CX,DX
MOV AX,1
CMP CX,0
JE NULL
CMP CX 1
JE LP1
NULL:
SUB DX,DX
LP1:
IMUL CX
LOOP LP1
MOV DX,AX ; после всех этих манипуляций результат будет хранится в регистрах AX(мл. разряд) и DX(ст. разряд)
RET

SUBR1 ENDP

если так, тоже переполнение.... при N>0
0
Квент
11 / 11 / 1
Регистрация: 11.06.2011
Сообщений: 36
11.06.2011, 14:30 18
хм, у меня нет переполнения, скриншот прилагается
http://www.cyberforum.ru/attachment....1&d=1307788189
0
Миниатюры
интереснейшее программное прерывание  
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
11.06.2011, 14:39 19
C:\456\Assem\Assem>2.EXE

Вычислим факториал числа 7
Факториал числа равен +330306480

мм....
скиньте как так...
можете скинуть программу?
0
Квент
11 / 11 / 1
Регистрация: 11.06.2011
Сообщений: 36
11.06.2011, 14:55 20
компилица тасмом
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
.model small
.stack 100h
.386
.data
.code
 
SUBR1   PROC
; тело подпрограммы с номером 1
; подсчитываем факториал
        MOV     CX,DX
        MOV     AX,1
        CMP CX,0
        JE NULL
LP1:    
        IMUL    CX
        CWD
LOOP    LP1
        ;MOV     DX,AX ; после всех этих манипуляций результат будет хранится в регистрах AX(мл. разряд) и DX(ст. разряд)
        JMP end_proc
NULL:
        SUB DX,DX
end_proc:
        RET
SUBR1   ENDP
PRINT   PROC    far         ;Печать числа в AX на терминал 
                    ;Вход в процедуру
    PUSH    BP          ;Сохранение старой базы автоматическ
    MOV BP,SP           ;Установка новой базы на вершине стека
    SUB SP,11   ;Выделение памяти для буфера
    
    DEC BP          ;Перевести базу на символ ниже (BP=BP-1)
    MOV [BP], BYTE PTR '$'  ;Занести в буфер символ конца строки
    MOV BX,10           ;База для перевода числа в десятичное
    
    
    mov cl,' '
    cmp ax, 0
    jnl next_c      
    neg ax
    mov cl,'-' 
            
    NEXT_C: 
    DEC BP              ;Вычисление адреса предыдущего символа
    XOR DX,DX           ;Обнуление регистра DX (расширение операнда для деления)
    DIV BX              ;Деление на 10 (BX=10)
    ADD DL, '0'         ;Превращение остатка от деления в соответствующий символ 
    MOV [BP],DL         ;Запись символа в буфер
    cmp ax, 0               ;Декремент счетчика буфера
    JNe NEXT_C          ;Переход если не ноль
    dec bp
    MOV [BP],cl
    
    MOV     DX, BP              ;выводим на экран result
    PUSH    DS          ;Сохранение в стеке значение сегментного регистра
    MOV AX,SS           ;Передача нового значения DS=ES
    MOV DS,AX                   ;DS:DX должен адресовать строку
        MOV     AH,09                   ;
        INT     21h                     ;вызов прерывания
    
    POP DS                      ;Востанавливаем старое значение DS
                    
    ADD SP,11        ;Освобождаем автоматическую память в стеке
    POP BP          ;Востанавливаем старое значение базы
                    ;автоматических переменных
                    
    RET             ;Возврат из процедуры
PRINT   ENDP
.startup
    MOV DX,7
    CALL SUBR1
    CALL PRINT
 
    
end_prog:
.exit(0)
end
1
11.06.2011, 14:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2011, 14:55

Прерывание клавиатуры
нужна помощь. есть задание: Поставить в соответствие десятичным цифрам (0 -...

Прерывание 20h
Здравствуйте, господа! Я случайно наткнулся на этот форум, и мне здесь...

Прерывание int 60h
Всем привет. Я никак не могу найти, что делает это прерывание. Может кто-нибудь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru