Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Предача прараметров

9.9K
02 апреля 2007 года
AndreiPH
18 / / 24.02.2006
Есть процедуры, написанные на ассемблере, скомпилированны TASM'ом.
Как в Delphi правильно предать параметры в эту прочедуру? Как получить возвращаемые параметры? Что нужно изменить коде?
( MOV EBX,[EBP+8]
MOV AX,[EBX] )
261
02 апреля 2007 года
ahilles
1.5K / / 03.11.2005
ты нормально вопрос изложи. Ты эту процедуру в библиотеку засунул или что? если ты их в библиотеку засунул, то в исходнике TASM объяви процудуру как stdcall и потом объявляй в дельфи функцию как stdcall и external из твоей библиотеки
9.9K
03 апреля 2007 года
AndreiPH
18 / / 24.02.2006
Цитата: ahilles
ты нормально вопрос изложи. Ты эту процедуру в библиотеку засунул или что? если ты их в библиотеку засунул, то в исходнике TASM объяви процудуру как stdcall и потом объявляй в дельфи функцию как stdcall и external из твоей библиотеки



Подключаю как obj файл {$L *.obj}.
В Делфи функция выгляди вот так
Function SendByte(D:byte):integer; external;
Как передать параметр D в функцию?

Вот код функции

Код:
SendByte    Proc    NEAR    ; (D:Word);
    Public  SendByte

    PUSH    EBP
    MOV EBP,ESP
    Push    EBX

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Mov AH,0        ; Получить
    Int 1AH     ; значение текущего времени в тиках
    And DX,3
    Mov T1,DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M0: Mov  DX,RLPT_SI   ; Регистр состояния порта
    In   AL,DX        ; Проверить готовность контроллера
    Test AL,01000000b ;  к приему очередного байта
    JNE   M0S

    Mov AH,0        ; Получить
    Int 1AH     ; значение текущего времени в тиках
    And DX,7
    Sub DX,T1
    Cmp DX,2
    JNE M0
    Mov EAX,-1
    Jmp ErrB


M0S:    Mov EBX,[EBP+8]
    MOV AX,[EBX]

    Mov DX,RLPT_D    ; Регистр данных порта
    Out DX,AL        ; Послать байт в порт
    Mov DX,RLPT_SO   ; Регистр управления
    Mov AL,00000001b ; Выдать сигнал

    Cmp Osc,0           ; Подавать тактовую частоту?
    JNE M11
    Or  AL,00000100b    ; Выключить подачу тактовой частоты

M11:    Out  DX,AL      ;  установленных данных

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Mov AH,0        ; Получить
    Int 1AH     ; значение текущего времени в тиках
    And DX,3
    Mov T1,DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M2: Mov  DX,RLPT_SI     ; Регистр состояния порта
    In  AL,DX       ; Подождать пока
    Test    AL,01000000b    ;  контроллер
    JE  M2S     ;  прочитает данные

    Mov AH,0        ; Получить
    Int 1AH     ; значение текущего времени в тиках
    And DX,7
    Sub DX,T1
    Cmp DX,2
    JNE M2
    Mov EAX,-2
    Jmp ErrB

M2S:    Mov  DX,RLPT_SO   ; Регистр управления
    Mov  AL,00000000b ; Снять сигнал

    Cmp Osc,0           ; Подавать тактовую частоту?
    JNE M3
    Or  AL,00000100b    ; Выключить подачу тактовой частоты
M3: Out DX,AL       ;  выставленных данных
    Mov EAX,0

ErrB:   Pop EBX
    Pop EBP
    Ret

SendByte    EndP;
261
03 апреля 2007 года
ahilles
1.5K / / 03.11.2005
у тебя эта функция не попрёт в дельфийской программе потому в программа работает в защищённом режиме в 3 кольце в Windows. А что бы процедура работала нужен реальный режим или режим виртуального 8086, а это не представляется возможным ибо это исключает нормальную работу самой дельфийской программы
4.6K
03 апреля 2007 года
Tokolist
268 / / 22.03.2007
Цитата: ahilles
у тебя эта функция не попрёт в дельфийской программе потому в программа работает в защищённом режиме в 3 кольце в Windows. А что бы процедура работала нужен реальный режим или режим виртуального 8086, а это не представляется возможным ибо это исключает нормальную работу самой дельфийской программы



Верно подмечено! Низя использовать прерывания (int).

2 AndreiPH
На счет передачи параметров - смотри Calling conventions в хелпе.

ИМХО лучше использовать такую конструкцию

 
Код:
function Foo(X, Y: Integer): Longint;  
asm
  MOV EAX, X
  ...
end;
9.9K
05 апреля 2007 года
AndreiPH
18 / / 24.02.2006
Цитата: Tokolist
Верно подмечено! Низя использовать прерывания (int).

2 AndreiPH
На счет передачи параметров - смотри Calling conventions в хелпе.

ИМХО лучше использовать такую конструкцию

 
Код:
function Foo(X, Y: Integer): Longint;  
asm
  MOV EAX, X
  ...
end;



Правда, превыватия на NT-шном ядре не работают, а в 9х все ОК.

Использовать вставки не получиться, появляются ошибки при вызове процедур.
за Calling conventions - спасибо, буду разбираться

261
05 апреля 2007 года
ahilles
1.5K / / 03.11.2005
в процедуру не вчитывался, что она делает?, в коментариях написаны "тики" и тактовая частота, наверно определение частоты процессора, мне кажется все можно сделать на дельфи без ассемблера
9.9K
05 апреля 2007 года
AndreiPH
18 / / 24.02.2006
Цитата: ahilles
в процедуру не вчитывался, что она делает?, в коментариях написаны "тики" и тактовая частота, наверно определение частоты процессора, мне кажется все можно сделать на дельфи без ассемблера



Нет это не определение чатоты процессора, это часть драйвера управления установкой, подключенного через LPT. Написать все в дельфи пока не получается

4.6K
06 апреля 2007 года
Tokolist
268 / / 22.03.2007
Цитата: AndreiPH
Использовать вставки не получиться, появляются ошибки при вызове процедур.



Конечно будут появляться. Нужно это процедуру переработать чуть. Тут методом копи-пасте не получится :)

261
06 апреля 2007 года
ahilles
1.5K / / 03.11.2005
всё что касается устройств в винде просто так не сделаешь, если надо работать с устройством напрямую на асме, то придётся писать драйвер
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог