Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/35: Рейтинг темы: голосов - 35, средняя оценка - 4.71
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101

Обращение к переменным объекта с использованием указателя this из inline assembler

21.09.2009, 22:15. Показов 7207. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно написать класс на С++ с учетом возможности ввода количества столбцов и строк матрицы. Матрица должна размещаться в динамической памяти. Переменные указателя на матрицу и размеров матрицы должны быть нестатическими членами класса. Обращение к переменным должно осуществляться с использованием указателя this без использования оператора разыменования указателя (->). Вся выделяемая память в программе должна быть освобождена перед выходом.
Я сделал так, но пишет ошибки:
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
#include <Windows.H>
 
class Matrix {
private:
int* rows; //пока только строки
 
public:
//Circle () ; недописаный конструктор
void SetRows(int* x) 
{
if ((*x>0)&&(*x<20))  (*this).rows=x;
return;
}
 
int GetRows(void) 
{
return *rows;
}
 
//~Circle () ; недописаный деструктор
};
 
int main()
{
    int* rows=new int;
    
    Matrix t;
 
    t.SetRows(rows);
    cout<<t.GetRows()<<endl;
    return _getch();
}
Помогите исправить.

Добавлено через 38 минут
Вот так получилось. А как массив задать?
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
#include <Windows.H>
 
class Matrix {
private:
int* rows;
int* cols;
 
public:
//Matrix(void) недописанный конструктор
 
void SetRows(int* x) 
{
if ((*x>0)&&(*x<20))  (*this).rows=x;
return;
}
 
int GetRows(void) 
{
return *rows;
}
 
void SetCols(int* y) 
{
if ((*y>0)&&(*y<20))  (*this).cols=y;
return;
}
 
int GetCols(void) 
{
return *cols;
}
 
~Matrix(void) //деструктор
{
delete rows;
delete cols;
}
};
 
int main()
{
    int* rows=new int;
    int* cols=new int;
 
    *rows=5;//установим размер матрицы
    *cols=4;
 
    Matrix t;
 
    t.SetRows(rows);
    t.SetCols(cols);
    cout<<t.GetRows()<<" "<<t.GetCols()<<endl;
    return _getch();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2009, 22:15
Ответы с готовыми решениями:

GCC Inline Assembly перевести в Visual Studio Inline Assembler
Здравствуйте. Есть код на GCC Inline Assembly и его нужно перевести в Visual Studio Inline Assembler. Не работал с GCC Inline Assembly...

inline assembler в СИ
Доброго! каким образом можно связать внешную переменную и встроенный ассмблер в Си? чтоб было примерно так: int abc = 666; ...

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using...

74
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 19:31
Студворк — интернет-сервис помощи студентам
galileopro, push надо сделать один раз вне цикла. У тебя метка выше и он на каждом проходе делает push. Нужно или вынести из цикла, т.е сделать push до метки lp2, или где-то в цикле делать pop,только это вроде нафиг не надо.

Добавлено через 8 минут
Да,по поводу не той ячейки - мы не учли,размер инта, нужно умножить содержимое ecx на 4( или сдвинуть влево на 2..). И для esi то же самое верно.Ща мануал посмотрю))
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 19:36  [ТС]
Я попробовал "в лоб"
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
class Matrix {
private:
int rows;
int cols;
int vect;
int** MyMatrix;   //указатель на начало массива
int* MyVector;   //указатель на начало результирующего вектора
 
public:
Matrix(void)
{
 rows =7;
 cols =5;
 vect =max(cols,rows)/2+1;
MyVector = new int[vect];
 
MyMatrix = new int*[cols];
for(int i=0;i<rows;i++) 
MyMatrix[i]= new int[cols];
}
 
void SetRows(int x) 
{
if ((x>0)&&(x<20))rows=x;
return;
}
 
int GetRows(void) 
{
return rows;
}
 
void SetCols(int y) 
{
if ((y>0)&&(y<20)) cols=y;
return;
}
 
int GetCols(void) 
{
return cols;
}
 
void InputRandomMatrix(void)
{
srand(time(NULL));
for(int i=0;i<rows;i++)
    for(int j=0;j<cols;j++) 
        MyMatrix[i][j]=rand()%20;
}
 
void Calculate(void)
{
__asm   
{
    mov esi, rows
    mov edx, 0  ;первый столбец нечетный
    mov ebx, 0
l2:         
cmp edx, 0 ;будем проверять столбец массива на нечетность
je lp1
jmp m1;
lp1:
mov ecx, cols
xor eax, eax ;быстрый способ очистки регистра ax 
mov ebx, this
lp2:
add eax, [ebx].MyMatrix[ecx][2] //суммируем єлементы 2 столбца
loop lp2               
mov [ebx].MyVector[0], eax //добавляем результат в выходной вектор
m1:
not edx ;столбец поменял четность
dec esi ;переходим к следующему столбцу
cmp esi, 0  
ja l2     
}
return;
}
 
int GetVector(int CoordForVector) 
{
return MyVector[CoordForVector];
}
 
int GetVectorSize(void) 
{
return vect;
}
 
~Matrix(void) //деструктор
{
delete MyMatrix;
delete MyVector;
}
};
 
int main()
{
    Matrix t;
    t.InputRandomMatrix();
    t.Calculate();
    for(int j=0;j<t.GetVectorSize();j++)
    cout<<t.GetVector(j)<<endl;
    return _getch();
}
Но на єкран ничего не вывело. Спасибо. Я там с регистрами как-нибудь разберусь, уже ты мне все растолковал. Но вот в этом случае хочется, чтоб вывел результат, а потом я уже домучаю эту прогу. Тут уже я все упростил, оно просто элементы 2 столбца суммирует. Но не выводит ничего. Хоть 0 бы вывело(
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 19:42
У тебя там бесконечный цикл похоже.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 19:48  [ТС]
Вот еще упростил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Calculate(void)
{
__asm   
{
    mov esi, rows
    mov edx, 0  ;первый столбец нечетный
    mov ebx, 0
l2:         
mov ecx, cols
xor eax, eax ;быстрый способ очистки регистра ax 
mov ebx, this
lp2:
add eax, [ebx].MyMatrix[ecx][2] //суммируем єлементы 2 столбца
loop lp2               
mov [ebx].MyVector[0], eax //добавляем результат в выходной вектор
dec esi //переходим к следующему столбцу
cmp esi, 0  //если все столбцы перебрали, то выход
ja l2     
}
return;
}
Где тут бесконечный цикл?
loop lp2 уменьшает постепенно регистр ecx, пока он не станет 0
dec esi //переходим к следующему столбцу - тоже вічитает, пока не занулится.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 19:53
C++
1
mov esi, rows
После выполнения этой строки у меня в регистре esi ноль. В конце dec уменьшал его на 1 и получал максимальное положительное число.Короче,цикл не бесконечный но очень длинный вышел
Зато если сделать через this, как с MyMatrix
C++
1
2
mov ebx, this
mov esi, [ebx].rows
Будет как надо. И так же нужно загружать cols в регистр.

Я поправил,он вылетает с ошибкой,но хоть не циклится
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 20:03  [ТС]
Вот так переписал
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
void Calculate(void)
{
__asm   
{
    mov ebx, this
    mov esi, [ebx].rows
l2:         
mov ecx, [ebx].cols
xor eax, eax ;быстрый способ очистки регистра ax 
lp2:
add eax, [ebx].MyMatrix[ecx][2] //суммируем єлементы 2 столбца
loop lp2               
mov [ebx].MyVector[0], eax //добавляем результат в выходной вектор
dec esi //переходим к следующему столбцу
cmp esi, 0  //если все столбцы перебрали, то выход
ja l2     
}
return;
}
 
int GetVector(int CoordForVector) 
{
return MyVector[CoordForVector];
}
...
};
 
int main()
{
    Matrix t;
    t.InputRandomMatrix();
           t.Calculate();
    cout<<t.GetVector(0)<<endl;
    return _getch();
Вроде процедура ассемблерная работает, но оно вылетает с ошибкой в строке
C++
1
return MyVector[CoordForVector];
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 20:14
galileopro, причина такая.
C++
1
mov [ebx].MyVector[0], eax //добавляем результат в выходной вектор
Нельзя напрямую так писать. Потому что MyVector - это указатель и ты записываешь не в массив, а на место указателя, добавляя к адресу ноль,или не ноль - не важно,все равно напишется не туда. Именно поэтому нужно сначала загрузить значение(!) MyVector в регистр,а после этого писать как-то так :
mov [eax][смещение],что-то там.eax для примера,можно любой общего назначения. Причем адресовать сразу по ячейке памяти нельзя.

Вот как это выглядит.Прошу прощения за убогость художества,но в пейнте красивее не сделаешь
Но суть оно отражает.



Другими словами еще раз - тебе нужно адресовать по ячейке памяти,там лежит адрес массива,который тебе выдал new когда ты создавал его. [ebx].MyVector[0] просто берет адрес этой ячейки и добавляет 0. А нужно взять тот адрес,который внутри записан и добавить к нему ноль. Вот разница.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 20:26  [ТС]
Примерно так?
Assembler
1
2
mov edx, [ebx].MyVector[0]
mov [eax][8], edx
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 20:32
galileopro, ты там регистры кажется перепутал. Но в общем я понял,что ты понял
MyVector можно без индекса. В ассемблере индекс не делает разименование, еще одна формулировка предыдущего поста. Т.е в си применяя к указателю в памяти [] ты попадаешь на массив,а в асме - просто смещаешься куда-то дальше

C++
1
2
mov eax,[ebx].MyVector
mov [eax][8], edx
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 20:39  [ТС]
Ясно. А почему
Эта операция
Assembler
1
add eax, [ebx].MyMatrix[ecx][2]
помещает в
eax = 3435973632 если ecx=5 при этом?
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 20:45
galileopro, та же причина. Более того,тебе придется несколько раз обновлять регистр с указателем. В классе матрица представлена одним единственным указателем - он указывает на массив из указателей(вне класса,в динамической памяти), а они каждый на свой "вектор"(см. схему (= ). Чтобы добраться до значения тебе нужно :
C++
1
2
3
4
5
6
mov eax,[ebx].MyMatrix // Залить значение [ebx].MyMatrix в какой-нибудь регистр Пусть eax
mov eax,[eax][ecx] // [eax] - это значит "адрес,который лежит в eax".Это фактически 
                               //разыменование указателя. Тут мы получили указатель на нужную
                               // строку и уложили его опять таки в eax
mov eax,[eax][2] // Тут из вектора мы выбираем нужный элемент.
                            // Теперь в eax значение MyMatrix[ecx][2] в понимании C
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 20:58  [ТС]
Все значения должны быть от 0 до 20 где-то

Добавлено через 7 минут
Спасибо я понял. Вот переделал, но он вілетает.(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Calculate(void)
{
__asm   
{
    mov ebx, this
    mov esi, [ebx].rows
l2:         
mov ecx, [ebx].cols
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][ecx]
mov eax,[eax][2]
mov edx, [ebx].MyVector[0]
mov [edx][8], eax
dec esi //переходим к следующему столбцу
cmp esi, 0  //если все столбцы перебрали, то выход
ja l2     
}
return;
}
Ошибка в строке
C++
1
mov eax,[eax][2]
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 21:02
galileopro, забыл умножить ecx на 4.Асм за размером не следит,он с байтами работает. Т.е читается какой-то левый указатель из,скажем, трех байт одного и одного байта следующего за ним К тому же, если ecx == cols, то мы вылезем за границу,т.к массивы нумеруются с нуля.

Добавлено через 26 секунд
Я отойду минут на сорок.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 21:24  [ТС]
Вот слава Богу заработало
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// лаба6.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include <ctime>
#include <Windows.H>
using namespace std;
 
class Matrix {
private:
int rows;
int cols;
int vect;
int** MyMatrix;   //указатель на начало массива
int* MyVector;   //указатель на начало результирующего вектора
 
public:
Matrix(void)
{
 rows =7;
 cols =5;
 vect =max(cols,rows)/2+1;
MyVector = new int[vect];
 
MyMatrix = new int*[cols];
for(int i=0;i<rows;i++) 
MyMatrix[i]= new int[cols];
}
 
void SetRows(int x) 
{
if ((x>0)&&(x<20))rows=x;
return;
}
 
int GetRows(void) 
{
return rows;
}
 
void SetCols(int y) 
{
if ((y>0)&&(y<20)) cols=y;
return;
}
 
int GetCols(void) 
{
return cols;
}
 
void InputRandomMatrix(void)
{
srand(time(NULL));
for(int i=0;i<rows;i++)
    for(int j=0;j<cols;j++) 
        MyMatrix[i][j]=rand()%20;
}
 
void Calculate(void)
{
__asm   
{
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][4]
mov eax,[eax][2]
mov edx, [ebx].MyVector[0]
shr eax, 16
mov [edx][0], eax    
}
return;
}
 
int GetVector(int CoordForVector) 
{
return MyVector[CoordForVector];
}
 
int GetVectorSize(void) 
{
return vect;
}
 
~Matrix(void) //деструктор
{
delete MyMatrix;
delete MyVector;
}
};
 
int main()
{
    Matrix t;
    t.InputRandomMatrix();
    t.Calculate();
    cout<<t.GetVector(0)<<endl;
    return _getch();
}
Только вот непойму, почему оно не работает без
C++
1
2
3
4
5
6
7
8
void Calculate(void)
{
__asm   
{
...
shr eax, 16
...   
}
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 21:53
mov eax,[eax][2] - это середина ячейки из 4-х байт.Умножай все индексы на 4 >_<

Добавлено через 1 минуту
И у тебя очистка памяти неправильная
delete MyMatrix;

Нужно сначала удалить каждую строку матрицы, сколько раз вызвал new столько же раз вызывай delete. т.е циклом сначала все строки, MyMatrix[i],а потом саму MyMatrix
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 22:01  [ТС]
Легко сказать умножай все на 4. Для єтого надо сначала засунуть множитель в eax, затем умножить, потом опять поместить в исходный регистр и восстановить eax. Это жуткий гемор.
Хотя можно
Assembler
1
shr нужный регистр, 2
Да?

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
~Matrix(void) //деструктор
{
for(int i=0;i<rows;i++) 
delete MyMatrix[i];
delete MyMatrix;
delete MyVector;
}
ЗАработало с первого раза) Спасибо
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 22:16
galileopro, нужно влево сдвигать,вроде shl
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.09.2009, 22:37  [ТС]
К сожалению
Assembler
1
2
3
4
5
6
7
8
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][4]
mov eax,[eax][2]
mov edx, [ebx].MyVector[0]
shl eax, 2
mov [edx][0], eax
Выводит -1873232....
C++
1
2
3
4
5
6
7
8
9
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][4]
mov eax,[eax][2]
mov edx, [ebx].MyVector[0]
mov ecx, 4
mul ecx
mov [edx][0], eax
Вылетает.
Работает нормально только
C++
1
2
3
4
5
6
7
8
9
10
11
__asm   
{
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][4]
mov eax,[eax][2]
mov edx, [ebx].MyVector[0]
shr eax, 16
mov [edx][0], eax    
}
Может там не по середине значение находится? А вообще неважно, я буду теперь shr <registr>, 16 .зать и всех делов. Спасибо за помощь.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
22.09.2009, 22:58
C++
1
2
3
mov ecx, 4
mul ecx
mov [edx][0], eax
Я вообще логику этих строк не понял,и я не про них говорил

А сдвигом вправо eax перед тем как его занести ты делишь то,что прочитал на 2^16 и получаешь чето маленькое,чего и хотел,но это вообще левая цифра.
Я говорил про эту строку
C++
1
mov eax,[eax][2]
Ты запихиваешь в eax середину одной цифры и середину другой. Вот и получаешь мусор.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 21:24  [ТС]
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
А сдвигом вправо eax перед тем как его занести ты делишь то,что прочитал на 2^16 и получаешь чето маленькое,чего и хотел,но это вообще левая цифра.
Нет. Это не левая цифра. Попробуй этот код
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
...
void InputRandomMatrix(void)
{
for(int i=0;i<rows;i++)
    for(int j=0;j<cols;j++) 
        MyMatrix[i][j]=19;
}
 
void Calculate(void)
{
__asm   
{
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][4]
mov eax,[eax][2]
mov edx, [ebx].MyVector[0]
shr eax, 16
mov [edx][0], eax    
}
return;
}
...
И выведет 19. Заполнишь матрицу другими числами и выведет их.
Я что-то никак не пойму, что там на 4 умножать?
Он после такого вылетает
C++
1
2
3
4
5
6
7
8
9
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][4]
shr eax, 4
mov eax,[eax][2]
shr eax, 4
mov edx, [ebx].MyVector[0]
mov [edx][0], eax
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2009, 21:24
Помогаю со студенческими работами здесь

Inline assembler mingw
Добрый вечер ув. пользователи форума. Возникла проблема с ассемблером, и его реализацией в mingw. Имеется функция void call_hook ( void...

Inline Assembler & C++
int main(int argc, char *argv) { perevod(); cout&lt;&lt;&quot;Type Esc to Escape \n&quot;; __asm { mov ah,01h ...

написать программу движущийся графический объект с двумя способоми с использованием статического объекта и с использованием динамического объекта
Движение закрашенного прямоугольника по треугольному контуру с изменением цвета при изменении направления движения.

inline assembler VS чтение по указателю
Доброе время суток. Задача состоит в чтении 1 байта по адресу указателя. Проблема с пониманием, что не так с типами операндов. char...

Как исправить код? / Inline assembler
#include &lt;stdio.h&gt; int main(int argc, char** argv ) { int aa; int bb; aa = 42; bb = 10;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru