Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2014, 11:31   #1
somwan
Пользователь
 
Регистрация: 05.11.2008
Сообщений: 33
По умолчанию ассемблерная вставка в код С++

Приветствую, всем здравствовать!

прошу помощи по вопросу использования ассемблерной вставки в коде С++. Компилятор BORLAND C++ 3.1. В некоторый момент потребовалось организовать обмен данными через сеть. Нашол на просторах инета полезную книгу "библиотека системного программиста А.Фролова". В этой книге есть пример клиент сервера для протокола IPX. Мне это подошло. Присовокупил к проекту, адаптировал под себя, вобщем всё заработало, слава Фролову. Исходно модель памяти, используемая в проекте была COMPACT. Однако со временем размер проекта разросся и перестал линковаться в данной модели. Попытался перейти на HUGE, линкуется, запускается, но неработает. Проблема в ассемблерной вставке из книги г.Фролова. Код данной вставки привожу ниже:
Код:
   
; ===================================================
; Листинг 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
Данная вставка отказывается работать в модели HUGE. В процедуре ipx_init доходит до команды ret и ВСЁ - виснит. В ассемблере я совсем не понимаю, поэтому прошу помощи.
somwan вне форума Ответить с цитированием
Старый 17.04.2014, 13:08   #2
somwan
Пользователь
 
Регистрация: 05.11.2008
Сообщений: 33
По умолчанию

Всем спасибо за интерес, вопрос решён.

тему можно закрывать.
somwan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблерная вставка Serg12 Помощь студентам 5 04.05.2017 19:43
Ассемблерная вставка на С++ CrashOveride Помощь студентам 1 01.04.2014 08:42
ассемблерная вставка Веди Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 15 12.07.2012 13:34
Ассемблерная вставка! treki Помощь студентам 0 16.06.2010 00:15