D
Dimkawshm
Книгу Владислав Пирогова Юрьевича я скачал висьма недавно, я открыл ее и раньше и прочитал 5 листов.
Читаю сегодня
Простой пример использования ассемблера
с языками высокого уровня
В данном разделе рассматривается простой модуль на языке ассемблера, со-
держащий процедуру, копирующую одну строку в другую. Мы подсоединяем
этот модуль к программам, написанным на языках С и Паскаль, с использо-
ванием трансляторов: Visual C++ 2005 и Delphi 8.0.
Остановимся вначале на языке C++. Функцию, вызываемую из модуля, напи-
санного на языке ассемблера, мы объявляем при помощи модификаторов
Глава 3.7. Совместное использование ассемблера с языками высокого уровня 585
extern "C" и С (в ассемблерном модуле). Соглашение C предполагает, что
стек освобождается в вызывающем модуле (см. табл. 3.7.1). В ассемблерном
модуле вызываемая процедура должна быть дополнительно объявлена при
помощи директивы PUBLIC. Модули на языке ассемблера и языке C++ пред-
ставлены в листинге 3.7.1.
Листинг 3.7.1. Пример подключения объектного модуля к программе на языке
C++ (тип согласования вызовов C)
//файл copyc.cpp
#include <stdio.h>
#include <windows.h>
extern "C" char * COPYSTR(char *, char *);
void main()
{
char s1[100];
char *s2="Privet!";
printf("%s\n",COPYSTR(s1,s2));
printf("%s\n",s1);
ExitProcess(0);
}
;файл copy.asm
.586P
;плоская модель памяти
.MODEL FLAT, C
PUBLIC COPYSTR
_TEXT SEGMENT
;процедура копирования одной строки в другую
;строка, куда копировать [EBP+08H]
;строка, что копировать [EBP+0СH]
;не учитывает длину строки, куда производится копирование
COPYSTR PROC
PUSH EBP
MOV EBP,ESP
MOV ESI,DWORD PTR [EBP+0CH]
MOV EDI,DWORD PTR [EBP+08H]
L1:
MOV AL,BYTE PTR [ESI]
MOV BYTE PTR [EDI],AL
CMP AL,0
JE L2
INC ESI
INC EDI
586 Часть III. Сложные примеры программирования в Windows
JMP L1
L2:
MOV EAX,DWORD PTR [EBP+08H]
LEAVE
RET
COPYSTR ENDP
_TEXT ENDS
END
Трансляция программы из листинга 3.7.1:
ml /c /coff copy.asm
Далее транслируется программа на языке C++.
Комментарий к модулям в листинге 3.7.1.
Для того чтобы скомпоновать объектный модуль в проект на языке Visual
C++, следует обратиться к окну свойств проекта. На вкладке Linker |
Command Line указать полное имя объектного модуля. В нашем случае
я указал ..\..\..\copy.obj.
Обратите внимание, как мы согласовали параметры. Выбрав тип согласо-
вания C, мы тем самым избавили себя от суффикса @, а во-вторых, нам не
надо заботиться об очистке стека в ассемблерном модуле, потому что очи-
стку осуществляет вызывающая сторона.
Зададимся теперь следующим вопросом. Как следует изменить ассемблерный
модуль, если в нем установлено соглашение о вызовах stdcall? Порядок сле-
дования параметров не изменился, но MASM будет добавлять в конце имени
суффикс @. В данном случае в модуле на языке C++ следует указать при объ-
явлении функции COPYSTR тип вызова __stdcall (листинг 3.7.2).
Так вот. Я же знаю что тут что то не то. Как то не так Владислав Юрьевич пишет. В С++ принято вставлять ассемблерный код с помощю __asm{ юююю }
Как это его с ключами ассемблировать? ..Читаю и перечитываю. Если в студии то как с ключами, а если батником и с помощю masm32 или побного и заранее то тагда что, я же получу экзешник и что?
Что же имел Пирогов Владислав Юрьевич?
Читаю сегодня
Простой пример использования ассемблера
с языками высокого уровня
В данном разделе рассматривается простой модуль на языке ассемблера, со-
держащий процедуру, копирующую одну строку в другую. Мы подсоединяем
этот модуль к программам, написанным на языках С и Паскаль, с использо-
ванием трансляторов: Visual C++ 2005 и Delphi 8.0.
Остановимся вначале на языке C++. Функцию, вызываемую из модуля, напи-
санного на языке ассемблера, мы объявляем при помощи модификаторов
Глава 3.7. Совместное использование ассемблера с языками высокого уровня 585
extern "C" и С (в ассемблерном модуле). Соглашение C предполагает, что
стек освобождается в вызывающем модуле (см. табл. 3.7.1). В ассемблерном
модуле вызываемая процедура должна быть дополнительно объявлена при
помощи директивы PUBLIC. Модули на языке ассемблера и языке C++ пред-
ставлены в листинге 3.7.1.
Листинг 3.7.1. Пример подключения объектного модуля к программе на языке
C++ (тип согласования вызовов C)
//файл copyc.cpp
#include <stdio.h>
#include <windows.h>
extern "C" char * COPYSTR(char *, char *);
void main()
{
char s1[100];
char *s2="Privet!";
printf("%s\n",COPYSTR(s1,s2));
printf("%s\n",s1);
ExitProcess(0);
}
;файл copy.asm
.586P
;плоская модель памяти
.MODEL FLAT, C
PUBLIC COPYSTR
_TEXT SEGMENT
;процедура копирования одной строки в другую
;строка, куда копировать [EBP+08H]
;строка, что копировать [EBP+0СH]
;не учитывает длину строки, куда производится копирование
COPYSTR PROC
PUSH EBP
MOV EBP,ESP
MOV ESI,DWORD PTR [EBP+0CH]
MOV EDI,DWORD PTR [EBP+08H]
L1:
MOV AL,BYTE PTR [ESI]
MOV BYTE PTR [EDI],AL
CMP AL,0
JE L2
INC ESI
INC EDI
586 Часть III. Сложные примеры программирования в Windows
JMP L1
L2:
MOV EAX,DWORD PTR [EBP+08H]
LEAVE
RET
COPYSTR ENDP
_TEXT ENDS
END
Трансляция программы из листинга 3.7.1:
ml /c /coff copy.asm
Далее транслируется программа на языке C++.
Комментарий к модулям в листинге 3.7.1.
Для того чтобы скомпоновать объектный модуль в проект на языке Visual
C++, следует обратиться к окну свойств проекта. На вкладке Linker |
Command Line указать полное имя объектного модуля. В нашем случае
я указал ..\..\..\copy.obj.
Обратите внимание, как мы согласовали параметры. Выбрав тип согласо-
вания C, мы тем самым избавили себя от суффикса @, а во-вторых, нам не
надо заботиться об очистке стека в ассемблерном модуле, потому что очи-
стку осуществляет вызывающая сторона.
Зададимся теперь следующим вопросом. Как следует изменить ассемблерный
модуль, если в нем установлено соглашение о вызовах stdcall? Порядок сле-
дования параметров не изменился, но MASM будет добавлять в конце имени
суффикс @. В данном случае в модуле на языке C++ следует указать при объ-
явлении функции COPYSTR тип вызова __stdcall (листинг 3.7.2).
Так вот. Я же знаю что тут что то не то. Как то не так Владислав Юрьевич пишет. В С++ принято вставлять ассемблерный код с помощю __asm{ юююю }
Как это его с ключами ассемблировать? ..Читаю и перечитываю. Если в студии то как с ключами, а если батником и с помощю masm32 или побного и заранее то тагда что, я же получу экзешник и что?
Что же имел Пирогов Владислав Юрьевич?