Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 2
Регистрация: 13.12.2011
Сообщений: 81

Вставка ассемблерного кода в код С++

23.10.2012, 21:11. Показов 2382. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С ++ (100% работает):
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
int i,m;
int main(){
int A[9];
m=0;
i=8;
do{
  m=8*i;
  switch(i){
    case 2: m+=4; break;
    case 0: m=17; break;
    case 7: m-=4; break;
    case 1: m=4; break;
    default: m++;
  }
  A[i]=m;
  i--;
  }while(i>-1);
for(i=0;i<9;i++)
printf("%d ",A[i]);
printf("\n");
getchar();
return 0;
}


ASM( 100% - рабочий ):
Кликните здесь для просмотра всего текста
Assembler
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.50727.1 
 
    TITLE   C:\Users\i7otep9wka\Documents\Visual Studio 2012\Projects\asmLab2\asmLab2\lab2.cpp
    .686P
    .XMM
    include listing.inc
    .model  flat
 
INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES
 
PUBLIC  ?i@@3HA                     ; i
PUBLIC  ?m@@3HA                     ; m
_BSS    SEGMENT
?i@@3HA DD  01H DUP (?)             ; i
?m@@3HA DD  01H DUP (?)             ; m
_BSS    ENDS
PUBLIC  _main
PUBLIC  ??_C@_03JDANDILB@?$CFd?5?$AA@           ; `string'
PUBLIC  ??_C@_01EEMJAFIK@?6?$AA@            ; `string'
EXTRN   __imp__getchar:PROC
EXTRN   __imp__printf:PROC
EXTRN   @_RTC_CheckStackVars@8:PROC
EXTRN   @__security_check_cookie@4:PROC
EXTRN   __RTC_CheckEsp:PROC
EXTRN   __RTC_InitBase:PROC
EXTRN   __RTC_Shutdown:PROC
EXTRN   ___security_cookie:DWORD
;   COMDAT rtc$TMZ
rtc$TMZ SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ ENDS
;   COMDAT rtc$IMZ
rtc$IMZ SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
rtc$IMZ ENDS
;   COMDAT ??_C@_01EEMJAFIK@?6?$AA@
CONST   SEGMENT
??_C@_01EEMJAFIK@?6?$AA@ DB 0aH, 00H            ; `string'
CONST   ENDS
;   COMDAT ??_C@_03JDANDILB@?$CFd?5?$AA@
CONST   SEGMENT
??_C@_03JDANDILB@?$CFd?5?$AA@ DB '%d ', 00H     ; `string'
CONST   ENDS
; Function compile flags: /Odtp /RTCsu /ZI
; File c:\users\i7otep9wka\documents\visual studio 2012\projects\asmlab2\asmlab2\lab2.cpp
;   COMDAT _main
_TEXT   SEGMENT
tv65 = -244                     ; size = 4
_A$ = -44                       ; size = 36
__$ArrayPad$ = -4                   ; size = 4
_main   PROC                        ; COMDAT
 
; 3    : int main(){
 
  00000 55       push    ebp
  00001 8b ec        mov     ebp, esp
  00003 81 ec f4 00 00
    00       sub     esp, 244       ; 000000f4H
  00009 53       push    ebx
  0000a 56       push    esi
  0000b 57       push    edi
  0000c 8d bd 0c ff ff
    ff       lea     edi, DWORD PTR [ebp-244]
  00012 b9 3d 00 00 00   mov     ecx, 61            ; 0000003dH
  00017 b8 cc cc cc cc   mov     eax, -858993460        ; ccccccccH
  0001c f3 ab        rep stosd
  0001e a1 00 00 00 00   mov     eax, DWORD PTR ___security_cookie
  00023 33 c5        xor     eax, ebp
  00025 89 45 fc     mov     DWORD PTR __$ArrayPad$[ebp], eax
 
; 4    : int A[9];
; 5    : m=0;
 
  00028 c7 05 00 00 00
    00 00 00 00 00   mov     DWORD PTR ?m@@3HA, 0   ; m
 
; 6    : i=8;
 
  00032 c7 05 00 00 00
    00 08 00 00 00   mov     DWORD PTR ?i@@3HA, 8   ; i
$LN13@main:
 
; 7    : do{
; 8    :   m=8*i;
 
  0003c a1 00 00 00 00   mov     eax, DWORD PTR ?i@@3HA ; i
  00041 c1 e0 03     shl     eax, 3
  00044 a3 00 00 00 00   mov     DWORD PTR ?m@@3HA, eax ; m
 
; 9    :   switch(i){
 
  00049 a1 00 00 00 00   mov     eax, DWORD PTR ?i@@3HA ; i
  0004e 89 85 0c ff ff
    ff       mov     DWORD PTR tv65[ebp], eax
  00054 83 bd 0c ff ff
    ff 07        cmp     DWORD PTR tv65[ebp], 7
  0005b 77 43        ja  SHORT $LN4@main
  0005d 8b 8d 0c ff ff
    ff       mov     ecx, DWORD PTR tv65[ebp]
  00063 ff 24 8d 00 00
    00 00        jmp     DWORD PTR $LN19@main[ecx*4]
$LN8@main:
 
; 10   :     case 2: m+=4; break;
 
  0006a a1 00 00 00 00   mov     eax, DWORD PTR ?m@@3HA ; m
  0006f 83 c0 04     add     eax, 4
  00072 a3 00 00 00 00   mov     DWORD PTR ?m@@3HA, eax ; m
  00077 eb 34        jmp     SHORT $LN9@main
$LN7@main:
 
; 11   :     case 0: m=17; break;
 
  00079 c7 05 00 00 00
    00 11 00 00 00   mov     DWORD PTR ?m@@3HA, 17  ; m, 00000011H
  00083 eb 28        jmp     SHORT $LN9@main
$LN6@main:
 
; 12   :     case 7: m-=4; break;
 
  00085 a1 00 00 00 00   mov     eax, DWORD PTR ?m@@3HA ; m
  0008a 83 e8 04     sub     eax, 4
  0008d a3 00 00 00 00   mov     DWORD PTR ?m@@3HA, eax ; m
  00092 eb 19        jmp     SHORT $LN9@main
$LN5@main:
 
; 13   :     case 1: m=4; break;
 
  00094 c7 05 00 00 00
    00 04 00 00 00   mov     DWORD PTR ?m@@3HA, 4   ; m
  0009e eb 0d        jmp     SHORT $LN9@main
$LN4@main:
 
; 14   :     default: m++;
 
  000a0 a1 00 00 00 00   mov     eax, DWORD PTR ?m@@3HA ; m
  000a5 83 c0 01     add     eax, 1
  000a8 a3 00 00 00 00   mov     DWORD PTR ?m@@3HA, eax ; m
$LN9@main:
 
; 15   :   }
; 16   :   A[i]=m;
 
  000ad a1 00 00 00 00   mov     eax, DWORD PTR ?i@@3HA ; i
  000b2 8b 0d 00 00 00
    00       mov     ecx, DWORD PTR ?m@@3HA ; m
  000b8 89 4c 85 d4  mov     DWORD PTR _A$[ebp+eax*4], ecx
 
; 17   :   i--;
 
  000bc a1 00 00 00 00   mov     eax, DWORD PTR ?i@@3HA ; i
  000c1 83 e8 01     sub     eax, 1
  000c4 a3 00 00 00 00   mov     DWORD PTR ?i@@3HA, eax ; i
 
; 18   :   }while(i>-1);
 
  000c9 83 3d 00 00 00
    00 ff        cmp     DWORD PTR ?i@@3HA, -1  ; i
  000d0 0f 8f 66 ff ff
    ff       jg  $LN13@main
 
; 19   : for(i=0;i<9;i++)
 
  000d6 c7 05 00 00 00
    00 00 00 00 00   mov     DWORD PTR ?i@@3HA, 0   ; i
  000e0 eb 0d        jmp     SHORT $LN3@main
$LN2@main:
  000e2 a1 00 00 00 00   mov     eax, DWORD PTR ?i@@3HA ; i
  000e7 83 c0 01     add     eax, 1
  000ea a3 00 00 00 00   mov     DWORD PTR ?i@@3HA, eax ; i
$LN3@main:
  000ef 83 3d 00 00 00
    00 09        cmp     DWORD PTR ?i@@3HA, 9   ; i
  000f6 7d 23        jge     SHORT $LN1@main
 
; 20   : printf("%d ",A[i]);
 
  000f8 8b f4        mov     esi, esp
  000fa a1 00 00 00 00   mov     eax, DWORD PTR ?i@@3HA ; i
  000ff 8b 4c 85 d4  mov     ecx, DWORD PTR _A$[ebp+eax*4]
  00103 51       push    ecx
  00104 68 00 00 00 00   push    OFFSET ??_C@_03JDANDILB@?$CFd?5?$AA@
  00109 ff 15 00 00 00
    00       call    DWORD PTR __imp__printf
  0010f 83 c4 08     add     esp, 8
  00112 3b f4        cmp     esi, esp
  00114 e8 00 00 00 00   call    __RTC_CheckEsp
  00119 eb c7        jmp     SHORT $LN2@main
$LN1@main:
 
; 21   : printf("\n");
 
  0011b 8b f4        mov     esi, esp
  0011d 68 00 00 00 00   push    OFFSET ??_C@_01EEMJAFIK@?6?$AA@
  00122 ff 15 00 00 00
    00       call    DWORD PTR __imp__printf
  00128 83 c4 04     add     esp, 4
  0012b 3b f4        cmp     esi, esp
  0012d e8 00 00 00 00   call    __RTC_CheckEsp
 
; 22   : getchar();
 
  00132 8b f4        mov     esi, esp
  00134 ff 15 00 00 00
    00       call    DWORD PTR __imp__getchar
  0013a 3b f4        cmp     esi, esp
  0013c e8 00 00 00 00   call    __RTC_CheckEsp
 
; 23   : return 0;
 
  00141 33 c0        xor     eax, eax
 
; 24   : }
 
  00143 52       push    edx
  00144 8b cd        mov     ecx, ebp
  00146 50       push    eax
  00147 8d 15 00 00 00
    00       lea     edx, DWORD PTR $LN18@main
  0014d e8 00 00 00 00   call    @_RTC_CheckStackVars@8
  00152 58       pop     eax
  00153 5a       pop     edx
  00154 5f       pop     edi
  00155 5e       pop     esi
  00156 5b       pop     ebx
  00157 8b 4d fc     mov     ecx, DWORD PTR __$ArrayPad$[ebp]
  0015a 33 cd        xor     ecx, ebp
  0015c e8 00 00 00 00   call    @__security_check_cookie@4
  00161 81 c4 f4 00 00
    00       add     esp, 244       ; 000000f4H
  00167 3b ec        cmp     ebp, esp
  00169 e8 00 00 00 00   call    __RTC_CheckEsp
  0016e 8b e5        mov     esp, ebp
  00170 5d       pop     ebp
  00171 c3       ret     0
  00172 8b ff        npad    2
$LN18@main:
  00174 01 00 00 00  DD  1
  00178 00 00 00 00  DD  $LN17@main
$LN17@main:
  0017c d4 ff ff ff  DD  -44            ; ffffffd4H
  00180 24 00 00 00  DD  36         ; 00000024H
  00184 00 00 00 00  DD  $LN16@main
$LN16@main:
  00188 41       DB  65         ; 00000041H
  00189 00       DB  0
  0018a 8b ff        npad    2
$LN19@main:
  0018c 00 00 00 00  DD  $LN7@main
  00190 00 00 00 00  DD  $LN5@main
  00194 00 00 00 00  DD  $LN8@main
  00198 00 00 00 00  DD  $LN4@main
  0019c 00 00 00 00  DD  $LN4@main
  001a0 00 00 00 00  DD  $LN4@main
  001a4 00 00 00 00  DD  $LN4@main
  001a8 00 00 00 00  DD  $LN6@main
_main   ENDP
_TEXT   ENDS
END


"С ++" + "ASM"( ?? % рабочий)

Кликните здесь для просмотра всего текста
Assembler
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
#include <stdio.h>
int i,m;
int main(){
int A[9];
int tv65 = -244;
m=0;
i=8;
_asm{
LN13main:
        mov  eax, DWORD PTR i
        shl  eax, 3
        mov  DWORD PTR m,eax
 
        mov  eax, DWORD PTR i
        mov  DWORD PTR tv65, eax
        cmp  DWORD PTR tv65, 7
        ja   SHORT LN4main
        mov  ecx, DWORD PTR tv65
/*(*)*/ //  jmp  DWORD PTR LN19main[ecx*4]      
LN8main:
        mov  eax, DWORD PTR m
        add  eax, 4
        mov  DWORD PTR m, eax
        jmp  SHORT LN9main
LN7main:
        mov  DWORD PTR m, 17
        jmp  SHORT LN9main
LN6main:
        mov  eax, DWORD PTR m
        sub  eax, 4
        mov  DWORD PTR m, eax
        jmp  SHORT LN9main
LN5main:
        mov  DWORD PTR m, 4
        jmp  SHORT LN9main
LN4main:
        mov  eax, DWORD PTR m
        add  eax, 1
        mov  DWORD PTR m, eax   
LN9main:
        mov  eax, DWORD PTR i
        mov  ecx, DWORD PTR m
        mov  DWORD PTR A[eax*4], ecx
 
        mov  eax, DWORD PTR i
        sub  eax, 1
        mov  DWORD PTR i, eax
 
        cmp  DWORD PTR i, -1
        jg   LN13main
//LN19main:
}
 
for(i=0;i<9;i++)
printf("%d ",A[i]);
printf("\n");
getchar();
return 0;
}
*/


Задача, заменить ассемберной вставкой главный цикл программы.
Вот так работает, но результат не тот же, что при компиляции кода С++, то есть вставку сделал не правильно. Подскажите как правильно сделать.

Если разкоментить (*), будет выдавать ошибку, что не инициализирована метка.
Исходя из листинга ассемблера видим, что эта метка инициализирована вне цикла.
Не знаю, как с этим справится...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.10.2012, 21:11
Ответы с готовыми решениями:

Вставка ассемблерного кода
Код: #include &lt;stdio.h&gt; int main() { __asm{ _start:

Вставка ассемблерного кода в Си-программу
Пытаюсь написать hello world используя 2 языка(извращение имхо)... Не могу понять, что происходит... Пишу так: #include...

Вставка ассемблерного кода в С++ для очистки экрана
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &quot;iostream&quot; #include &lt;fstream&gt; #include &quot;windows.h&quot; #include &lt;stdlib.h&gt; #include...

1
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
24.10.2012, 07:02
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
int i,m;
 
int main(){
    int A[9];
    _asm{
        mov ecx,9
        b:lea eax,[ecx*8-7]
          mov [A+ecx*4-4],eax
        loop b
        mov [A+2*4],20
        mov [A    ],17
        mov [A+7*4],52
        mov [A+1*4],4
    }
    for(i=0;i<9;i++)
       printf("%d ",A[i]);
    printf("\n");
    m=0;
    i=8;
    do{
        m=8*i;
        switch(i){
          case 2: m+=4; break;
          case 0: m=17; break;
          case 7: m-=4; break;
          case 1: m=4; break;
         default: m++;
    }
    A[i]=m;
    i--;
    }while(i>-1);
    for(i=0;i<9;i++)
       printf("%d ",A[i]);
    printf("\n");
    getchar();
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.10.2012, 07:02
Помогаю со студенческими работами здесь

Можно ли осуществить вставку ассемблерного кода непосредственно в код Java?
Гуру, помогите!! Можно ли осуществить вставку ассемблерного кода непосредственно в код Java? Если можно, то как?:help: Заранее спасибо!

Как реализовать вставку ассемблерного кода в код с++ для очистки экрана?
Как реализовать вставку ассемблерного кода в код с++ для очистки экрана (аналог system(&quot;cls&quot;), только в виде вставки _ass {}?? ps...

Вставка ассемблерного модуля в С++ проект
Понимаю,что данный вопрос не раз уже поднимался на форуме,но даже после прочтения некоторых тем и поиска в гугле,всё равно доходит не...

Быстродействие ассемблерного кода
Кое-где прочитал что сейчас некоторые компиляторы генерируют код работающий быстрее чем аналогичный на ассемблере. Так в чём между ними...

Вывод ассемблерного кода
Изменил настройки решения на вот такие. Скомпилил. В папке с проектом файла нету. Возможно глупый ворос , но где именно и в каком...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru