Привет всем. Я написал процедуру прерывания. Скажите, есть ли какая то возможность посмотреть через Turbo Debbuger как выполняется прерывание при вызове из программы?
» Assembler
blaro
trace into
По умолчанию вроде F7
trace into
По умолчанию вроде F7
Yvaliko
Цитата:
Не, не помогает. Он ее проходит как обычную операцию
Цитата:
trace into
По умолчанию вроде F7
Не, не помогает. Он ее проходит как обычную операцию
blaro
а ты установи точку внутри своей процедуры...
а ты установи точку внутри своей процедуры...
а вообще лучше отлаживать интеррапты сначала как обычные процедуры прежде чем делать их интерраптами :)
akaGM
Цитата:
Установил. Не помогает. Прога проходит дальше как будто это простая операция.
Цитата:
А по моему это не самое лучшее решение. Потому что в этом случае процедура может работать а интеррапт нет.
Я лучше выложу код который написал. Уже скажите мне что я неправильно сделал.
Краткое объяснение: процедура сначала печатает свою строку, а потом принимает через регист bx другую строку, копирует ее во внутреннюю строку самой процедуры, и печатает. Кста, печатает синие буквы на белом фоне.
[more=isr90h]
.model tiny
.code
org 100h
begin:
jmp init
imsg db "first Run$"
isr90 proc
push ds
push cs
pop ds
push 0B800h
pop es
lea si,imsg
prc:
mov al,[si]
cmp al,'$'
je ext
mov es:[di],al
mov byte ptr es:[di+1],01111001b
inc si
add di,2
jmp prc
ext:
lea si,imsg
mov cx,9
cpy:
mov al,[bx]
mov [si],al
inc si
inc bx
loop cpy
pop ds
iret
endp
init:
mov ah,25h
mov al,90h
mov dx,offset isr90
int 21h
mov dx,offset init
add dx, 90H
mov cl, 4
shr dx, cl
mov ah,31H
int 21H
end begin
[/more]
Цитата:
а ты установи точку внутри своей процедуры...
Установил. Не помогает. Прога проходит дальше как будто это простая операция.
Цитата:
а вообще лучше отлаживать интеррапты сначала как обычные процедуры прежде чем делать их интерраптами
А по моему это не самое лучшее решение. Потому что в этом случае процедура может работать а интеррапт нет.
Я лучше выложу код который написал. Уже скажите мне что я неправильно сделал.
Краткое объяснение: процедура сначала печатает свою строку, а потом принимает через регист bx другую строку, копирует ее во внутреннюю строку самой процедуры, и печатает. Кста, печатает синие буквы на белом фоне.
[more=isr90h]
.model tiny
.code
org 100h
begin:
jmp init
imsg db "first Run$"
isr90 proc
push ds
push cs
pop ds
push 0B800h
pop es
lea si,imsg
prc:
mov al,[si]
cmp al,'$'
je ext
mov es:[di],al
mov byte ptr es:[di+1],01111001b
inc si
add di,2
jmp prc
ext:
lea si,imsg
mov cx,9
cpy:
mov al,[bx]
mov [si],al
inc si
inc bx
loop cpy
pop ds
iret
endp
init:
mov ah,25h
mov al,90h
mov dx,offset isr90
int 21h
mov dx,offset init
add dx, 90H
mov cl, 4
shr dx, cl
mov ah,31H
int 21H
end begin
[/more]
Эмм.. Я что-то не понял, а кто в обработчике прерываний будет предварительно каждый раз при новом вызове обработчика регистор DI устанавливать ? Или же его нужно только один раз проинициализировать, но и этого нет.
Куда указывает DI ?
Куда указывает DI ?
blaro
Цитата:
согласен...
но надо быть увереным, что что твоя инт-процедура работает...
я не знаю, что это за int90, какой-то юзерский что ли?
и как ты его "зовёшь"?
Цитата:
Потому что в этом случае процедура может работать а интеррапт нет
согласен...
но надо быть увереным, что что твоя инт-процедура работает...
я не знаю, что это за int90, какой-то юзерский что ли?
и как ты его "зовёшь"?
akaGM
Цитата:
Да.
Цитата:
Так и зову int 90h
Цитата:
я не знаю, что это за int90, какой-то юзерский что ли?
Да.
Цитата:
и как ты его "зовёшь"?
Так и зову int 90h
blaro
ну так покажи...
кстати, пользовательским интам отведён диапазон 60-67, а 90 где-то для кого-то зарезервирован...
ну так покажи...
кстати, пользовательским интам отведён диапазон 60-67, а 90 где-то для кого-то зарезервирован...
Код:
.model small
.stack 64
.data
msg db "Hello ugly world$"
.code
start:
mov ax,@data
mov ds,ax
lea bx,msg
int 90h
int 90h
mov ah,4ch
int 21h
end start
blaro
прям так два раза? с первого не вызвалось :)
а в качестве isr что-нибудь примитивное (без регистров и вообще без ни фига), типа напечатать '*' в первом знакоместе b800 не пробовал?
прям так два раза? с первого не вызвалось :)
а в качестве isr что-нибудь примитивное (без регистров и вообще без ни фига), типа напечатать '*' в первом знакоместе b800 не пробовал?
пробовал. печатает на ура
ну тогда разбирайся с регистрами, однозначно...
pusha/popa :) тебе в помощь...
наверняка при оформлении в виде отдельной процедуры
...
call isr90
call isr90
...
тоже сломается...
pusha/popa :) тебе в помощь...
наверняка при оформлении в виде отдельной процедуры
...
call isr90
call isr90
...
тоже сломается...
blaro
Перед вызовом прерывания строка не просто в BX, а в DS:BX. А в обработчике один BX остался. Плюс при обработке прерываний принято все регистры восстанавливать перед выходом (понятно, кроме тех, которые что-то должны возвращать).
Перед вызовом прерывания строка не просто в BX, а в DS:BX. А в обработчике один BX остался. Плюс при обработке прерываний принято все регистры восстанавливать перед выходом (понятно, кроме тех, которые что-то должны возвращать).
Ребят, а при использовании различных моделей памяти программный код будет сильно отличаться? мы в институте всегда плоскую использовали, в большинстве книг small...
SevereK20
tiny, small, medium, large, huge -- трудное наследие 16-битной жизни, в реальностии ты процентов на 99 с этим не столкнёшься...
flat -- 32-разрядная
tiny, small, medium, large, huge -- трудное наследие 16-битной жизни, в реальностии ты процентов на 99 с этим не столкнёшься...
flat -- 32-разрядная
Цитата:
tiny, small, medium, large, huge -- трудное наследие 16-битной жизни, в реальностии ты процентов на 99 с этим не столкнёшься...
flat -- 32-разрядная
спасибо. но код отличаться сильно будет?
в книгах в основном small...
SevereK20
я не понимаю чего ты спрашиваешь? что такое отличия кода?
mov ax, 10
будет одинаково выглядеть и выполняться во всех моделях...
вообще, модель -- это способ адресации и организации данных/кода в памяти, связанных с сегментной организацией адресации 16-битного режима 8088/8086/80286
я не понимаю чего ты спрашиваешь? что такое отличия кода?
mov ax, 10
будет одинаково выглядеть и выполняться во всех моделях...
вообще, модель -- это способ адресации и организации данных/кода в памяти, связанных с сегментной организацией адресации 16-битного режима 8088/8086/80286
SevereK20
Код отличатся не будет вообще.
Модель памяти указывается что бы компилятор знал какой формат ехешника ему собирать. Например в tiny нет сегмента данных.
Код отличатся не будет вообще.
Модель памяти указывается что бы компилятор знал какой формат ехешника ему собирать. Например в tiny нет сегмента данных.
все понял, спасибо.
значит то, что я видел в книгах - просто недоученное мною
Спасибо большое за разъяснения
значит то, что я видел в книгах - просто недоученное мною
Спасибо большое за разъяснения
я вчера когда прочитал так и не нашелся с ходу что сказать.
tiny и small это отношение к памяти не имеет, это команды компилятору какой исполняемый файл создавать. это COM файл, который еще можно было объявит так
CSEG segment
assume cs:CSEG
org 100h
Begin:
ret
CSEG ends
end Begin
что тоже самое
.model tiny
.code
org 100h
start:
end start
а может быть еще EXE. COM файл начинается с служебного заголовка 100h (256 байт) из PSP командной строки и занимает один сегмент 64 кбайта.
а к типу памяти скорее вот это команда компилятору имеетт
.model flat, stdcall
tiny и small это отношение к памяти не имеет, это команды компилятору какой исполняемый файл создавать. это COM файл, который еще можно было объявит так
CSEG segment
assume cs:CSEG
org 100h
Begin:
ret
CSEG ends
end Begin
что тоже самое
.model tiny
.code
org 100h
start:
end start
а может быть еще EXE. COM файл начинается с служебного заголовка 100h (256 байт) из PSP командной строки и занимает один сегмент 64 кбайта.
а к типу памяти скорее вот это команда компилятору имеетт
.model flat, stdcall
.model tiny ;на всё про всё один сегмент
.model small ;один сегмент данных/стека и один кода
.model medium ;один сегмент данных и сколько угодно сегментов кода
.model compact ;один код и много данных
.model large ;много кода и много данный и всё 1МБ и каждый struct может занимать свой сегмент
.model huge ;как large и всё ограничено только набортной памятью
.model flat ;как tiny, но для 32-разрядной адресации
.model small ;один сегмент данных/стека и один кода
.model medium ;один сегмент данных и сколько угодно сегментов кода
.model compact ;один код и много данных
.model large ;много кода и много данный и всё 1МБ и каждый struct может занимать свой сегмент
.model huge ;как large и всё ограничено только набортной памятью
.model flat ;как tiny, но для 32-разрядной адресации
Хуге ничем не отличается от ларже, кроме дурной сегментной арифметики для высокоуровневых компиляторов. Она так же ограничена 1 мб, только позволяет использовать элементы массивов размером более 64 кб. Для нормального использования всей набортной памяти в дос нужен защищенный режим.
Вывод - ищите другие книжки, где нет упоминаний про смалл медиум ларже. Пора уже выбираться из каменного века в 21ый
Вывод - ищите другие книжки, где нет упоминаний про смалл медиум ларже. Пора уже выбираться из каменного века в 21ый
в huge куча не ограничена 1 мегом, афаир...
Не понял? А в ларже ограничена, что ли? Вопрос в другом - где лишний полуметр взять, без защищенного режима... Если хмс/емс - там более 64 кб зараз не передашь.
да-да, <=1 MB, забыл...
MERCURY127
Цитата:
Если уж затрагивать языки высокого уровня, то дело не только в сегментной арифметике.
Цитата:
Хуге ничем не отличается от ларже, кроме дурной сегментной арифметики для высокоуровневых компиляторов.
Если уж затрагивать языки высокого уровня, то дело не только в сегментной арифметике.
с точки зрения ассемблера - huge/large абсолютно без разницы, кроме описанного...
Добавлено:
и опять таки, модели памяти в 2012 году - есть дремучий каменный век, изучение оных иначе как для написания биосов и бутсекторов - есть тормоз обучения, и в свете наступления эпохи х64 - это преступление, за которое препода надо судить...
Добавлено:
ладно бы там сстемное программирование, драйверы и пр - тут я конечно двумя руками за углубленное изучение. но ведь речь идет об обыкновенном курсе университетского идиотизма, после которого новоиспеченный "программизд" будет еще пару лет переучиваться на рабочем месте... зачем такие нужны? проще индуса нанять - он хоть сразу нужное направление знает
Добавлено:
и опять таки, модели памяти в 2012 году - есть дремучий каменный век, изучение оных иначе как для написания биосов и бутсекторов - есть тормоз обучения, и в свете наступления эпохи х64 - это преступление, за которое препода надо судить...
Добавлено:
ладно бы там сстемное программирование, драйверы и пр - тут я конечно двумя руками за углубленное изучение. но ведь речь идет об обыкновенном курсе университетского идиотизма, после которого новоиспеченный "программизд" будет еще пару лет переучиваться на рабочем месте... зачем такие нужны? проще индуса нанять - он хоть сразу нужное направление знает
всех мочить...
Добавлено:
раньше я кандидатские экзамены по программированию принимал...
Добавлено:
раньше я кандидатские экзамены по программированию принимал...
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
Предыдущая тема: .NET GUI компоненты
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.