Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 5
1

Как получить адрес подпрограммы?

10.09.2012, 16:53. Показов 2537. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем такая проблема... Есть программа (к устройству), она должна выводить текущее количество деталей с счетчика на индикаторы раз в n секунд(подсчет идет до 10 000) и при нажатии кнопки должна совершить передачу текущего количества деталей на внешнее устройство.
Когда на программируемый контролер прерываний поступает сигнал запроса прерываний, мкп заканчивает выполнение текущей программы и на шд подается байт вектора прерывания(А0H в моем случае получается) Он считывается МКП и на основании его вычисляется адрес подпрограммы обработки прерывания и выполняется соотвествующая подпрограмма.
А дальше я запутался и не могу разобраться, вопрос в следующем - какой адрес этой подрограммы будет в моем случае? Куда/на что вообще смотреть? В общем вопрос практически жизни и смерти, помогите, пожалуйста)
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
162
163
164
165
code_sg segment
     assume cs:code_sg, ds:code_sg, ss:code_sg
     org 100h
Na db ?     ;резервирование переменной для младшего разряда
Nb db ?     ;резервирование переменной для среднего разряда
Nc db ?     ;резервирование переменной для старшего разряда
begin: jmp start
start:                  
;инициализация ПСА
mov DX, 0D9CH           ; указать адрес ПСА                  
    mov AL, 40H                   ; программный сброс ПСА
    out DX, Al
           mov AL, 4DH      ;инструкция режима
           out DX, AL           ; запись инструкции режима                        
           mov AL, 33H      ;инструкции управления
           out DX, AL                     ;запись иснтрукции управления   
;инициализация таймера
    mov DX, 0DA3H       ;указать адреспо которому будут записаны
    mov AL, 31H     ;РУС0    
    out DX, AL          
    mov AL, 0B1H        ;РУС1
    out DX, AL
           mov AL, 0F1H                ;РУС2
           out DX, AL
 ;инициализация ППИ
          mov DX,0D9BH      ;адрес РУС
          mov AL,80h        ;управляющий байт    
          OUT DX,AL     ;запись управляющего байта           
 
;инициализация ПКП
    mov DX, 0DA4H        ;указать адрес ICW1 ПКП
    mov AL, 17H     ;поместить ICW1 ПКП в AL   
    out DX, AL
    mov DX, 0DA5H       ;указать адрес ICW2 ПКП      
    mov AL, A0H ;поместить ICW2 ПКП в AL
    out DX, AL
    mov DX, 0DA4H       ;указать адрес ICW4 ПКП
    mov AL, 07H     ;поместить ICW4 ПКП в AL
    out DX, AL
;запись значений в сч.0, сч.1 и сч.2 таймера
          mov al,99H                   ;загрузить в al 99
          mov dx,0DA0H 
          out dx,al                         ;загрузить 99 в младший байт Сч0
          out dx,al                        ;загрузить 99 в старший байт Сч0
          mov dx,0DA1H 
          out dx,al                        ;загрузить 99 в младший байт Сч1 
          out dx,al                       ;загрузить 99 в старший байт Сч1
          mov al,99H                  ;загрузить в al 99
          mov dx,0DA2H 
          out dx,al                         ;загрузить 99 в младший байт Сч2
          out dx,al                        ;загрузить 99 в старший байт Сч2
          xor ax,ax                       ;обнуление
         mov dx,0DA3H
         mov AL, 01H        ;запись РУС0 для считывания без остановки
    out DX, AL
          mov dx,0DA3H
         mov AL, 51H        ;запись РУС1 ждя считывания без остановки 
    out DX, AL      
;вычисление количества деталей
        mov dx,0DA0H        
        in al,dx                        ;чтение младшего байта Na из Сч0
        mov cl,al                     
        mov dx,0DA0H
        in al,dx                   ;чтение старшего байта    
        mov ch,al                   
        mov bx,9999H  
        sub bx,cx                   ;вычисление количества деталей
        mov Na,bl
        mov Nb, bh
        
 
        mov dx,0DA1H
        in al,dx                        ;чтение младшего байта Nb из Сч1
        mov cl,al                     
        mov bl,99H          
        sub bl,cl                   ;вычисление количества деталей
        mov Nc,bl
;вывод значения на индикаторы
        mov dx, 0D98H        ;указать адрес КА ППИ
        mov al, Na               ;запись в ах количества деталей
        out  dx, al                   ;вывод через КА младшего байта Na
        mov dx,0D99H         ;указать адрес КВ ППИ
         mov al, Nb
        out dx,al                   ;вывод через КВ старшего байта Na
        xor ax,ax                   ;обнуление
        mov dx,0D9AH         ;указать адрес КС ППИ
        mov al,Nc                 ;запись в ах количества деталей
        out dx,al                 ;вывод через КС младшего байта Nc    
        xor ax,ax             
;разрешение работы счётчика сч2 таймера
    mov DX, 0DA8H        ;указать адрес
    mov AL,01H      ;сформировать уровень логической единицы    
    out DX, AL          ;на входе Си1 таймера
           mov AH, 4CH      ;возврат в DOS
    int 21H
code_sg  ends
end begin
Программа прерывания для IRQ0
 
name prer0
    assume cs:segm, ds:segm, ss:segm
    segm segment
    org 100h
    begin:
;вывод сигнала текущего значения на ПСА
mov dx, 0D9DH       ;указать адрес ПСА   
    mov ax,Na                  ;записать в ах количество деталей
    out dx, al           ;записать в ПСА младший байт
           in cl ,dx                             ;вывести байт состояния 
           test cl,01H                         ;проверить уровень сигнала TxRDY
           jz out dx, ah                       ;если 1 то записать в ПСА старший байт
           in cl,dx                               ;вывести байт состояния
           test cl,01H                         ;проверить уровень сигнала TxRDY
           jz mov ax,Nb                      ;если 1 то записать в ах Nb
           out dx,ax                            ;записать в ПСА старший байт
    segm ends
end begin
     
Программа прерывания для IRQ1
 
name prer1
    assume cs:segm, ds:segm, ss:segm
    segm segment
    org 100h
          jmp start 
        stop: 
 mov DX, 0DA8H      ;указать адрес сч2
mov AL,03H      ;сформировать сигнал остановки    
out DX, AL  
start:
mov dx,0DA0H    
in al,dx                        ;чтение младшего байт Na из сч0
        mov cl,al                     
        mov dx,0DA0H
        in al,dx                       ;чтение старшего байта
        mov ch,al                   
        mov bx,9999H  
        sub bx,cx                   ;вычисление количества деталей
        mov Na,bl
        mov Nb, bh
         mov dx,0DA1H
        in al,dx                        ;чтение младшего байта Nb из Сч1
        mov cl,al                     
        mov bl,99H  
        sub bl,cl                   ;вычисление количества деталей
        mov Nc,bl
        
;вывод значения на индикаторы
        mov dx, 0D98H        ;указать адрес КА ППИ
        mov al, Na               ;записать в ах количество деталей
        out  dx, al                   ;вывод через КА младшего байта Na
        mov dx,0D99H         ;указать адрес КВ ППИ
        mov al, Nb
        out dx,al                   
        xor ax,ax                   
        mov dx,0D9AH         ;указать адрес КС ППИ
        mov al,Nc                 
        out dx,al                     
        xor ax,ax     
          mov al, Nb
        mov cl, 01H       ;записать в cl максимального значения       
        cmp cx,ax         ;сравнение с полученным значением                   
        jb   stop                      ;если больше 01, остановить счетчик 2
segm ends
end begin
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2012, 16:53
Ответы с готовыми решениями:

Как в переменную объектного процедурного типа поместить адрес подпрограммы?
Прошу помощи у знающих людей, для них эти вопросы элементарные ) Только прошу по факту писать,...

Как называют область стековой памяти, содержащую связанные с одним вызовом подпрограммы значения параметров, адрес возвр
Как называют область стековой памяти, содержащую связанные с одним вызовом подпрограммы значения...

Получить адрес ИЗ указателя на адрес другой программы
В программе для редактирования RAM памяти процессов (в основном игровых =) ) ArtMoney можно...

Как получить IP адрес?
Как встраиваемые системы получают IP адрес? Самый простой вариант, сделать фиксированный,...

9
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
10.09.2012, 17:18 2
Адрес процедуры-обработчика прерываний надо прописать в системную таблицу векторов прерываний. Для этого есть DOS-ское прерывание:
Assembler
1
2
3
4
5
mov   ah,25h
mov   al,<номер вектора в таблице>
mov   dx,<смещение на обработчик в сегменте кодов>
mov   ds,<сегментный адрес кодов>
int     21h  ;установили
Смотрите какой-нибудь HELP по MS-DOS, найти несложно
1
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 5
10.09.2012, 22:14  [ТС] 3
Я извиняюсь, а в куда это ставить и какой будет адрес?) и я буду крайне благодарен если объясните подробнее, потому что в этом все я крайне сильно запутался и без чужой помощи уже врядли смогу разобраться
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
11.09.2012, 05:01 4
atlantic,
зайди сюда Лучший сборник книг в электронном виде по Ассемблеру и скачай книгу Ассемблер и программирование для IBM PC - Абель Питер — создание резидента описано очень подробно
1
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
11.09.2012, 10:44 5
Цитата Сообщение от atlantic Посмотреть сообщение
Я извиняюсь, а в куда это ставить и какой будет адрес?) и я буду крайне благодарен если объясните подробнее, потому что в этом все я крайне сильно запутался и без чужой помощи уже врядли смогу разобраться
В таком случае нужно общее описание задачи. Например: есть некоторое устройство, которым надо управлять с персоналки (если я правильно понял); устройство сопрягается с ПК так-то и так-то; операционная система такая-то. Возможно, что это реализуемо и не на чистом ассемблере. Можно выложить это и на фриланс. Но в рамках форума обсуждать всю задачу будет сложно. А что это за порты 0D9Ch, 0DA3h? И на персоналке инициализация ПКП идет через другие порты. Может быть это какой-то микроконтроллер (однокристалка)? В таком случае нужно запостить в другой раздел форума - Электроника и радиотехника.
0
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 5
11.09.2012, 11:44  [ТС] 6
Цитата Сообщение от Mikl___ Посмотреть сообщение
atlantic,
зайди сюда Лучший сборник книг в электронном виде по Ассемблеру и скачай книгу Ассемблер и программирование для IBM PC - Абель Питер — создание резидента описано очень подробно
спасибо, качаю, попытаюсь разобраться
Цитата Сообщение от Dmitrinik Посмотреть сообщение
В таком случае нужно общее описание задачи. Например: есть некоторое устройство, которым надо управлять с персоналки (если я правильно понял); устройство сопрягается с ПК так-то и так-то; операционная система такая-то. Возможно, что это реализуемо и не на чистом ассемблере. Можно выложить это и на фриланс. Но в рамках форума обсуждать всю задачу будет сложно. А что это за порты 0D9Ch, 0DA3h? И на персоналке инициализация ПКП идет через другие порты. Может быть это какой-то микроконтроллер (однокристалка)? В таком случае нужно запостить в другой раздел форума - Электроника и радиотехника.
Ну вообще это курсач, если честно, - задача спроектировать устройство и написать к нему программу, задача устройства считать количество деталей и выводить текущее количество на индикаторы, а так же при нажатии кнопки выводить текущее значение на ВУ. Там используется датчик, таймер, мкп, пкп, память ну и индикаторы и ещё чего по мелочи. В принципе все было сделано, но вот с прерываниями и адресом где будет располагаться подпрограмма я запутался и пытаюсь узнать это. Поидее это именно тот раздел который мне нужен. В теории мне в принципе было понятно что куда и откуда идет и как работает, а вот на конкретном примере не могу понять.
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
11.09.2012, 12:35 7
Цитата Сообщение от atlantic
но вот с прерываниями и адресом где будет располагаться подпрограмма я запутался и пытаюсь узнать это.
https://www.cyberforum.ru/asse... 67392.html - с примерами.
0
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
11.09.2012, 14:48 8
Цитата Сообщение от atlantic Посмотреть сообщение
...спроектировать устройство и написать к нему программу...
Да я уже стал догадываться, что мы говорили о разных вещах. Здесь, в основном, постятся программеры под персоналки. А раз речь о проектировании устройства, то это на однокристаллке. Там архитектура отличается от INTEL-совместимых процессоров и поэтому надо обратиться к "Электроника и радиотехника". Там ребята занимаются подобными вопросами, т.е. электроникой (обвязкой) и программированием, а здесь тебя уведут совсем не в ту сторону (я уже по ответам вижу, в том числе и своим). Только им надо будет сразу сказать "фамилию" процессора, на котором предполагается делать устройство, т.к. у разных процессоров архитектура и, соответственно, ассемблер разные.
1
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 5
11.09.2012, 19:08  [ТС] 9
Ладно, а если чуть изменить вопрос - допустим есть начальный адрес памяти - 90 000H, в программе мы делаем смещение ORG 100H, оставшаяся программа занимает допустим 137 байт. Соответственно следующая программа/подпрограмма будет дальше. Как исходя из этого найти ее физический адрес и узнать что будет записано в ячейку памяти?
Знаю что физический адрес находиться как (сег регистра * 16) + смещение. Ну или из значений CS и IP. А из того что я написал выше можно найти? Ну или все же мне лучше обратиться в "Электронику и радиотехнику" ?
0
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
11.09.2012, 19:42 10
Для реального режима процессора в 16-битном ассемблере INTEL это выглядело бы так:
Assembler
1
2
3
4
5
6
7
8
9
;Следующая команда дает смещение до обработчика прерываний в сегменте кодов
mov   dx,OffSet ProcInterrupt 
push  ds
mov   ax,cs
mov   ds,ax
mov   ah,25h
mov   al,<номер вектора в таблице>
int   21h  ;установили 
pop   ds
ProcInterrupt - имя процедуры -обработчика прерываний
А физический адрес будет равен CS*16 + OffSet ProcInterrupt (для реального режима)
1
11.09.2012, 19:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2012, 19:42
Помогаю со студенческими работами здесь

Как получить IP адрес?
Как получить IP адрес в WPF?

Как получить МАС-адрес?
Как использовать функцию Netbios для получения МАС-адреса. Пробовал использовать пример из мсдн -...

Как получить ип адрес сайта?
Я только начал изучать C#,мне нужно создать лаунчер...нужно запустить программу с параметром...

Как получить адрес по альянсу?
Здравствуйте. Есть база данных, есть альянс TEST. Как получить адрес базы данных? Использую DBE,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru