0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 2
1

Два фрагмента программы (диспетчер задач) перевести из C++ в ассемблерные вставки

16.10.2016, 21:47. Показов 2422. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Перевод из C++ в ассемблер
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
#include <stdlib.h> 
#include <conio.h> 
#include <dos.h> 
#include <stdio.h> 
#define stacksize (2048) 
#define _stek unsigned int 
typedef 
struct Tdescr{ 
unsigned int ss,sp,bp,ds,si,di; 
}; 
 
void huge t_add(Tdescr huge *proc,void huge* task); 
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN); 
 
void huge task1(void); 
void huge task2(void); 
void huge task3(void); 
 
Tdescr *proc1=(Tdescr * )malloc(sizeof(Tdescr)); 
Tdescr *proc2=(Tdescr * )malloc(sizeof(Tdescr)); 
Tdescr *proc3=(Tdescr * )malloc(sizeof(Tdescr)); 
Tdescr huge *Main=(Tdescr * huge)malloc(sizeof(Tdescr)); 
 
void main(void) 
 
{ 
t_add(proc1,task1); 
t_add(proc2,task2); 
t_add(proc3,task3); 
t_switch(Main,proc1); 
 
free (proc1); 
free (proc2); 
free (proc3); 
} 
void huge t_add(Tdescr huge *proc,void huge * task) 
{ 
_stek huge *st=(_stek huge *)malloc(stacksize); 
proc->ss=FP_SEG(st); 
proc->sp=FP_OFF(st)+1000; 
*(int huge *)MK_FP(proc->ss,proc->sp)=FP_OFF(task); 
*(int huge *)MK_FP(proc->ss,proc->sp+2)=FP_SEG(task); 
proc->sp-=8; 
} 
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN) 
{ 
asm { 
les bx,procO; 
mov es:[bx],ss 
mov es:[bx+2],sp 
mov es:[bx+4],bp 
mov es:[bx+6],ds 
mov es:[bx+8],si 
mov es:[bx+10],di 
les bx,procN; 
mov ax,es:[bx] 
mov ss,ax 
mov sp,es:[bx+2] 
mov bp,es:[bx+4] 
mov ds,es:[bx+6] 
mov si,es:[bx+8] 
mov di,es:[bx+10] 
} 
; 
}; 
void huge task1(void) 
{ 
int i=0; 
int j=0; 
while(j<100){ 
i++; 
gotoxy(i,1);printf(" 1"); 
if(i>79) i=1; 
j++; 
delay(40); 
if(j<80) t_switch(proc1,proc2); 
else t_switch(proc1,Main); 
} 
} 
void huge task2(void) 
{ 
int i=0; 
int j=0; 
while(j<1000){ 
i++; 
gotoxy(i,5);printf(" 2"); 
if(i>79) i=1; 
j++; 
delay(20); 
if(j<50) t_switch(proc2,proc3); 
else t_switch(proc2,Main); 
} 
} 
void huge task3(void) 
{ int i=0; 
int j=0; 
while(j<180){ 
i++; 
gotoxy(i,10);printf(" 3"); 
i++; 
gotoxy(i,10);cprintf(" 3"); 
if(i>79) i=1; 
j++; 
delay(50); 
if(j<80) t_switch(proc3,proc1); 
else t_switch(proc3,Main); 
} 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2016, 21:47
Ответы с готовыми решениями:

Преобразовать фрагменты программы на C в ассемблерные вставки
Выручайте! Очень нужна помощь ибо не бывать допуска к экзамену! надо переписать на ассемблер, т.е....

Не открывается диспетчер задач, chrome и др. программы
Здравствуйте. При открытии google chrome выдаёт ошибку: Точка входа в процедуру cZtЯiG$H не найдена...

Выполнить код при закрытии программы через диспетчер задач
Здравствуйте! Возможно ли выполнить код после закрытия программы в диспетчере задач? private void...

После изменения имени программы диспетчер задач выводит старое
Возникла необходимость поменять имя исполняемого файла одной проги. Сделал стандартно - просто...

4
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
17.10.2016, 14:16 2
M00nz1m, какая у вас изначальная задача?
0
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 2
12.12.2016, 00:53  [ТС] 3
Нужно перевести Запуск и Остановку диспетчера в ассемблер
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
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
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#define stacksize (2048)
#define _stek unsigned int
#define intr 0x08
const int num_pr=3;
typedef
struct   Tdescr{
unsigned int ss,sp,si,di,bp,ds,cx,dx,bx,ax,fl,es;
};
#ifdef __cplusplus
    #define __CPPARGS...
#else
    #define __CPPARGS
#endif
void huge t_add(Tdescr huge *proc,void huge* task);
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN);
 
void huge set_disp(void);
void huge stop_disp(void);
void interrupt  (*old_han)(__CPPARGS);
void interrupt  _handler(__CPPARGS);
 
void huge task1(void);
void huge task2(void);
void huge task3(void);
 
Tdescr   *proc1=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr   *proc2=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr   *proc3=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr  huge *Main=(Tdescr * huge)malloc(sizeof(Tdescr));
 
 
unsigned int count,flag;
void  main(void)
 
{
    clrscr();
    t_add(proc1,task1);
    t_add(proc2,task2);
    t_add(proc3,task3);
    count=-1;
    set_disp();
 
    free (proc1);
    free (proc2);
    free (proc3);
}
void  huge t_add(Tdescr huge *proc,void huge * task)
{
  _stek huge *st=(_stek huge *)malloc(2*stacksize);
  proc->ss=FP_SEG(st);
  proc->sp=FP_OFF(st)+1000;
  *(int huge *)MK_FP(proc->ss,proc->sp)=FP_OFF(task);
  *(int huge *)MK_FP(proc->ss,proc->sp+2)=FP_SEG(task);
  proc->es=_ES;
  proc->fl=_FLAGS;
 
  proc->sp-=8;
}
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN)
{
  asm {
  les bx,procO;
  mov es:[bx],ss
  mov es:[bx+2],sp
  mov es:[bx+4],si
  mov es:[bx+6],di
  mov es:[bx+8],cx
  mov es:[bx+10],dx
  mov es:[bx+12],bx
  mov es:[bx+14],ax
  pop ax
}
//  procO->fl=_FLAGS;
//  procO->es=_AX;
asm{
  les bx,procN;
 
  mov ax,es:[bx]
  mov ss,ax
  mov sp,es:[bx+2]
  mov si,es:[bx+4]
  mov di,es:[bx+6]
  mov cx,es:[bx+8]
  mov dx,es:[bx+10]
  mov bx,es:[bx+12]
  mov di,es:[bx+14]
  }
//  _FLAGS=procN->fl;
//  _ES=procN->es;
};
void huge task1(void)
{ //    clrscr();
  int i=1;
  int j=0;
  enable();
  while(j<1){
   i++;
//   disable();
    // gotoxy(3,i);
     cprintf(" 1Proc= %i \r\n ",i);
//  enable();
     delay(10);
  }
}
void huge task2(void)
{
  int i=0;
  int j=0;
  enable();
 
  while(j<1){
    i++; i++;
//    disable();
//   gotoxy(30,i);
     cprintf("                    2Proc=%i \r \n ",i);
//  enable();
     delay(10);
  }
}
void huge task3(void)
{  int i=0;
  int j=0;
//  enable();
 
  while(j<1){
    i++;
 //   disable();
 //  gotoxy(60,i);
     cprintf("                                      3Proc=%i\r \n",i);
  enable();
   delay(50);
  }
  }
 
//------------------------------------------------------------------------
//          запуск диспетчера
//--------------------------------------------------------------------------}
 
void huge set_disp(void)
{         disable();
          old_han=getvect(intr);
          setvect(intr,_handler);
          t_switch(Main,proc1);
}
 //------------------------------------------------------------------------
//          остановка диспетчера
//--------------------------------------------------------------------------}
 
void huge stop_disp(void)
{  //      disable();
     setvect(intr,old_han);
     t_switch(proc2,Main);
  //     enable();
 
}
 
//;------------------------------------------------------------------------
void interrupt _handler(__CPPARGS)
{   asm cli;
    old_han();
    //  asm int 61h
    count++;
    flag=(count % num_pr);
    switch(flag){
         case 0:   t_switch(proc1,proc2);
               if(kbhit()) {
                 getch();
                 stop_disp();
               }
                break;
         case 1:   t_switch(proc2,proc3);
               if(kbhit()) {
                 getch();
                 stop_disp();
               }
                break;
         case 2:   t_switch(proc3,proc1);
               if(kbhit()) {
                 getch();
                 stop_disp();
               }
                break;
    }
    asm{
    mov al, 20h
    out 20h,al
    }
    asm sti;
}
0
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 707
02.07.2018, 10:24 4
Напишите на C++ эту программу, затем скачайте Hiew, потом выбираете Ваш exe-шник того кода, теперь несколько раз нажимаете на пробел, пока слева не будет написан код на языке Ассемблера.
 Комментарий модератора 
Sasha38, если желаете откапывать древние вопросы (некропостить) - тогда есть смысл выкладывать ГОТОВОЕ решение. А совет по дизассемблированию топикстартер мог получить и годы назад.
В следующий раз поступлю с вами нехорошо.
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
02.07.2018, 11:32 5
Цитата Сообщение от Sasha38 Посмотреть сообщение
затем скачайте Hiew,
Ага, а потом ручками переписывать.
0
02.07.2018, 11:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2018, 11:32
Помогаю со студенческими работами здесь

Ассемблерные вставки
Будут ли у меня проблемы, если я, поработав с регистрами, не восстановлю их после выхода из...

Ассемблерные вставки:(
Есть программа которая В исходную строку вставляет после заданного символа все символы,...

С++ + Ассемблерные вставки
Помогите с задачей:&quot;Нахождение и отображение смежных групп цифр в числовой последовательности&quot;....

Ассемблерные вставки
У меня есть функция function Lalala(x, y, z: Integre): Byte; asm ... //используются...


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

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

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