Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ассемблерная вставка в модели HUGE 
:(
    Опции темы
somwan
Дата 16.4.2014, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!

  Нужна помощь профессионалов. Ассемблер не моя язык, мой С++, ассемблером не занимался, но пришлось включить в проект С++ вставку, написанную на ассемблере.
Ниже показана сама вставка.
Код

; ===================================================
; Листинг 2. Инициализация и вызов драйвера IPX/SPX
; Файл ipxdrv.asm
;
; (C) A. Frolov, 1993
; ===================================================

.286
.MODEL SMALL
; ---------------------------------------
; Структура для вызова драйвера IPX/SPX
; ---------------------------------------

        IPXSPX_REGS struc
                rax     dw ?
                rbx     dw      ?
                rcx     dw      ?
                rdx     dw      ?
                rsi     dw      ?
                rdi     dw      ?
                res     dw      ?
        IPXSPX_REGS ends

.DATA

; Точка входа в драйвер IPX/SPX

_ipxspx_drv_entry       dd ?

.CODE

        PUBLIC  _ipxspx_entry, _ipx_init
        PUBLIC  _ipxspx_drv_entry

; ---------------------------------------
; Процедура, вызывающая драйвер IPX/SPX
; ---------------------------------------

_ipxspx_entry PROC FAR

; Готовим BP для адресации параметра функции

                push    bp
                mov      bp,sp

; Сохраняем регистры, так как драйвер IPX/SPX
; изменяет содержимое практически всех регистров

                push    es
                push    di
                push    si
                push    dx
                push    cx
                push    bx
                push    ax

; Загружаем регистры из структуры,
; адрес которой передается как параметр

                push    ds
                mov     bx, [bp+6]   ; смещение
                mov     ds, [bp+8]   ; сегмент
                mov     es, ds:[bx].res
                mov     di, ds:[bx].rdi
                mov     si, ds:[bx].rsi
                mov     dx, ds:[bx].rdx
                mov     cx, ds:[bx].rcx
                mov     ax, ds:[bx].rax
                mov     bx, ds:[bx].rbx
                pop     ds

; Вызываем драйвер IPX/SPX

                call    [dword ptr _ipxspx_drv_entry]

; Сохраняем регистры

                push    ds
                push    dx
                mov     dx, bx

; Записываем в структуру содержимое регистров после вызова драйвера

                mov     bx, [bp+6]       ; смещение
                mov     ds, [bp+8]   ; сегмент
                mov     ds:[bx].rax, ax
                mov     ds:[bx].rcx, cx
                mov     ds:[bx].rbx, dx
                pop     dx
                mov     ds:[bx].rdx, dx
                pop     ds

; Восстанавливаем регистры

                pop     ax
                pop     bx
                pop     cx
                pop     dx
                pop     si
                pop     di
                pop     es

                pop     bp
                retf
_ipxspx_entry ENDP

; ---------------------------------------------
; Процедура инициализации драйвера IPX/SPX
; ---------------------------------------------

_ipx_init PROC NEAR
                push    bp
                mov      bp,sp

; Определяем наличие драйвера в системе и его точку входа

                mov     ax, 7a00h
                int     2fh

; Если драйвера нет, завершаем процедуру

                cmp     al, 0ffh
                jne     _ipx_init_exit

; Сохраняем адрес точки входа

                mov     word ptr _ipxspx_drv_entry+2, es
                mov     word ptr _ipxspx_drv_entry, di

_ipx_init_exit:

; В регистре AX - код завершения процедуры

                mov     ah, 0
                pop     bp
                ret
_ipx_init ENDP
end



   Раньше, когда модель памяти основног опроекта была COMPACT, всё прекрасно работало. Но с переходам к HUGE отказалось работать. Ясно что проблема в коде вставки т.к. однако где именно непонятно. Прошу помоч дельным советом, что поправить чтобы заработало. Работаю в Borland C++ 3.1.

Добавлено через 6 минут и 39 секунд
  Да вот ещё что уже удалось понять. В показанном коде две процедуры 1 - ipxspx_entry , 2 - ipx_init. Проблема со второй. она получает точку входа в драйвер IPX., которую пишет в переменную ipxspx_drv_entry. При модели COMPACT (когда всё работало) значение данной переменой после работы функции было 4026537600, а после перехода на HUGE стало равно 0!. А т.к. нет точки входа, то при работе первой процедуры на вызове драйвера IPX всё виснит. Да и во второй процедуре в конце стоит ret, с ним вообще виснет, при замене на retf работает, но точка входа равна 0.

  Вставка сия взята из книги А.Фролова "библиотека системного программиста", и предназначена для инициализации и вызова драйвера IPX для работы с сетью. 
PM MAIL   Вверх
somwan
Дата 16.4.2014, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



   Как я и подозревал дело было в полторах закорючках!
   Нашол книгу "исскуство программирования на ассемблере" в которой нашёл тему о использовании ассемблера совместно с С++. Показанный в первом сообщении код модифицировал следующим образом:

  
Код

; =================================================== 
; Листинг 2. Инициализация и вызов драйвера IPX/SPX 
; Файл ipxdrv.asm 

; (C) A. Frolov, 1993 
; =================================================== 
 
.286 
.MODEL HUGE, C
; --------------------------------------- 
; Структура для вызова драйвера IPX/SPX 
; --------------------------------------- 
 
        IPXSPX_REGS struc 
                rax     dw ? 
                rbx     dw      ? 
                rcx     dw      ? 
                rdx     dw      ? 
                rsi     dw      ? 
                rdi     dw      ? 
                res     dw      ? 
        IPXSPX_REGS ends 
 
.DATA 
 
; Точка входа в драйвер IPX/SPX 
 
_ipxspx_drv_entry       dd ? 
 
.CODE 
 
               PUBLIC  _ipxspx_drv_entry 
 ; --------------------------------------- 
; Процедура, вызывающая драйвер IPX/SPX 
; --------------------------------------- 
               PUBLIC  C  ipxspx_entry
 ipxspx_entry PROC C FAR 
 
; Готовим BP для адресации параметра функции 
 
                push    bp 
                mov      bp,sp 
 
; Сохраняем регистры, так как драйвер IPX/SPX 
; изменяет содержимое практически всех регистров 
 
                push    es 
                push    di 
                push    si 
                push    dx 
                push    cx 
                push    bx 
                push    ax 
 
; Загружаем регистры из структуры, 
; адрес которой передается как параметр 
 
                push    ds 
                mov     bx, [bp+6]   ; смещение 
                mov     ds, [bp+8]   ; сегмент 
                mov     es, ds:[bx].res 
                mov     di, ds:[bx].rdi 
                mov     si, ds:[bx].rsi 
                mov     dx, ds:[bx].rdx 
                mov     cx, ds:[bx].rcx 
                mov     ax, ds:[bx].rax 
                mov     bx, ds:[bx].rbx 
                pop     ds 
 
; Вызываем драйвер IPX/SPX 
 
                call    [dword ptr _ipxspx_drv_entry] 
 
; Сохраняем регистры 
 
                push    ds 
                push    dx 
                mov     dx, bx 
 
; Записываем в структуру содержимое регистров после вызова драйвера 
 
                mov     bx, [bp+6]       ; смещение 
                mov     ds, [bp+8]   ; сегмент 
                mov     ds:[bx].rax, ax 
                mov     ds:[bx].rcx, cx 
                mov     ds:[bx].rbx, dx 
                pop     dx 
                mov     ds:[bx].rdx, dx 
                pop     ds 
 
; Восстанавливаем регистры 
 
                pop     ax 
                pop     bx 
                pop     cx 
                pop     dx 
                pop     si 
                pop     di 
                pop     es 
 
                pop     bp 
                retf 
 ipxspx_entry ENDP 
 
; --------------------------------------------- 
; Процедура инициализации драйвера IPX/SPX 
; --------------------------------------------- 
               PUBLIC  C ipx_init 
 ipx_init PROC C FAR 
                push    bp 
                mov      bp,sp 
 
; Определяем наличие драйвера в системе и его точку входа 
 
                mov     ax, 7a00h 
                int     2fh 
 
; Если драйвера нет, завершаем процедуру 
 
                cmp     al, 0ffh 
                jne     _ipx_init_exit 
 
; Сохраняем адрес точки входа 
 
                mov     word ptr _ipxspx_drv_entry+2, es 
                mov     word ptr _ipxspx_drv_entry, di 
 
_ipx_init_exit: 
 
; В регистре AX - код завершения процедуры 
 
                mov     ah, 0 
                pop     bp 
                retf 
 ipx_init ENDP 
end 


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

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

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


 




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


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

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