Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нужна помощь по асеблеру

14K
20 марта 2009 года
Fenja
138 / / 20.03.2009
Доброго время суток! Нужна Ваша помощь по асеблеру. Если такой вопрос уже был просьба сильно не пинать :)
Суть проблемы.
Пишу на С со вставкой асеблера, элементарная функция, но есть один косяк.
Код:
#define _CRT_NONSTDC_NO_WARNINGS

#include <stdio.h>
#include <conio.h>

void main(void)
{
    int a;
    int b;
    int c;
    int d;
    int e;
    int y;

        __asm
    {
        // Сохранение в стеке текущих значений
        // регистров
        push eax;
        push ebx;
        push ecx;
        push edx;

        // Загрузка значений
        mov a, 0x40;
        mov b, 0x30;
        mov c, 0x03;
        mov d, 0x02;
        mov e, 0x01;

        // Сложение
        /*функция  1) y=a+b-c*d/e             */

        mov eax, c; // eax = c
        mov ebx, d; // ebx = d 
        imul eax, ebx;    // eax = eax * ebx
        mov ebx, e;       // ebx = e
        div ebx;            // eax = eax / ebx
        mov ecx, eax;    // ecx = eax
        mov eax,b;        // eax = b
        sub eax,ecx;      // eax = eax - ecx
        mov ebx, a;       // ebx = a
        add eax, ebx;     // eax = eax + ebx
        mov y, eax;        // y = eax
       

        // Восстановление из стека сохраненных значений
        // регистров
        pop ebx;
        pop eax;
        pop ecx;
        pop edx;
    }

    printf("a = %x\nb = %x\nc = %x\nd= %x\n", a, b, c,d);
    printf("y= %x\n",y);
    getch();

}

Проблема в следующем. Если перед делением в регистр ebx занести значение 1, то прога после деления выдает ошибку
Цитата:
Unhandled exception at 0x004113f1 in asm_1.exe: 0xC0000095: Integer overflow.

ас если там будет другое целое значение напрмер 2 или 3, то раьотает все нормально. Подскажите кто знает.

990
21 марта 2009 года
Stalcer
137 / / 15.08.2004
 
Код:
MOV EAX,E
   MOV EBX,3 ;Деление на З.
   MOV EDX,0
   DIV EBX
   MOV RES,EAX
842
21 марта 2009 года
sigmov
301 / / 16.09.2008
Цитата: Fenja
Доброго время суток! Нужна Ваша помощь по асеблеру. Если такой вопрос уже был просьба сильно не пинать :)



Не понятно зачем здесь в принципе __asm вставка.
Если для скорости - то при [Release /Of /Ot] компиляции тот же код на С++ будет значительно быстрее.
Быстродействия можно добится только использование *.obj файлов, сделанных на ASM в С++ проектах.

14K
21 марта 2009 года
Fenja
138 / / 20.03.2009
Stalcer, спасибо, обнулил edx и все работает :)
Цитата:
Не понятно зачем здесь в принципе __asm вставка.
Если для скорости - то при [Release /Of /Ot] компиляции тот же код на С++ будет значительно быстрее.


Да тут не быстродейтвие - это у меня лаба такая, учу асеблер :)

842
21 марта 2009 года
sigmov
301 / / 16.09.2008
Цитата: Fenja
Да тут не быстродейтвие - это у меня лаба такая, учу асеблер :)



Тогда советую поискать в Инете С++ компилятор, у корого есть опции перевода кода в assembler.
Я про это в книге "Оптимизация программ на С++" по моему видул.

14K
21 марта 2009 года
Fenja
138 / / 20.03.2009
sigmov, не покатит, ибо писать надо строго на асеблере. Ну мне привыкать, напишу :)
294
21 марта 2009 года
Plisteron
982 / / 29.08.2003
Цитата: Fenja
прога после деления выдает ошибку

Команда DIV выполняет деление целого числа без знака, находящегося в регистрах EDX:EAX, на операнд (целое без знака)
(с) документация.

Код:
#include <stdio.h>

#pragma argsused
int main(int argc, char* argv[])
{
        int a;
        int b;
        int c;
        int d;
        int e;
        int y;

                __asm
        {
                // Сохранение в стеке текущих значений
                // регистров
                push eax;
                push ebx;
                push ecx;
                push edx;

                // Загрузка значений
                mov a, 0x40;
                mov b, 0x30;
                mov c, 0x03;
                mov d, 0x02;
                mov e, 0x01;

                // Сложение
                /*функция  1) y=a+b-c*d/e             */

                mov eax, c;        // eax = c
                mov ebx, d;        // ebx = d
                [COLOR=Red]mul eax, ebx;    // edx:eax = eax * ebx[/COLOR]
                mov ebx, e;       // ebx = e
                [COLOR=Red]div ebx;            // edx:eax = eax / ebx[/COLOR]
                mov ecx, eax;    // ecx = eax
                mov eax,b;        // eax = b
                sub eax,ecx;      // eax = eax - ecx
                mov ebx, a;       // ebx = a
                add eax, ebx;     // eax = eax + ebx
                mov y, eax;        // y = eax


                // Восстановление из стека сохраненных значений
                // регистров
                pop ebx;
                pop eax;
                pop ecx;
                pop edx;
        }

        printf("a = %x\nb = %x\nc = %x\nd= %x\n", a, b, c,d);
        printf("y= %x\n",y);
    return 0;
}
14K
21 марта 2009 года
Fenja
138 / / 20.03.2009
Парни, не подскажете книгу, по которой лучше асеблер учить? ;) сейчас читаю Рудольф Марек - Ассемблер на примерах. Базовый курс. Раньше учил асеблер на процессор К580ВМ80А и i8081 :), но уже толком не помню...
294
21 марта 2009 года
Plisteron
982 / / 29.08.2003
Цитата: Fenja
Парни, не подскажете книгу, по которой лучше асеблер учить?

У меня есть Александр Крупник - "Ассемблер. Самоучитель", формат djvu. Вроде неплохо. Если надо -- пиши в перс.
Add: Год издания 2005.

14K
21 марта 2009 года
Fenja
138 / / 20.03.2009
Plisteron, спасибо, загуглил, нашел :) скоро я так думаю я еще че нить срошу.
7
21 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
В.И. Юров "Assembler".Желательно ещё найти его же книжку "Практикум"–там тоже много чего интересного.Я по ней учился,очень хорошая книга
14K
22 марта 2009 года
Fenja
138 / / 20.03.2009
@pixo $oft, ок, погуглю.
У меня тут снова вопрос... опять С, вставка асеблера, в асме считается какое то выражение, меняется i - счетчик цикла, a - изменяющая переменная и y - результат вычисления выражения при заданном a. Собственно вопрос: нужно вывести результат в виде одного массива, содержащего n троек значений "порядковый номер – аргумент - функция". Не подскажете как реализовать?
7
22 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Будь добр,уточни:тебе надо именно ВЫВЕСТИ результат(т.е. в консоль,например),или функция должна его возвращать как продукт своей работы?
14K
22 марта 2009 года
Fenja
138 / / 20.03.2009
Функция должна его возвращать как результат своей работы.
7
22 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Есть 2 варианта:
0)возвращать указатель на массив.При этом функция должна сама выделить себе память под него,а потом как-то позаботиться о её освобождении(например,пользователь будет вызывать сначала твою функцию,а после использования массива–функцию CleanUp,которая освободит выделенную функцией память).Так обычно не поступают
1)в функцию должен передаваться указатель на массив,созданный пользователем,и его длина.В таком случае ты просто пишешь свои n троек значений по этому адресу и ни на чём не заморачиваешься.Но придётся дать пользователю возможность узнать,достаточное ли количество памяти он выделил под массив
Такой метод используется очень часто.Достаточно посмотреть на реализацию некоторых API-функций,чтобы убедиться в том,что парни из Microsoft тоже решили не заморачиваться(например,EnumProcesses;почитай к ней описание,дабы разобраться,как реализовывать сей метод)
14K
22 марта 2009 года
Fenja
138 / / 20.03.2009
Так, по 1 способу. Я в С описываю массив, потом делаю на него указатель, и потом в асме этот указатель через mov присваиавю какому нить регистру?
7
22 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Естественно,1й лучше–им же большинство пользуется:)
Итак,начнём.Регистру никакому присваивать сей указатель не надо(в смысле,необязательно)–тебе просто по тому адресу,который передан в процедуру,надо записать свои данные.Ведь это как будет выглядеть?А вот примерно вот так:
Цитата:
int MyFunc(DWORD SomeParam,LPVOID *ArrAddr,DWORD ArrSize)

[SIZE="1"]Прошу прощения за тот бред,что я сейчас написал;примерно так должно выглядеть описание функции[/SIZE]
Так вот,*ArrAddr и будет тем адресом массива,который сгенерирован снаружи функции и будет передан ей в качестве 2го параметра.В него ты и будешь писать в ассемблерной вставке

P.S.Первые 2 части твоей идеи верные:)

14K
07 апреля 2009 года
Fenja
138 / / 20.03.2009
@pixo $oft, пасиб, сделал, сдал :)
И снова вопрос. Задание:
Цитата:
Исходное число задать в виде строки символов в коде ASCII, результат сформировать в виде двоичного кода в формате слова. Число в ASCII разместить в памяти по способу: Чем старше разряд, тем старше адрес. Основание систем счисления исходного числа и результата - 2.


Опять нада реализовать на асме. Не пожскажите? ибо я что т и не вкурю как делать преобразование:)

7
07 апреля 2009 года
@pixo $oft
3.4K / / 20.09.2006
Чем старше разряд,тем старше адрес–это особенность архитектуры Intel:)
Я вот не понял,как из строки символов преобразовать в "двоичный код в формате слова".Надо выводить нолики и единички в таком виде,что ли(типа словами)?
 
Код:
0101010010100101  1010101010011101  1001110011101110
Вообще преобразование весьма просто,так что объясни поподробнее,а я уж что-нибудь придумаю;)
14K
07 апреля 2009 года
Fenja
138 / / 20.03.2009
Цитата:
Надо выводить нолики и единички в таком виде,что ли(типа словами)?


Скорее всего да.

Цитата:
объясни поподробнее,а я уж что-нибудь придумаю


Я написал все задание, какое было :) я еще у препода спрошу что сделать то надо.

14K
16 апреля 2009 года
Fenja
138 / / 20.03.2009
Так, нашел препода. У меня в ANSI строке двоичное число, мне его нужно перевести в десятичное, потом из десятичного в ANSI, но уже в двоичной системе счисления и вывести. Мне б сначала эт на С вкурить как реализовать...
7
16 апреля 2009 года
@pixo $oft
3.4K / / 20.09.2006
Молодой человек,вы изучали системы счисления?:)
Просто в теории всё подробно расписано

…вот,кстати:http://forum.codenet.ru/showthread.php?t=54161
14K
16 апреля 2009 года
Fenja
138 / / 20.03.2009
@pixo $oft, системы изучал, меня смущает ANSI код.
7
16 апреля 2009 года
@pixo $oft
3.4K / / 20.09.2006
А чем он,собственно,сомнителен?ANSI(American National Standards Institute–Википедия)–это однобайтный код,стандартная таблица символов…Во всяком случае,цифры от 0 до 9 явно одинаковы во всех кодировках:)
14K
14 мая 2009 года
Fenja
138 / / 20.03.2009
Доброго время суток, это снова я :)
Вообщем так: лаба, пишем в С, используя асемблерные вставки, тема Процедуры. нужно написать 3 процедуры на асме и вызов их тоже должен производиться из асеблерной вставки. С этим проблем нету, проблема в следующем. При вызове одной из функций, ее должны передаваться данные через сегмент стека, а возвращать она должна тоже через сегмент стека, но возвращать уже адреса. Собсвтено вопрос как это реализовать?
Получается что у меня при возврате в сегменте стека будет лежать адрес результата?
7
14 мая 2009 года
@pixo $oft
3.4K / / 20.09.2006
Можно передать в функцию в качестве одного из параметров адрес(-а) переменной(-ых),куда эти самые адреса будут записываться(как сделано во многих API-функциях).Можно прямо в стек сохранить(допустим,на место одного из параметров),только осторожнее,дабы ничто этот параметр потом не заменило
46K
15 мая 2009 года
Mukhitov
15 / / 26.04.2009
Не проще вызывать процедуры из асма в С/C++ ?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог