Как правильно написать на fasm-функцию, вызываемую из С-шного кода - Assembler
Формулировка задачи:
Здравствуйте. Понадобилось написать модуль - функцию на ассемблере, которая будет вызываться из сишного кода. Но никак не могу найти нормального, компилируемого, и при этом не падающего, примера. Пожалуйста, объясните, или приведите пример такой функции с некоторым количеством аргументов и возвращающую значение.
Решение задачи: «Как правильно написать на fasm-функцию, вызываемую из С-шного кода»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define TRUE 1
extern char* strins(char *where, int pos, char *what);
void main(void)
{
unsigned int pos;
char *buf =malloc(80), *sbf = malloc(80), *dst;
while(TRUE){
cputs("Enter recipient:");
scanf("%80s", buf);
cputs("Enter insertion:");
scanf("%80s", sbf);
cputs("Enter pos #:");
scanf("%i", &pos);
dst = strins(buf,pos, sbf);
puts(dst);
// getch();
free(dst);
}
};
Объяснение кода листинга программы
- Предполагается, что функция
strinsнаписана на языке ассемблера и определена в заголовочном файлеfasm.h. - Ввод данных осуществляется с помощью функции
scanf. - Для работы со строками используется библиотека
stdio.h, а для работы с памятью -stdlib.h. - Вывод данных осуществляется с помощью функции
putsиз библиотекиstdio.h. - В цикле
while(TRUE)пользователю предлагается ввести данные для вставки, замены и удаления. - После каждого выполнения операции выводится результат.
- Для освобождения памяти используется функция
free. - Номер позиции
posвводится как целое число. - Если пользователь вводит
0, то цикл прерывается. - При использовании функции
getchдля ввода не требуется нажатие клавиши Enter. - Память под строки
bufиsbfвыделяется динамически с помощью функцииmalloc. - В функции
mainотсутствует возвращаемое значение. - В коде используются стандартные функции ассемблера для работы со строками и памятью.
- Размер строки
bufиsbfсоставляет 80 символов. - Функция
strinsвызывается с указанием исходной строки, позиции и строки для вставки. - Результат работы функции
strinsвыводится на экран с помощью функцииputs. - Для использования функций ассемблера их необходимо объявить как
extern. - Если ввод данных некорректен, программа выдаст сообщение об ошибке.
- В конце программы необходимо закрыть консоль.
- В данном коде не обрабатываются ошибки, возникающие при выделении памяти или при работе с функцией
scanf.