Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Вычислить и вывести на экран в виде таблицы значения функции F на интервале https://www.cyberforum.ru/ cpp-beginners/ thread20621.html
Помогите решить 6 задачек,на носу экзамен,12того((((:'( 1. Даны 2 действительных числа.Удвоить первое число, если оно меньше второго, в остальных случаях оставить числа без изменения. 2. Найти сумму всех четных чисел в диапазоне от 1 до 40. 3. Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Хнач. до Хкон. с шагом dX. ax^2+b при х < 0...
C++ Определить размер файла в С++
Есть ли функция для определения размера файла в С++, как скажем в Delphi или Pascal функция FileSize(var F: file)?
C++ Требуется подкорректировать программу https://www.cyberforum.ru/ cpp-beginners/ thread20617.html
#include <iostream> using namespace std; class phone_name { char name; long int phone; public: void set_phone() { long int x; cin >> x; phone = x; } void set_name() { gets (name); } void show() { cout << name << " " << phone; }
C++ Рисование 4-х треугольников слева направо :help: есть код #include <iostream.h> #include <conio.h> int main() { char znak='*'; //-------------------------------------------------------------------- for(int i=0; i<10; i++) //ïå÷àòü https://www.cyberforum.ru/ cpp-beginners/ thread20616.html
Конкретизация шаблона функции C++
Есть шаблон функции :template<typename Type> Type arrlen(void *memory) { return static_cast<Type>(_msize(memory) / sizeof(Type)); } Как его конкретизировать (если это вообще возможно). То есть чтоб в коде было так cout<<"arr f = "<<arrlenf(f)<<endl; а не cout<<"arr f = "<<arrlen<float>(f)<<endl;
C++ Определить номер столбца матрицы, в котором нет ни одного отрицательного элемента https://www.cyberforum.ru/ cpp-beginners/ thread20591.html
Помогите пожалуйста!!! Как присвоить переменной номер столбца, двухмерного массива nxn, в котором нет ни одного отрицательного элемента (зная, что такой столбец единственный). При надобности выложу свой код программы, с ошибкой))) Заранее благодарен.
C++ Генератор буквенных символов помогите создать генератор букв латинского алфавита https://www.cyberforum.ru/ cpp-beginners/ thread20582.html немогу никак понять в чем ошибка=(помогите плиз! C++
есть вот такой вот код : #include <iostream.h> #include <math.h> void main(void) { int a,b,i,m,k,y=0,u=0,p,j,t=0,s,h=0,nb=-1,z,n=0,kol=0,pr=0; double g,d,r,l,e=0; cout<<"Vvedite chislo strok"<<endl; cin>>m;
C++ 8ричное и 16ричное представления Привет всем.Я вот недавно решил изучать С(си).Вот столкнулса с такой проблемой.Не могли би ви обяснить поподобнее что такое восьмиричное и шестнадцатиричное представление?А то я ничево в етом не понимаю.Если можно с примерами.Например число 512 в 8ричном и 16ричном представлениях.Спасибо за помощь https://www.cyberforum.ru/ cpp-beginners/ thread20578.html C++ c++ Помогите пожалуйста подправить код Нужно в массиве удалить минимальное количество элементов,чтобы остальные шли по возрастанию. Это работает с одним элементом.Возможно проделать тоже с несколькими элементами?,если да-подскажите как. Если есть другой оптимальный вариант-подскажите пожалуйста.:help: int a={1,2,3,5,4,6,7,8,9,10},i=0; int b={0},j=0; int n=10; for(i;i<n;i++) { if(a<a) b=a; https://www.cyberforum.ru/ cpp-beginners/ thread20576.html
C++ Message в консольных приложениях
Вообще программа должна постоянна висеть в цикле. При изменение буфера(не работает) обмена должна начинаться некая его обработка(работает и извлекаеться и обрабатывается и обратно вносится, но проблема в том что если делать это без сообщения она на почти каждый момент будет открывать закрывать буфер обмена что не дает остальным программам работать с ним, поэтому я решил добавить сообщение) ...
C++ Удаление элемента массива сдвигом последующих Всем добрый день Задача Дан массив чисел, необходимо удалить из данного массива элементы, чтобы массив стал упорядочен по-возрастанию. Допустим задан следующий массив 1 2 5 6 3 4 4 5 9 по условию задачи в массиве должно остаться 1 2 5 6 9 https://www.cyberforum.ru/ cpp-beginners/ thread20548.html
0 / 0 / 0
Регистрация: 02.01.2009
Сообщений: 3
0

Вызов функций через таблицу прерываний - C++ - Ответ 91442

10.01.2009, 20:55. Показов 2247. Ответов 2
Метки (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые участники форума cyberforum.ru, очень нужна ваша помощь. Столкнулся с такой вот проблемой: написал класс обработки 64-битных чисел со знаком с применением функций состоящих из ассемблерных вставок. Заменил вызовы этих функций на вызовы через таблицу векторов прерываний. В функции класса Converting(char*):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
int AsmBinNum::Converting(char* line) {
    int i;
    //---------------
    length = strlen(line);
    sign = 0;
    result = 0;
    error = 0;
    //sign test:
    if (line[0] == '-') {
        sign = 1;
        for (i = 0; i < length; i++)
            line[i] = line[i + 1];
        length--;
    }
    //symbol count test:
    if (length > size) {
        cout << "Error: too many symbols\n";
        return 1;
    }
    //zero test:
    if (sign == 0) {
        if (length != 1 && line[0] == '0') {
            cout << "Error: nonnumeric symbol\n";
            return 2;
        }
    }
    else {
        if (line[0] == '0') {
            cout << "Error: nonnumeric symbol\n";
            return 2;
        }
    }
    //calling of Newdig():
    geninterrupt(0x70);
    //Newdig();
    if (error == 1) {
        cout << "Error: nonnumeric symbol\n";
        return 3;
    }
    //calling of BCDBin64():
    geninterrupt(0x71);
    //BCDBin64();
    if (error == 1) {
        cout << "Error: overflow\n";
        return 3;
    }
    if (sign == 1)
        geninterrupt(0x74);//ComCode();
    x = result;
    return 0;
}
возникает зависание при попытке присваивания.
Уже два дня пытаюсь понять в чем проблема. Если закомментировать вызов BCDBin64 через прерывание то все нормально работает. Если закомментировать присваивание и откомментировать вызов BCDBin64, то тоже все работает. Где тут ошибка?
Код BCDBin64():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
void interrupt BCDBin64(...) {
    asm {
        mov bx,offset num-8
        mov di,offset result
        mov cx,[length]
        dec cx
        jcxz label2
    label1:
        add bx,8
    }
        //MulBy10();
        geninterrupt(0x72);
    asm {
        loop label1
    label2:
        push [word (bx+8)]
        push [word (bx+10)]
        push [word (bx+12)]
        push [word (bx+14)]
        dec [length]
        jnz label3
        xor ax,ax
        xor bx,bx
        jmp label4
    label3:
    }
        BCDBin64();
    asm {
    label4:
        pop ax
        pop bx
        pop cx
        pop dx
        add [word (di)],dx
        adc [word (di+2)],cx
        adc [word (di+4)],bx
        adc [word (di+6)],ax
        jc overflow
        cmp [sign],1
        jz negative
        mov ax,[word (di+6)]
        test ax,0x8000
        jz label5
        jmp overflow
    negative:
        mov ax,[word (di+6)]
        cmp ax,0x8000
        jb label5
        ja overflow
        mov ax,[word (di+4)]
        cmp ax,0
        ja overflow
        mov ax,[word (di+2)]
        cmp ax,0
        ja overflow
        mov ax,[word (di)]
        cmp ax,1
        jb label5
    overflow:
        mov [error],1
    }
    label5:
}
Функция Newdig():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void interrupt Newdig(...) {
    asm {
        mov cx,[length]
        mov di,offset line
        add di,cx
        mov si,offset num
        shl cx,3
        add si,cx
        shr cx,3
    label1:
        dec di
        sub si,8
        sub [byte (di)],0x30
        jnc label2
        mov [error],1
        jmp exit
    label2:
        cmp [byte (di)],0xA
        jc label3
        mov [error],1
        jmp exit
    label3:
        xor ah,ah
        mov al,[byte (di)]
        mov [word (si)],ax
        mov [word (si+2)],0
        mov [word (si+4)],0
        mov [word (si+6)],0
        loop label1
    }
exit:
}
Код MulBy10():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
void interrupt MulBy10(...) {
    asm {
        shl [word (bx)],1
        rcl [word (bx+2)],1
        rcl [word (bx+4)],1
        rcl [word (bx+6)],1
        jc label1
        mov ax,[word (bx)]
        mov [word (buffer)],ax
        mov ax,[word (bx+2)]
        mov [word (buffer+2)],ax
        mov ax,[word (bx+4)]
        mov [word (buffer+4)],ax
        mov ax,[word (bx+6)]
        mov [word (buffer+6)],ax
        shl [word (bx)],1
        rcl [word (bx+2)],1
        rcl [word (bx+4)],1
        rcl [word (bx+6)],1
        jc label1
        shl [word (bx)],1
        rcl [word (bx+2)],1
        rcl [word (bx+4)],1
        rcl [word (bx+6)],1
        jc label1
        mov ax,[word (bx)]
        add [word (buffer)],ax
        mov ax,[word (bx+2)]
        adc [word (buffer+2)],ax
        mov ax,[word (bx+4)]
        adc [word (buffer+4)],ax
        mov ax,[word (bx+6)]
        adc [word (buffer+6)],ax
        jnc label2
    label1:
        mov [error],1
        jmp exit
    }
    label2:
    asm {
        mov ax,[word (buffer)]
        mov [word (bx)],ax
        mov ax,[word (buffer+2)]
        mov [word (bx+2)],ax
        mov ax,[word (buffer+4)]
        mov [word (bx+4)],ax
        mov ax,[word (buffer+6)]
        mov [word (bx+6)],ax
    }
exit:
}
x - элемент класса; result, line, length, num - глобальные переменные
Спасибо

Добавлено через 1 минуту 49 секунд
При попытке присваивания x = result перед выходом из функции*

Добавлено через 1 час 27 минут 39 секунд
И если закомментировать в BCDBin64 4 push'а и 4 pop'а то тоже все нормально, не зависает. Ну хоть скажите где именно может быть ошибка.

Добавлено через 2 часа 7 минут 57 секунд
Хоть кто-нибудь что-нибудь...................................

Добавлено через 52 минуты 30 секунд
если ввести число 10000000000000000 и больше или отрицательное то опять таки волшебным образом работает.....

Добавлено через 1 минуту 7 секунд
если переслать перед присваиванием result в регистры то видно что там правильное значение

Добавлено через 2 минуты 38 секунд
ошибка где то здесь:
C++
1
2
3
fld qword ptr DGROUP:_result
fstp    qword ptr [si]
fwait
это команда присваивания на ассемблере

Добавлено через 35 секунд
Кто-нибудь прервите мой монолог

Добавлено через 1 минуту 35 секунд
КАК МОЖЕТ ВИСНУТЬ ПРИСВАИВАНИЕ???????

Вернуться к обсуждению:
Вызов функций через таблицу прерываний C++
0
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.01.2009, 20:55
Готовые ответы и решения:

Вызов процедур или функций через select
Нужно что бы с помощью этого выпадающего окна вызывались определенные функции и процедуры. например...

Получить список через вызов функций LIST, CAR, CDR
Получите список (X Y Z) из заданных списков с помощью вызова функций LIST, CAR, CDR: 1. ((A) (B...

Получить таблицу прерываний
Здравствуйте! Возник вопрос, как вывести таблицу прерываний используя wmi запросы? Есть wmi...

Warnings функций обслуживания прерываний в AVRStudio 6
Перенёс проект из AVRStudyo 4 в AVRStudyo 6. Всй вроде нормально, всё работает, но почему то при...

2
10.01.2009, 20:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2009, 20:55
Помогаю со студенческими работами здесь

Где посмотреть таблицу векторов прерываний?
Доброго времени суток. Собственно, вопрос в заголовке темы - откуда брать таблицу? В datasheet'е не...

Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h
Помогите решить задания: 1.Дано натуральное число n. Найти разность между первой цифрой этого...

Как разместить таблицу векторов прерываний в atmega8?
Что сделал не так?

Поместить таблицу прерываний IDT в расширенную память
Поместить таблицу прерываний IDT в расширенную память, для чего в регистр IDTR загрузить адрес...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru