Stack+masm

Тема в разделе "WASM.BEGINNERS", создана пользователем Eretic, 19 июн 2009.

  1. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    Привет всем кто зашёл в темку. Только начал учить ассемблер и возник вопрос с примером из книги Калашникова. Вот код с комментами как я понимаю:
    Код (Text):
    1. CSEG segment
    2. org 100h
    3. begin:
    4.     mov sp,offset Lab ;адрес метки. т.е. физически там mov ah,9
    5.     mov ax,9090h      ;
    6.     push ax              ; забиваем в стек 2 "пустых" оператора
    7.     int 20h               ; выход
    8.    
    9. Lab:
    10.     mov ah,9
    11.     mov dx,offset Mess
    12.     int 21h
    13.    
    14.     mov ah,10h
    15.     int 16h
    16.    
    17.     int 20h
    18.    
    19. Mess db 'I vsetaki vivoditsya! $'
    20.  
    21. CSEG ends
    22. end begin
    Вопрос: зачем метка? У калашникова написано что смещение в sp указывает на int 20h. Почему? Объясните пожалуйста!
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    сейчас sp указывает на
    ты ж помнишь из калашникова, что младшие адреса вверху, а старшие внизу? И что стек растет с низу вверх? т.е. при команде push стек наполняется и sp "растет" вверх, в младшим адресам. Т.е. попросту говоря sp уменьшается.
    размер этой инструкции видимо 2 байта. Когда ты делаешь
    , ты загоняешь в стек 2 байта, т.е. sp уменьшается на 2 байта. А на 2 байта выше от команды
    находится команда
    .

    Фух, надеюсь не запутал :)
     
  3. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    а 9090 это опкод двух nop (пустая операция)
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.710
    Eretic
    Не знаю для чего это делает калашников но вот следующий код приведет к тому же результату
    Код (Text):
    1. .286
    2. .model tiny
    3. .code
    4. org 100h
    5. start:  mov ax,offset Lab;адрес метки;      ;
    6.     push ax              ; в стек адрес метки
    7.     retn; возврат на адрес который сейчас в стеке то есть скрытый jmp Lab
    8.     int 20h               ; обходим выход из программы
    9. Lab:    mov ah,9; выводим надпись на экран
    10.     mov dx,offset Mess
    11.     int 21h
    12.     mov ah,10h
    13.     int 16h
    14.     int 20h
    15. Mess db 'I vsetaki vivoditsya! $'
    16. end start
     
  5. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    Синтаксис я понимаю. А вот логику поймать ну никак немогу. Можно на пальцах? Вот есть стек. Стопка тарелок.
    Код (Text):
    1. mov sp,offset Lab
    теперь на верхней тарелке
    Код (Text):
    1. mov ah,9
    далее 2 пустых оператора
    Код (Text):
    1. mov ax,9090h
    2. push ax
    теперь сверху ещё 2 тарелки но пустые.
    далее
    Код (Text):
    1. int 20h
    и...что далее происходит? 2 пустых оператора(2 байта) затирают прерывание выхода
    Код (Text):
    1. int 20h
    (тоже 2 байта)? почему?
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.710
    Eretic
    а можно и так
    Код (Text):
    1. push offset Lab
    2. retn
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Mikl___
    ты не прав. Калашников не прыгает на то значение, которое в стеке. Посмотри внимательнее. Он устанавливает sp сразу после int 20, а потом заносит в стек 2 байта. Т.е. Калашников, демонстрируя работу стека, в данном примере просто затирает int 20 нопами
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.710
    Eretic
    com- программу завершают так int 20h а можно завершить так retn (если ничего лишнего в стек до этого не помещал) Скорее всего, Калашников хотел продемонстрировать jmp вызываемый через анальное отверстие -- читаем "классиков" Р.Браун Дд.Кайл "Справочник по прерываниям IBM PC"
    "После прерывания int 20 выполнение программы продолжается с адреса, содержащегося в int 22h
    Прерывание 22h -- определяет адрес программы, которой должно быть передано управление после завершения программы, это прерывание не должно вызываться напрямую. так как оно не указывает на обработчик прерывания... вектор востанавливается из DWORD со смещением 0Ah в PSP во время завершения и затем производится дальний переход по адресу в int 22h"
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а в отладчике по шагам пройти и посмотреть никак?
    Код (Text):
    1. mov sp, offset Lab
    2. Lab:
    3. push sp
    4. pop ax
    посмотри еще на действие этих команд.
     
  10. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    смотрел я в отладчике.
    Код (Text):
    1. mov sp,0109
    2. mov ax,9090h
    3. SUB [3102],BL  ;вместо push
    4. mov ah,9
    5. mov dx,0116
    6. int 21h
    7. NOP
    8. NOP
    9. ...
    Парни, я неделю тока асм изучаю. Вопрос только почему в проге в первом посте NOP затирает 20h. Просто немогу уловить это. Похоже стоит пока забить. С опытом думаю прийдёт.
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.710
    каким afd.exe или insight.com? Они "внутри прерывания int 20h" не работают :dntknw:
     
  12. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    Учу по книжке поэтому и буру инструмент который в книжке. AFDPRO.EXE
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    нет :) вот как раз калашников и хотел показать, как растет esp - для этого он затер команду int 20 - я ж учился по калашникову :) Да и сам посмотри, что выполняет этот код. Никаким push/retn и близко не пахнет
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.710
    Всё понял! cd 20 затерло 90 90 и передало на них управление :)
     
  15. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    вот у тебя стек
    aa
    bb
    cc
    dd
    ee
    В данный момент sp указывает на cc. Что произойдет с sp, когда ты положишь в стек xx? правильно! в стеке будет такое:
    aa
    xx (!)
    cc
    dd
    ee
    а сам sp будет указывать уже на аа!!! Стек - это такая же память, как и та, где лежит код. Адресация та же самая.
     
  16. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    MSoft
    ага это понял. Спасибо. НО!:)
    Приминительно к нашей проге.
    до прерывания 21h стек у нас такой?

    NOP
    NOP
    ah,09 ;на неё ссылается sp

    далее прерывание 20h. Немогу чтото в калашникове найти как она именно работает. Говорится только что закрывает досовское окно. Как это прерывание связано со стеком?
     
  17. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    А всё понял!
    MSoft, Mikl___ огромное вам спасибо!
     
  18. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    блин, я жестоко ошибся в 15 посте
    замените "а сам sp будет указывать уже на аа!!!"
    на "а сам sp будет указывать уже на хх!!!"
     
  19. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Какая-то кривая программка.

    Допустим, после инструкции mov sp, offset Lab происходит прерывание - ближайшие инструкции затерты.

    Допустим, прерывание не происходит - nop'ы выписываются в память, а int 20h уже может находиться в очереди предвыборки, поэтому велика вероятность, что это инструкция все равно будет выполнена, хотя и затерта nop'ами.
     
  20. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Phantom_84
    Почитайте про различие i486 и Pentium. Из-за введения конвееризации суть очереди предвыборки слегка изменилась. Начиная с Pentium'a при записи в страницу сегмента кода (страницу, на которой идет выполнение) происходит сбрасывание и перезагрузка очереди