Привет всем кто зашёл в темку. Только начал учить ассемблер и возник вопрос с примером из книги Калашникова. Вот код с комментами как я понимаю: Код (Text): CSEG segment org 100h begin: mov sp,offset Lab ;адрес метки. т.е. физически там mov ah,9 mov ax,9090h ; push ax ; забиваем в стек 2 "пустых" оператора int 20h ; выход Lab: mov ah,9 mov dx,offset Mess int 21h mov ah,10h int 16h int 20h Mess db 'I vsetaki vivoditsya! $' CSEG ends end begin Вопрос: зачем метка? У калашникова написано что смещение в sp указывает на int 20h. Почему? Объясните пожалуйста!
сейчас sp указывает на ты ж помнишь из калашникова, что младшие адреса вверху, а старшие внизу? И что стек растет с низу вверх? т.е. при команде push стек наполняется и sp "растет" вверх, в младшим адресам. Т.е. попросту говоря sp уменьшается. размер этой инструкции видимо 2 байта. Когда ты делаешь , ты загоняешь в стек 2 байта, т.е. sp уменьшается на 2 байта. А на 2 байта выше от команды находится команда . Фух, надеюсь не запутал
Eretic Не знаю для чего это делает калашников но вот следующий код приведет к тому же результату Код (Text): .286 .model tiny .code org 100h start: mov ax,offset Lab;адрес метки; ; push ax ; в стек адрес метки retn; возврат на адрес который сейчас в стеке то есть скрытый jmp Lab int 20h ; обходим выход из программы Lab: mov ah,9; выводим надпись на экран mov dx,offset Mess int 21h mov ah,10h int 16h int 20h Mess db 'I vsetaki vivoditsya! $' end start
Синтаксис я понимаю. А вот логику поймать ну никак немогу. Можно на пальцах? Вот есть стек. Стопка тарелок. Код (Text): mov sp,offset Lab теперь на верхней тарелке Код (Text): mov ah,9 далее 2 пустых оператора Код (Text): mov ax,9090h push ax теперь сверху ещё 2 тарелки но пустые. далее Код (Text): int 20h и...что далее происходит? 2 пустых оператора(2 байта) затирают прерывание выхода Код (Text): int 20h (тоже 2 байта)? почему?
Mikl___ ты не прав. Калашников не прыгает на то значение, которое в стеке. Посмотри внимательнее. Он устанавливает sp сразу после int 20, а потом заносит в стек 2 байта. Т.е. Калашников, демонстрируя работу стека, в данном примере просто затирает int 20 нопами
Eretic com- программу завершают так int 20h а можно завершить так retn (если ничего лишнего в стек до этого не помещал) Скорее всего, Калашников хотел продемонстрировать jmp вызываемый через анальное отверстие -- читаем "классиков" Р.Браун Дд.Кайл "Справочник по прерываниям IBM PC" "После прерывания int 20 выполнение программы продолжается с адреса, содержащегося в int 22h Прерывание 22h -- определяет адрес программы, которой должно быть передано управление после завершения программы, это прерывание не должно вызываться напрямую. так как оно не указывает на обработчик прерывания... вектор востанавливается из DWORD со смещением 0Ah в PSP во время завершения и затем производится дальний переход по адресу в int 22h"
а в отладчике по шагам пройти и посмотреть никак? Код (Text): mov sp, offset Lab Lab: push sp pop ax посмотри еще на действие этих команд.
смотрел я в отладчике. Код (Text): mov sp,0109 mov ax,9090h SUB [3102],BL ;вместо push mov ah,9 mov dx,0116 int 21h NOP NOP ... Парни, я неделю тока асм изучаю. Вопрос только почему в проге в первом посте NOP затирает 20h. Просто немогу уловить это. Похоже стоит пока забить. С опытом думаю прийдёт.
нет вот как раз калашников и хотел показать, как растет esp - для этого он затер команду int 20 - я ж учился по калашникову Да и сам посмотри, что выполняет этот код. Никаким push/retn и близко не пахнет
вот у тебя стек aa bb cc dd ee В данный момент sp указывает на cc. Что произойдет с sp, когда ты положишь в стек xx? правильно! в стеке будет такое: aa xx (!) cc dd ee а сам sp будет указывать уже на аа!!! Стек - это такая же память, как и та, где лежит код. Адресация та же самая.
MSoft ага это понял. Спасибо. НО! Приминительно к нашей проге. до прерывания 21h стек у нас такой? NOP NOP ah,09 ;на неё ссылается sp далее прерывание 20h. Немогу чтото в калашникове найти как она именно работает. Говорится только что закрывает досовское окно. Как это прерывание связано со стеком?
блин, я жестоко ошибся в 15 посте замените "а сам sp будет указывать уже на аа!!!" на "а сам sp будет указывать уже на хх!!!"
Какая-то кривая программка. Допустим, после инструкции mov sp, offset Lab происходит прерывание - ближайшие инструкции затерты. Допустим, прерывание не происходит - nop'ы выписываются в память, а int 20h уже может находиться в очереди предвыборки, поэтому велика вероятность, что это инструкция все равно будет выполнена, хотя и затерта nop'ами.
Phantom_84 Почитайте про различие i486 и Pentium. Из-за введения конвееризации суть очереди предвыборки слегка изменилась. Начиная с Pentium'a при записи в страницу сегмента кода (страницу, на которой идет выполнение) происходит сбрасывание и перезагрузка очереди