Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Fasm with C++ или каркасные программы на ассемблере  (Прочитано 13192 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dark_rain
Помогающий

ua
Offline Offline
Пол: Мужской

« : 07-04-2008 21:43 » 

здрасте снова))) вот я а5 пришел на форум к умным людям с очередным вопросом)
смотрите, есть у мя программма:

format coff
jmp start
   x dw ?
   b dw ?
   a dw ?
   c dw ?
   xb2 dw ?
   b_c dw ?
   chis dw ?
   znam dw ?
   otv dw ?
start:
  mov cx,
  mov ax,
  mul cx
  mov cx,2
  mul cx
  mov [xb2], ax
  mov dx, [xb2]
  mov ax, [a]
  sub dx, ax
  mov [xb2], dx
  mov dx, 0
  mov ax,
  mov cx, [c]
  cwd
  idiv cx
  add ax, [xb2]
  mov [chis], ax
  mov dx, 0
  mov ax, [c]
  mov cx, 4
  cwd
  idiv cx
  add ax, 1
  mov [znam], ax
  mov dx, 0
  mov ax, [chis]
  mov cx, [znam]
  cwd
  idiv cx
  mov [otv], ax
ret             

она высчитывает формулу (2xb-a+b/c)/(c/4+1), прога работает, тоесть считает правильно(мож она неграмотно сделана но суть вапроса не в этом)в опщем нужно вввод вывод даннных сделать в С++, как это делать я не имею нималейшего панятия, может кто-нибудь подсказать и объяснить??
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 08-04-2008 02:46 » 

В С++ если не ошибаюсь есть поддержка ассемблера в самом коде программы в тегах

Код:
asm{

}

Код:

unsigned int co,ro,bo;
void mouse_info(void)
{
asm {
      mov ax,03h;
      int 33h;
      mov bo,bx;
      mov ro,dx;
      mov co,cx;
    }
}
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 08-04-2008 03:40 » 

я бы на твоём месте превратил бы это дело в функцию, скопилил бы объектник
затем в C коде
exterm long myFunc(params);
вызываем функцию(ну естественно ввод и вывод на С/С++ делаем)
при линковке C программы указыл бы еще объектник созданный из asm имхо, так полезней для мозга чем просто делать асм вставку.
посмотри на сайте fasm или еще где, как правильно декларировать функции для ELF

делал когда-то в nasm такую штуку вроде ничего сложного
статейка http://www.opennet.ru/base/dev/from_c_to_asm.txt.html
и вот http://www.ibm.com/developerworks/ru/library/l-gas-nasm/index.html
там правда не fasm, но из статей понятно, как работать со стеком, если хочешь экспотрировать свой asm функции для использования их, например, из C++
Записан

Странно всё это....
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 08-04-2008 03:49 » 

Поддерживаю LogRus, тоже доводилось так делать оптимизацию: пишется функция на ассемблере, файл включается в проект, для файла пишется хедер с объявлениями нужных функций и включается куда нужно. Из C-кода вызывается объявленная функция.
Записан
dark_rain
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 08-04-2008 10:47 » 

так... не сильно я вас понял наверно потому что я дуб в С, понял только то что стек используется для входа, а выход данных реализуется через еах... так?
Записан
dark_rain
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 08-04-2008 11:23 » 

и а5 таки... с *.obj никаких вопросов не возникает... не могу понять как описать процедуру и как сделать так что бы прога спросила меня ввести переменные( и получается что все что у мя идет под jmp start должно быть в стеке?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 09-04-2008 03:58 » new

dark_rain, старт переименуй во что-нибуть, например myfunc
далее, т.к. эту функцию могут вызывать другие значит парметры тебе переданны через стек, результат отдашь через eax
всё что тебе нужно вполнить стандартные манипуляции по выборки данных из стека, сохранению текущего состояния стека(для последующего востановления) и вернуть результат вычислений через eax
в с++(для меня он роднее чем C)
коде пишешь
Код:
extern "C"{
extern long myfunc(long x, long a, long b, long c);
}

int main()
{
long x = 0;
long a = 0;
long b = 0;
long c = 0;
std::cout << "Enter x: ";
std::cin >> x;
std::cout << "Enter a: ";
std::cin >> a;
std::cout << "Enter b: ";
std::cin >> b;
std::cout << "Enter c: ";
std::cin >> c;

std::cout << "Result: " << myfunc(x,a,b,c) << std::endl;
}

после компиляции asm и C++ делаешь линковку
ld -o test asm.obj c.obj -lstdc++

усё
вот кусок из доку по nasm о том как создать функцию в C стиле
Цитата
Thus, you would define a function in C style in the following way:

global  _myfunc

_myfunc:
        push    ebp
        mov     ebp,esp
        sub     esp,0x40        ; 64 bytes of local stack space
        mov     ebx,[ebp+8]     ; first parameter to function

        ; some more code

        leave                   ; mov esp,ebp / pop ebp
        ret

вот кусок о том как вызывать функции в C стиле
Цитата
At the other end of the process, to call a C function from your assembly code, you would do something like this:

extern  _printf

        ; and then, further down...

        push    dword [myint]   ; one of my integer variables
        push    dword mystring  ; pointer into my data segment
        call    _printf
        add     esp,byte 8      ; `byte' saves space

        ; then those data items...

segment _DATA

myint       dd   1234
mystring    db   'This number -> %d <- should be 1234',10,0

This piece of code is the assembly equivalent of the C code

    int myint = 1234;
    printf("This number -> %d <- should be 1234\n", myint);

рекомендую обрать внимание на примеры http://flatassembler.net/examples.php
особенно на пример "Mixing assembly with MS Visual C"

не знаю под какую ось ты пишешь, если винда, то примера тебе хватит, если Linux, то придётся немного адаптировать код
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines