Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Процедуры в Tasm

Автор: IVR 13.04.2004 5:59

Извините. что я так вломился в ваш форум!
У меня есть проблемы с вызовом процедур с параметрами.
Вот в чем дело:

;Допустим такая процедура.
PROC             LaLaLa f:byte  ;f-параметр.
                    ret
ENDP             LaLaLa
                                    ;дальше программа
;      ....
mov              [f],2
call                LaLaLa
; а надо мне вдроде этого:
call                LaLaLa,2

По сути дела первый вызов процедуры не имеет никаких параметров.
Мы все "параметры" задали выше.
А втророй не компилируется.

Так как же сделать процедуру чтобы вызов был как второй пример?

Автор: Dark 13.04.2004 10:00

Аргументы можно передавать 3 путями :
как ты и предложил через переменную
через регистр - то же самое фактически smile.gif
и через стек

В паскале, да и на сколько я знаю в других языках все релизовано через стек

т.е.

push 1_param
push 2_param
...
push n-1_param
push n_param
call  LaLaLa

а в процедуре
PROC             LaLaLa 
;------------------------начало функции----------------------
                   push bp // сохраняем BP
                   mov bp,sp // записываем верхушку стека
;-----------------------------------------------------------------

                   mov ax,[bp+4] // n_param
                   mov ax,[bp+6] // n-1_param
                   mov ax,[bp+8] // n-2_param
                   mov ax,[bp+10] // n-3_param

;------------------------конец функции-----------------------
                   mov sp,bp // восстанавливаем sp
                   pop bp // и значение старого bp
;-----------------------------------------------------------------

                    ret
ENDP             LaLaLa

если что не ясно - спрашивай. smile.gif

Автор: Dark 13.04.2004 10:02

А чтобы был как второй пример - это уже макроассемблер :P

Автор: IVR 13.04.2004 16:57

У тебя нет примеров этих самых процедур. С макро-параметрами, что бы я научился. Очень интересно! :o

Автор: IVR 15.04.2004 9:00

В TASM можно инициализировать графический режим?

P.S. Недавно сделал процедуру для перевода компютера в режим пониженного энерго потребления под DOS. Кому надо, просите.

Автор: Dark 16.04.2004 8:59

можно smile.gif)

mov ax,13h
int 10h - это режим 320*200

выход из режима

mov ax,3h
int 10h

глянь еше на http://forum.pascal.net.ru/index.php?showtopic=19 :D

Тебе нужен пример со стеком? или макросом - макрос он тока в MASM по моему

так же есть про VESA - походи по форуму "ассемблер" там поищи =)

Автор: IVR 17.04.2004 2:29

VGA_BASE        equ     03c0h                  ; or 2c0h for secondary VGA
VGA_TSIDX       equ     VGA_BASE+04h
VGA_TSDATA      equ     VGA_BASE+05h
TS_REG          equ     1
TS_GREEN        equ     20h

CRTC_BASE       equ     03d4h                  ; CGA mode
CRTC_REG        equ     17h
CRTC_GREEN      equ     80h

PROC            EnergyLow
               mov      dx, VGA_TSIDX
               mov      al, TS_REG
               out      dx, al
               inc      dx
               in       al, dx
               mov      bl, al
               dec      dx
               mov      al, TS_REG
               out      dx, al
               inc      dx
               mov      al, bl
               or       al, TS_GREEN
               out      dx, al

               mov      dx, CRTC_BASE
               mov      al, CRTC_REG
               out      dx, al
               inc      dx
               in       al, dx
               and      al, NOT CRTC_GREEN
               out      dx, al

               mov      ah, 0
               int      16h

               mov      dx, VGA_TSIDX
               mov      al, TS_REG
               out      dx, al
               inc      dx
               in       al, dx
               mov      bl, al
               dec      dx
               mov      al, TS_REG
               out      dx, al
               inc      dx
               mov      al, bl
               and      al, NOT TS_GREEN
               out      dx, al

               mov      dx, CRTC_BASE
               mov      al, CRTC_REG
               out      dx, al
               inc      dx
               in       al, dx
               or       al, CRTC_GREEN
               out      dx, al
               ret
ENDP            EnergyLow

Автор: IVR 17.04.2004 15:05

Как создать библеотеку импорта?