Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
ioane
58 / 58 / 54
Регистрация: 19.02.2012
Сообщений: 254
1

Вычисление выражения - разобрать код

11.12.2012, 20:56. Просмотров 423. Ответов 5
Метки нет (Все метки)

Вот код проги на С++:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream.h>
using namespace std;
 
int main():
 
   double Total=0;
 
   for (i=0;i<6000;i++)
      for (j=0;j<6000;j++)
    for (k=0;k<6000;k++)
    {Total=i+9*5-6/3+17*5-36/36+21*3-63/7+3*3-255/15+30/6-3*17;}
 
cout << Total;
system("pause");
return 0;}
А вот на ассемблере:
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
.model small
.data
Total dw 0
i dw 0
j dw 0
k dw 0
 
 
.code
start:
    Mov Ax,@DATA
    Mov Ds,Ax
 
    
    mov Ax,60000
    mov i,Ax
    
    
 M1: 
     Mov Ax,60000
     Mov j,Ax
     dec i
     cmp i,0
     jne M2
     jmp MK
 
 M2:
     Mov Ax,60000
     Mov k,Ax
     dec j
     cmp j,0
     jne M3
    je M1
 
 M3:
   
    dec k
    cmp k,0
    je M2
 
    Mov Total,15    ;Total=15
    Mov Al,5    ;Al=5
    Mov Bl,9    ;Bl=9
    IMul Bl     ;Ax=45
    Add Total, Ax   ;Total=60
    
    Mov Ax,6    ;Ax=6
    Mov Bl,3    ;Bl=3
    IDiv Bl     ;Al=2
    Sub Total,Ax    ;Total=53
    
    Mov Al,5    ;Al=5
    Mov Bl,17   ;Bl=17
    IMul Bl     ;Ax=85
    Add Total, Ax   ;Total=138
    
    Mov Ax,36   ;Ax=36
    Mov Bl,36   ;Bl36
    IDiv Bl     ;Al=1
    Sub Total,Ax    ;Total=137
    
    Mov Al,3    ;Al=21
    Mov Bl,21   ;Bl=21
    IMul Bl     ;Ax=63
    Add Total, Ax   ;Total=200
    
    Mov Ax,63   ;Ax=63
    Mov Bl,7    ;Bl=7
    IDiv Bl     ;Al=9
    Sub Total,Ax    ;Total=191
    
    Mov Al,3    ;Al=3
    Mov Bl,3    ;Bl=3
    IMul Bl     ;Ax=9
    Add Total,Ax    ;Total=200
    
    Mov Ax,255  ;Ax=255
    Mov Bl,15   ;Bl=15
    IDiv Bl     ;Al=17
    Sub Total,Ax    ;Total=183
    
    Mov Ax,30   ;Ax=30
    Mov Bl,6    ;Bl=6
    IDiv Bl     ;Al=5
    Add Total,Ax    ;Total=178
    
    Mov Al,17   ;Al=18
    Mov Bl,3    ;Bl=3
    IMul Bl     ;Ax=51
    Sub Total, Ax   ;Total=127
 
    jmp M3
 
MK:
.exit 0
end start
Почему в total записываем значение 15, когда в формуле сумма с переменной i?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2012, 20:56
Ответы с готовыми решениями:

Адресация и логические операции - разобрать код
Добрый день, помогите разобраться с лабораторными работами студенту. 1) по...

Вычисление выражения A*B/C
Выручайте, напишите плиз программу -&gt; Вычисление выражения D=A*B/C, где A=6,...

вычисление выражения 2A+2B
Задачку надо решить для зачета... пробовала сама решить... ничего не...

Вычисление выражения 2*a-(b^2+c)
Здравствуйте! Вычислить выражение: 2*a-(b^2+c), вместо b в квадрате записать...

Вычисление выражения
вычислить выражение (с / 4-d / 62) / (a * a + 1)

5
Charles Kludge
Клюг
7645 / 3160 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
11.12.2012, 21:16 2
Собственно, выражовывание 9*5-6/3+17*5-36/36+21*3-63/7+3*3-255/15+30/6-3*17 = 127, посему сюшный компилятор выдаёт следующее:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; {
; 
; for (i=0;i<6000;i++)
    mov         dword ptr FLAT:i,0 
L$1:
    cmp         dword ptr FLAT:i,1770H 
    jge         L$2 
 
; //for (j=0;j<6000;j++)
; //for (k=0;k<6000;k++)
; {Total=i+9*5-6/3+17*5-36/36+21*3-63/7+3*3-255/15+30/6-3*17;}
    mov         eax,dword ptr FLAT:i 
    add         eax,7fH   ; 127.
    mov         dword ptr -8[ebp],eax 
    fild        dword ptr -8[ebp] 
    fstp        qword ptr FLAT:Total 
    inc         dword ptr FLAT:i 
    jmp         L$1
0
Mikl___
Автор FAQ
11973 / 6244 / 592
Регистрация: 11.11.2010
Сообщений: 11,301
12.12.2012, 10:59 3
ioane,
  • вот это константа 15*3-81/9+7*9-39/13+12*5-28/7+9*8-121/11+16*5-12/3=289, которая будет вычислена еще во время компоновки программы
  • переменные k и j нигде кроме как в счетчике цикла не используются
  • все вычисления оптимизирующий компилятор на ассемблере сведет к result=5999+289=6288
И где тут вложенные циклы?
0
ioane
58 / 58 / 54
Регистрация: 19.02.2012
Сообщений: 254
12.12.2012, 11:13  [ТС] 4
я понимаю, что переменные к и j не используются в цикле. я их еще не включил туда. просто я хотел понять: правильно ли я описал циклы, а то все никак понять не могу?
0
Mikl___
Автор FAQ
11973 / 6244 / 592
Регистрация: 11.11.2010
Сообщений: 11,301
12.12.2012, 11:33 5
ioane, ну, если чисто гипотетически, то код на С
C
1
2
3
4
for (i=0;i<6000;i++)
      for (j=0;j<6000;j++)
    for (k=0;k<6000;k++)
    {function(i, j, k);}
будет выглядеть на ассемблере примерно так
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 mov ebx,0
a1: mov esi,0
a2: mov edi,0
a3: push ebx
     push esi
     push edi
     call function
     inc edi
     cmp edi,6000
     jb a3
     inc esi
     cmp esi,6000
     jb a2
     inc ebx
     cmp ebx,6000
     jb a1
0
Akognir
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 1
12.12.2012, 21:12 6
Mikl___, здравствуйте. Как с Вами можно связаться? Напишите мне на почту пожалуйста [email]
0
12.12.2012, 21:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2012, 21:12

Вычисление выражения
Помогите написать программу для вычисления выражения. Данные для переменных...

Вычисление выражения (2*b-a+b/c) / (c/4+1)
(2*b-a+b/c)/(c/4+1) как записать на языке ассемблер

Вычисление выражения
как на ассемблере записать выражение (A * X^4 + B * X^3 + C * X^2 + D * X) div...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru