код Код (Text): ------------------------ CSEG segment assume cs:CSEG, es:CSEG, ds:CSEG, ss:CSEG org 100h begin: mov sp,offset mda mov ax,9090h push ax int 20h ; не понимаю вот тут mda: mov ah,9 mov dx,offset message int 21h int 20h message db 'блаблабла$' CSEG ends end begin ------------------------ Уважаемые, помогите разобраться как идёт переход по коду после int 20h ... Я никак не могу сообразить. понимаю что со стеком какие то хитрости, но смысл не улавливаю... тег [ code ] пользуем, не стесняемся
Дело в том что номера прерываний берут каждое свой адрес в начале памяти, я уже не помню как и что, т.к. в dos давно не программировал. Но примерно вот такая тема int 0 - 0000:0000 int 1 - 0000:0004 int 2 - 0000:0008 ... Вот и ищи какой адрес хранится для int20h
Пчитай вот ето Книга по программированию на Ассемблере по материалам рассылки "Ассемблер? Это просто! Учимся программировать" Олег Калашников
стек растёт сверху вниз. а программа в памяти распологается снизу верх. То есть предположим что метка mda имеет смещение 100h, а int 21h - 9Eh(так как в машинном представлении in 21h занимает 2 байта). Когда ты помещаешь в sp 100h, при push, байты 9090h ложатся по адресу 9Eh, а sp = sp - 2;
Ага, по идее вместо int 20h можно было писать хоть ret, хоть что... интересная штука. int 20h - скорее всего имитация завершения, чтобы эвристик там обмануть... Intruder Посмотреть можно в отладчике, который не работает на стеке отлаживаемой программы, например в SoftIce.