1 / 1 / 1
Регистрация: 23.03.2017
Сообщений: 101
1

Ассемблерная вставка в Си. При возврате управления основной программе, выполнения asm-кода начинается заново (зациклив.)

08.10.2019, 11:31. Показов 1646. Ответов 0

Author24 — интернет-сервис помощи студентам
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
106
107
108
109
110
/* cpuid.c */
 
#include <stdio.h>
#include "cpuid.h"
 
void cpuid_check (void)
{
    printf ("CPUID checked\n");
        asm volatile(
".data\n\t"
"errmess: .string \"CPUID is not supported\n\"\n\t"
"okmess: .string \"CPUID is supported\n\"\n\t"
"errmess_fpu: .string \"__FPU is not supported\n\"\n\t"
"okmess_fpu: .string \"__FPU is supported\n\"\n\t"
"errmess_mmx: .string \"__MMX is not supported\n\"\n\t"
"okmess_mmx: .string \"__MMX is supported\n\"\n\t"
".text\n\t"
"pushl %ebp\n\t"
"movl  %esp, %ebp\n\t"
"subl  $16, %esp\n\t"
/*Прежде всего программа записывает текущее содержимое регистра FLAGS в регистр AX. Для этого используется стек:*/
"pushfl\n\t"
"popl %eax\n\t"
/*Первоначальное содержимое регистра FLAGS сохраняется в регистре CX:*/
"movl %eax, %ebx\n\t"
/*Далее, меняем бит 21 на противоположный и сохраняем значение в регистре флагов*/
"xorl $0x00200000, %eax\n\t"
"pushl %eax\n\t"
"popfl\n\t"
/*Считываем значения из регистра флагов и смотрим, изменился ли бит. Если нет - переходим к метке no_cpuid*/
"pushfl\n\t"
"popl %eax\n\t"
"xorl %ebx, %eax\n\t"
"je no_cpuid\n\t"
"jmp ok\n\t"
"no_cpuid:\n\t"
"movl $4, %eax\n\t"
"movl $1, %ebx\n\t"
"leal errmess, %ecx\n\t"
"movl $24, %edx\n\t"
"int $0x80\n\t"
"jmp done\n\t"
 
"ok:\n\t"
 
"movl $4, %eax\n\t"
"movl $1, %ebx\n\t"
"leal okmess, %ecx\n\t"
"movl $19, %edx\n\t"
"int $0x80\n\t"
 
"movl $1, %eax\n\t"
"cpuid\n\t"
"test $1, %EDX\n\t"
"jnz show_info\n\t"
"jmp not_fpu\n\t"
"not_fpu:\n\t"
"movl $4, %eax\n\t"
"movl $1, %ebx\n\t"
"leal errmess_fpu, %ecx\n\t"
"movl $24, %edx\n\t"
"int $0x80\n\t"
"jmp done\n\t"
"show_info:\n\t"
"movl $4, %eax\n\t"
"movl $1, %ebx\n\t"
"leal okmess_fpu, %ecx\n\t"
"movl $20, %edx\n\t"
"int $0x80\n\t"
 
 
"movl $1, %eax\n\t"
"cpuid\n\t"
"test $800000, %EDX\n\t"
"jnz show_info_mmx\n\t"
"jmp not_mmx\n\t"
"not_mmx:\n\t"
"movl $4, %eax\n\t"
"movl $1, %ebx\n\t"
"leal errmess_mmx, %ecx\n\t"
"movl $24, %edx\n\t"
"int $0x80\n\t"
"jmp done\n\t"
"show_info_mmx:\n\t"
"movl $4, %eax\n\t"
"movl $1, %ebx\n\t"
"leal okmess_mmx, %ecx\n\t"
"movl $20, %edx\n\t"
"int $0x80\n\t"
 
 
/*ЗДЕСЬ НУЖНО ПЕРЕДАТЬ УПРАВЛЕНИЕ ОСНОВНОЙ ПРОГРАММЕ*/
"done:\n\t"
"movl $1, %eax\n\t"
"movl $0, %ebx\n\t"
"ret\n\t"
);
    printf ("CPUID checked\n");
}
 
void FPU_check (void)
{
    
        printf ("FPU checked\n");
}
 
void MMX_check (void)
{
        printf ("MMX checked\n");
}

Как сделать так, чтобы функция asm выполнялась только 1 раз, после чего передавала управление основной программе?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2019, 11:31
Ответы с готовыми решениями:

Используя условия вариантов записать все вычисления , проводимые ранее в основной программе , в виде процедуры. В основной программе предусмотреть т
Используя условия вариантов записать все вычисления , проводимые ранее в основной программе , в...

Определить номер элемента прогрессии, при котором сумма элементов превысит 15000 (ассемблерная вставка)
Определить номер (n) Элемента прогрессии:an = 3,3^n + 5 При котором сумма элементов превысит 15000...

Поиск слова в тексте не начинается заново
Подскажите, как можно реализовать такую функцию. Чтоб поиск по тексту производился по нескольким...

Установка Windows XP постоянно начинается заново
При включение компьютера в bios, там вроде всё правильно ставлю в настройках, и начинаю...

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

Реализуйте логическую арифметику, при которой в одном слове хранилось бы 16 логических переменных. Asm вставка на Си
Добрый вечер, прошу помочь с заданием. Реализуйте логическую арифметику, при которой в одном слове...

Возвращение из процедуры-события к основной программе при выполнении определённого условия
Добрый вечер всем ещё не ушедшим спать. 10 класс, пишу научраб по теме создания дидактических...

Ассемблерная вставка
Только начали изучать ассемблерную вставку в С++....первую лабу я кое-как сам сделал (там...

ассемблерная вставка
Разделить один массив на два: в первый передать элементы с нечетными индексами, во второй с...

Ассемблерная вставка
Нужно заменить в русской строке похожие буквы латиницей. Ввод и вывод - на С++, всё остальное - на...

Ассемблерная вставка
Всем доброй ночи!!! Я хочу попросить помощи в решении вот такой функции: Найти целое значение...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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