Поиск:

Ответ в темуСоздание новой темы Создание опроса
> резидентная прога, работающая с буквами 
:(
    Опции темы
optik
Дата 13.11.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Здраствуйте!
У меня есть прога "Резидентная прога, удаляющая с экрана гласные буквы"
прога состоит из 2х файлов:

Код

.186
INCLUDE IO.ASM

CODE            SEGMENT 'CODE'

                ASSUME  CS:CODE
                ORG     100h

START:          JMP     BEGIN

OLD_2Fh_OFF     DW      0
OLD_2Fh_SEG     DW      0

OLD_08h_OFF     DW      0
OLD_08h_SEG     DW      0

INT2FhHANDLER   PROC    FAR
                CMP     AX, 0FF00h
                JZ      INSTALLED
                JMP     DWORD PTR CS:OLD_2Fh_OFF
INSTALLED:      MOV     AX, 00FFh
                IRET
INT2FhHANDLER   ENDP

Check           MACRO   What
                CMP     AL, What
                JZ      SHORT Glasn
ENDM

DO_MAIN         PROC    FAR
                PUSHF
                PUSH    DS
                PUSH    ES
                PUSHA

                MOV     AX, 0B800h
                MOV     DS, AX
                MOV     ES, AX
                MOV     SI, 0
                MOV     DI, 0

                MOV     CX, 2000
Cycle:
                LODSW
                Check   "a"
                Check   "e"
                Check   "o"
                Check   "u"
                Check   "i"
                Check   "y"

                Check   "A"
                Check   "E"
                Check   "O"
                Check   "U"
                Check   "I"
                Check   "Y"

                JMP     Next
Glasn:
                MOV     AL, " "
Next:
                STOSW
                LOOP  Cycle

                POPA
                POP     ES
                POP     DS
                POPF

                RET
DO_MAIN         ENDP

INT08hHANDLER   PROC    FAR
                CLI
                CALL    DO_MAIN
                JMP     DWORD PTR CS:OLD_08h_OFF
INT08hHANDLER   ENDP

BEGIN:          CLI
                MOV     AX, 0FF00h
                INT     2Fh                     ;Проверка повторной загрузки
                CMP     AX, 00FFh
                JE      EXIT                    ; Придется выйти

                MOV     AX, 352Fh               ; Запомнить старый INT 2Fh
                INT     21h
                MOV     CS:OLD_2Fh_OFF, BX
                MOV     CS:OLD_2Fh_SEG, ES

                PUSH    CS
                POP     DS

                MOV     AX, 3508h               ; Запомнить старый INT 08h
                INT     21h
                MOV     CS:OLD_08h_OFF, BX
                MOV     CS:OLD_08h_SEG, ES

                PUSH    CS
                POP     DS

                MOV     AX, 2508h               ; Поставить новый INT 08h
                PUSH    DS
                MOV     DX, OFFSET INT08hHANDLER
                INT     21h
                POP     DS

                MOV     AX, 252Fh               ; Поставить новый INT 2Fh
                PUSH    DS
                MOV     DX, OFFSET INT2FhHANDLER
                INT     21h
                POP     DS

                STI
                MOV     AX, 3100h
                MOV     DX, 24d
                INT     21h
EXIT:
                STI
                FINISH
STOPPROG:
CODE            ENDS
                END     START


;--------------------------------------------------------------------------------.


.XLIST
EXTRN    MAXB:BYTE,BUF:BYTE,PROCREADBUF:FAR
FINISH    MACRO
    MOV    AH,4Ch
    INT    21h
    ENDM
EXTRN    PROCNL:FAR
NEWLINE    MACRO
    CALL PROCNL
    ENDM
OUTCH    MACRO    C
    PUSH    DX
    PUSH    AX
    MOV    DL,C
    MOV    AH,2
    INT    21h
    POP    AX
    POP    DX
    ENDM
OUTSTR    MACRO
    PUSH    AX
    MOV    AH,9
    INT    21h
    POP    AX
    ENDM
EXTRN    PROCOUTNUM:FAR
OUTINT    MACRO    NUM,LENG
    OUTNUM    <NUM>,<LENG>,1
    ENDM
OUTWORD    MACRO    NUM,LENG
    OUTNUM    <NUM>,<LENG>,0
    ENDM
SAME    MACRO    NAME,VARIANTS,ANS
    ANS=0
    IRP V,<VARIANTS>
        IFIDN <NAME>,<V>
            ANS=1
            EXITM
        ENDIF
    ENDM
    ENDM
OUTNUM    MACRO    NUM,LENG,SIGN
    LOCAL    REGDX?
    PUSH    AX
    PUSH    DX
    SAME    <NUM>,<dx,DX,Dx,dX>,REGDX?
    IF    REGDX?
        IFB    <LENG>
            MOV    AL,0
        ELSE
            MOV    AL,LENG
        ENDIF
        XCHG    AX,DX
    ELSE
        IFB    <LENG>
            MOV    DL,0
        ELSE
            MOV    DL,LENG
        ENDIF
        MOV    AX,NUM
    ENDIF
    MOV    DH,SIGN
    CALL    PROCOUTNUM
    POP    DX
    POP    AX
    ENDM
EXTRN    PROCFLUSH:FAR
FLUSH    MACRO
    CALL    PROCFLUSH
    ENDM
EXTRN    PROCINCH:FAR
INCH    MACRO    X
    LOCAL    REGAX?
    SAME    <X>,<ah,AH,Ah,aH>,REGAX?
    IF    REGAX?
        XCHG    AH,AL
        MOV    AL,0
        CALL    PROCINCH
        XCHG    AH,AL
    ELSE
        SAME    <X>,<al,AL,Al,aL>,REGAX?
        IF    REGAX?
            MOV    AL,0
            CALL    PROCINCH
        ELSE
            PUSH    AX
            MOV    AL,0
            CALL    PROCINCH
            MOV    X,AL
            POP    AX
        ENDIF
    ENDIF
    ENDM
EXTRN    PROCINSTR:FAR
READBUF    MACRO
    CALL    PROCREADBUF
    ENDM
.LIST


Вопрос следущий:
мне нужна чтоб вся прога была на обычном ассеблере( если не ошибаюсь то во 2м файле исп-ся элементы макроассемблера)
и мне многое там непонятно (например такие строки как:
>>  SAME    <X>,<al,AL,Al,aL>,REGAX?
>>  IFB    <LENG>
>>  OUTNUM    <NUM>,<LENG>,1

Могли бы вы помочь переписать эту прожку на "обычный" ассемблер? 
или пояснить эту прожку?
или помочь найти прожу для задания: "резидентная программа, заменяющая буквы a,b,c,d,e на знак "*"(также пойдёт и прожка:удаление гласных, согласных и др. букв, так как её я смогу переделать под свою)?

Это сообщение отредактировал(а) optik - 13.11.2006, 23:29
PM MAIL   Вверх
dumb
Дата 14.11.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



из второго файла использовался только макрос FINISH...
Код

.186
CODE            SEGMENT 'CODE'
                ASSUME  CS:CODE
                ORG     100h
START:          JMP     BEGIN
OLD_2Fh_OFF     DW      0
OLD_2Fh_SEG     DW      0
OLD_08h_OFF     DW      0
OLD_08h_SEG     DW      0
INT2FhHANDLER   PROC    FAR
                CMP     AX, 0FF00h
                JZ      INSTALLED
                JMP     DWORD PTR CS:OLD_2Fh_OFF
INSTALLED:      MOV     AX, 00FFh
                IRET
INT2FhHANDLER   ENDP
Check           MACRO   What
                CMP     AL, What
                JZ      SHORT Glasn
ENDM
DO_MAIN         PROC    FAR
                PUSHF
                PUSH    DS
                PUSH    ES
                PUSHA
                MOV     AX, 0B800h
                MOV     DS, AX
                MOV     ES, AX

                XOR     SI, SI
                MOV     DI, SI
                MOV     CX, 80*25 ;2000
Cycle:
                LODSW
                Check   "a"
                Check   "e"
                Check   "o"
                Check   "u"
                Check   "i"
                Check   "y"
                Check   "A"
                Check   "E"
                Check   "O"
                Check   "U"
                Check   "I"
                Check   "Y"
                JMP     Next
Glasn:
                MOV     AL, " "
Next:
                STOSW
                LOOP  Cycle
                POPA
                POP     ES
                POP     DS
                POPF
                RET
DO_MAIN         ENDP
INT08hHANDLER   PROC    FAR
                CLI
                CALL    DO_MAIN
                JMP     DWORD PTR CS:OLD_08h_OFF
INT08hHANDLER   ENDP
BEGIN:          CLI
                MOV     AX, 0FF00h
                INT     2Fh                     ;Проверка повторной загрузки
                CMP     AX, 00FFh
                JE      EXIT                    ; Придется выйти
                MOV     AX, 352Fh               ; Запомнить старый INT 2Fh
                INT     21h
                MOV     CS:OLD_2Fh_OFF, BX
                MOV     CS:OLD_2Fh_SEG, ES
                PUSH    CS
                POP     DS
                MOV     AX, 3508h               ; Запомнить старый INT 08h
                INT     21h
                MOV     CS:OLD_08h_OFF, BX
                MOV     CS:OLD_08h_SEG, ES
                PUSH    CS
                POP     DS
                MOV     AX, 2508h               ; Поставить новый INT 08h
                PUSH    DS
                MOV     DX, OFFSET INT08hHANDLER
                INT     21h
                POP     DS
                MOV     AX, 252Fh               ; Поставить новый INT 2Fh
                PUSH    DS
                MOV     DX, OFFSET INT2FhHANDLER
                INT     21h
                POP     DS
                STI
; освободим довольно увесистый блок окружения (environment)
                PUSH    ES
                MOV     AX, CS:[2Ch] ; получаем сегмент блока окружения из PSP
                MOV     ES, AX
                MOV     AH, 49h
                INT     21h ; освобождаем
                POP     ES

                MOV     AX, 3100h
; Получаем размер кода в байтах от метки START до STOPPROG, делим на 10h (т.к. в DX - число параграфов)
; +1, т.к. деление целочисленное и остаток отброшен, + 10h - размер PSP в параграфах.
                MOV     DX, ((STOPPROG-START) / 10h + 1) + 10h
                INT     21h
EXIT:
                STI
                MOV     AH,4Ch
                INT     21h
STOPPROG:
CODE            ENDS
                END     START

PM MAIL   Вверх
optik
Дата 19.11.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



dumb, респект! спасибо за помощь!
а как надо запускать эту прожку правильно?
в cmd можно? или придётся создавать загрузочную дискету и грузить комп с неё чтоб в дос попасть? (так как елси не ошибаюсь в Windows XP нет доступа к dos в явном виде..)
PM MAIL   Вверх
dumb
Дата 19.11.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



если в cmd.exe запустить сначала что-нибудь DOS'овское(например, Turbo Debugger[td.exe]), то заработает. ну а с дискетки в дос - там сразу все путем будет... smile
PM MAIL   Вверх
optik
Дата 19.11.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



оО) попробовал в досе с дискетки - сработало!) даже понравилось) тока долго это всё, пока перезагрузишь, опять виндоуз включишь...
а вот про способ с td.exe я не особо понял. Можете пояснить?

p.s. есть ли ещё способы запуска резидентных прог под windows xp?
PM MAIL   Вверх
dumb
Дата 20.11.2006, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(optik @  19.11.2006,  23:03 Найти цитируемый пост)
а вот про способ с td.exe я не особо понял. Можете пояснить?

winxp в своем dos-box'е неким образом "замораживает" таймерное прерывание(а может и еще какие-то тоже) до какого-то момента - момент этот наступает, видимо, при вызове какой-то функции dos'а или bios'а (неохота выяснять, от чего именно это зависит).
вобщем, если запустить какое-либо приложение dos'а с интерфейсом(bc.exe/bp.exe/td.exe/итд итп), то прерывания "включаются".
PM MAIL   Вверх
optik
Дата 22.11.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



dumb, спасибо разобрался)

p.s. а ещё по ходу вопрос возник.. есть строчка установки счётчика для цикла loop
Код

MOV     CX, 80*25 ; 2000символов

т.е. мы обрабатываем 2000 символов (хотя на самом деле помоему получается гораздо меньше)
а можно сделать неограниченное кол-во символов для обработки? или предел должен быть?
т.е. чтоб после введёных "2000 символов" обработка не заканчивалась...

Это сообщение отредактировал(а) optik - 23.11.2006, 16:27
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.