С помощью PROTO и INVOKE для вызова функции C из MASM

ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.

Эта статья на английском языке: 73407
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.
Аннотация
С Microsoft Macro Assembler (MASM) версии 6.0, написания кода для вызова процедуры может быть упрощен с помощью PROTO и INVOKEdirectives. Эти директивы обработки многие детали, такие aspushing generatingthe правильных внешних ссылок, преобразование аргументы для correctsize и очистка стека (если требуется) после functionterminates параметров в стеке в правильном порядке.

Ниже двух примеров программ иллюстрируют, как функции C — calledfrom MASM, как с и без директивы PROTO и INVOKE. 1 образец кода вызывает функцию printf() C помощью conventionalmethod кода. Пример кода 2 показан упрощенный вызов samefunction PROTO и INVOKE.
Дополнительная информация
PROTO определяет прототип для процедуры значительно functionprototype работу в C. Это синтаксис PROTO:
   label PROTO [distance] [langtype] [,[parameter]:tag]				
Имя оператора используется ассемблер Чтобы проверить количество typesand параметр, а также соглашение об именах для это функция, указывающее. Список thetype и, при необходимости, имя параметра указываются аргументы для функции. Например,
   myfunc PROTO C arg1:SWORD, arg2:SBYTE				
Это означает, что функция myfunc принимает два аргумента. Firstis знаком word, второй — байт со знаком. Если требуется, чтобы список variableargument, используется тип с переменным количеством АРГУМЕНТОВ.

INVOKE фактически создает код для вызова функции. Необходимо havedefined функцию ранее PROC, EXTERNDEF, aTYPEDEF или имя оператора. Далее представлен синтаксис для ВЫЗОВА:
   INVOKE expression [,arguments]				
Так как ассемблер знает, что функция ожидает аргументы wayof и соглашение о вызовах, он может принимать аргументы passedin инструкцию ВЫЗОВА и помещает их в стек в correctorder, вызов функции с помощью имени необходимые функции и очистки стека после этого (если требуется использовать соглашение о вызовах).

Если аргумент, переданный с помощью INVOKE меньше типа, указанного в операторе PROTO, MASM выполняет преобразование типов. Он может быть расширен theargument в операторе PROTO в соответствии в операторе ВЫЗОВА (например, SBYTE на КОНЦАХ). Эти типы преобразований используйте AXand DX регистры 8086 и 8088 и EAX и EDX регистрирует на 80386/80486. Поскольку эти регистры эффективно перезаписываются, следует позаботиться следует применять эти регистры для передачи аргументов.

Тип языка для функции определяет именования и callingconventions. В дополнение к типу языка в операторе PROTO, можно задать тип языка,. Директивы МОДЕЛИ, OPTIONLANGTYPE:, или /Gc переключатели командной строки (для языка Pascal) и /Gd (для C). Отсутствует таблица providedin соглашения о различных языка справки.

Пример кода 1

; Assemble options needed: /MX          .MODEL small,c             ; The "c" langtype prepends                                     ; labels with an underscore.     ;-----for OS/2-------     ;INCLUDELIB OS2.LIB     ;INCLUDE    OS2.INC     ;--------------------EXTRN     _acrtused:NEAREXTRN     printf:NEAR          .DATAfmtlist   db     "%s, %d, %lu", 0Ah,0string_1  db     "signed byte and unsigned double word", 0data_1    db     -2data_2    dd     0FFFFFFFFh          .CODEmain      PROC          push   word ptr data_2+2   ; push the high word of data_2          push   word ptr data_2     ; push the low word of data_2          mov    al,data_1          cbw                        ; converts data_1 to a word          push   ax          mov    ax,offset string_1  ; load the address of string_1          push   ax                  ; push the address on the stack          lea    ax,fmtlist          ; load the address of fmtlist          push   ax                  ; push the address on the stack          call   printf              ; call the C library function          add    sp,0Ah              ; adjust the stackpointermain      ENDP          ret          end				

Пример кода 2

; Assemble options needed: none          .MODEL small,c    ;-----for OS/2--------|    ;.MODEL small,c,os_os2|    ;INCLUDELIB OS2.LIB   <---Not needed if "os_os2" indicated. The    ;INCLUDE    OS2.INC   |   assembler knows to look for os2.lib    ;---------------------|   in the path set by the lib environment    ;                     |   variable.EXTERNDEF _acrtused:WORDprintf    PROTO arg1:Ptr Byte, printlist: VARARG;The first argument is a pointer to a string. The second is a keyword; that permits a variable number of arguments.          .STACK 100h          .DATAfmtlist   BYTE   "%s, %d, %lu", 0Ah,0string_1  BYTE   "signed byte and unsigned double word", 0data_1    SBYTE  -2data_2    DWORD  0FFFFFFFFh          .CODEmain      PROCINVOKE    printf, ADDR fmtlist, ADDR string_1, data_1, data_2main      ENDP          ret          end				
6.00 6.00a kbinf 6.00b s_c

Свойства

Номер статьи: 73407 — последний просмотр: 07/03/2016 19:04:00 — редакция: 6.0

Microsoft Macro Assembler 6.0 Standard Edition

  • kbmt KB73407 KbMtru
Отзывы и предложения