Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 12.02.2011
Сообщений: 7
1

Общий алгоритм, что делает программа

12.02.2011, 02:15. Показов 1666. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй ночи! Ассемблер - это тихий ужас, жалею ,что был испорчен языками высокого уровня.
Помогите разобраться , что делает вот эта программа, необходимо написать комментарий в каждой строке и пояснить словесно суть алгоритма.

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
model small
.stack 100h
;--------------------------------------------------------------------------------------------------------------------------------------------------------
.data ; 
C db 0,2,3,4,5 
T db 2,4,5    
A db 8 Dup(?)
;---------------------------------------------------------------------------------
.code                        
start:                                      
mov ax, @data      
mov ds, ax                             
;---------------------------------------------------------------------------------
xor ax,ax 
mov bp,47 
mov ax,bp 
mov bl,10  
div bl          
mov cl,al    
;---------------------------------------------------------------------------------
mov cx,5 
mov si,0  
m1:
mov al, C[si] 
 mov A[si],al  
 inc si             
loop m1         
;---------------------------------------------------------------------------------
mov cx,3
mov si,0
m2:
mov al, T[si]
mov A[si+5],al 
inc si
loop m2
;---------------------------------------------------------------------------------
exit:                    
mov ax,4c00h            
int 21h
end start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2011, 02:15
Ответы с готовыми решениями:

Что делает эта программа?
MyStack segment para stack 'stack' db 100 dup(?) MyStack ends MyData segment x dw 5215h min...

Что делает эта программа?
Уважаемые форумчане! Подскажите пожалуйста какое значение будет находиться в ячейке Х по...

Что делает эта программа?
помогите разобраться, што делает ета програма: RD #2 MUL #6 WR 11 WR @11 JNZ 00 заранее...

Подробно расписать что делает программа
Можете, пожалуйста, подробно расписать что делает каждая строчка кода. title word dat1 segment...

7
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
12.02.2011, 03:30 2
Ыпы, Просто скажи что оно должно делать..
0
4174 / 1824 / 218
Регистрация: 06.10.2010
Сообщений: 4,111
12.02.2011, 07:11 3
Привожу аналог на Delphi

Это объявление переменных
Delphi
1
2
3
C: array[0..4] of byte=(0,2,3,4,5);
T: array[0..2] of byte=(2,4,5);
A: array[0..7] of byte;
Assembler
1
2
3
C db 0,2,3,4,5 
T db 2,4,5    
A db 8 Dup(?)
Здесь al:=47 div 10; ah:=47 mod 10;
Assembler
1
2
3
4
5
6
xor ax,ax 
mov bp,47 
mov ax,bp 
mov bl,10  
div bl          
mov cl,al
Здесь move(C,A,5);
Assembler
1
2
3
4
5
6
7
mov cx,5 
mov si,0  
m1:
mov al, C[si] 
 mov A[si],al  
 inc si             
loop m1
Здесь move(T,A[5],3)
Assembler
1
2
3
4
5
6
7
mov cx,3
mov si,0
m2:
mov al, T[si]
mov A[si+5],al 
inc si
loop m2
1
1 / 1 / 0
Регистрация: 12.02.2011
Сообщений: 7
12.02.2011, 12:38  [ТС] 4
В том и дело пацаны, что родственник пошел учиться , ему дали лабораторки с текстами на асме и заданием расписать что делает программа и каков ее алгоритм
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
12.02.2011, 15:03 5
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
.model small ;модель памяти
.stack 100h     ;резервируем 256 байт под стек
;--------------------------------------------------------------------------------------------------------------------------------------------------------
.data ;         ;начало области данных
C db 0,2,3,4,5      ;C - массив из 5 байт
T db 2,4,5          ;T - массив из 3 байт
A db 8 Dup(?)       ;A - резервируем 8 байт(пока не определены)
;---------------------------------------------------------------------------------
.code                   ;начало кода     
start:                  ;точка входа в программу                    
mov ax, @data           ;настраиваем ds
mov ds, ax              ;на область  данных data               
;Здесь, видимо, просто пример целочисленного деления на 10:
xor ax,ax               ;обнуляем ax
mov bp,47               ;кладем в bp число 47 
mov ax,bp               ;и копируем его в ax
mov bl,10               ;в bl кладем 10
div bl                  ;делим ax/bl(47 на 10)
mov cl,al               ;целую часть частного(4) копируем в cl  
;Запись элементов массива C в массив A:
mov cx,5        ;счетчик цикла
mov si,0                ;обнулим si
m1:                     ;метка для цикла
mov al, C[si]           ;в al кладем элемент массива C с индексом si
 mov A[si],al           ;и копируем его в элемент массива A с индексом si 
 inc si                 ;увеличиваем si на 1 
loop m1                 ;повторим cx раз 
;Запись эл-тов массива T в массив A(после уже записанных эл-тов массива С):
mov cx,3                ;счетчик цикла
mov si,0                ;обнулим si 
m2:                     ;метка для цикла
mov al, T[si]           ;взять элемент массива T с индексом si   
mov A[si+5],al          ;и поместить его в эл.массива A с инд. si+5
inc si                  ;увеличить si на 1
loop m2                 ;повторить cx раз
;---------------------------------------------------------------------------------
exit:                   ;метка для выхода(в программе не используется)                    
mov     ax,4c00h        ;выход из программы        
int     21h             
end start               ;конец программы с указанием точки входа
1
1 / 1 / 0
Регистрация: 12.02.2011
Сообщений: 7
13.02.2011, 00:54  [ТС] 6
спасибо большое Ant1971on !


Протяните спасительную соловинку 3 другие задачки попробовал сам добить ( добавил комменты), посмотрите если Вас не затруднит , укажите что нет так и тыкните желторотика. И если не трудно , сообщите что же делают эти три программульки в смысле алгоритма


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
model small
.stack 100h
;---------------------------------------------------------------------------------
.data         
C dw  0  ;определение 2-х байтовой переменной 
;---------------------------------------------------------------------------------
.code   
assume  ds:@data,es:@data
start:                                      
mov ax, @data   
mov ds, ax                             
 mov es, ax       
;---------------------------------------------------------------------------------
add ax,bx ; сложить ax и bx и поместить в ax
add ax,dx ; сложить ax и dx и поместить в ax
 add ax,cx ; сложить ax и cx и поместить в ax
add ax,bp ; сложить ax и bp и поместить в ax
add ax,si ; сложить ax и si и поместить в ax
add ax,di ; сложить ax и di и поместить в ax
add ax,sp ; сложить ax и sp и поместить в ax
mov c,ax ; поместить ax  в двухбайтовую переменную C
;---------------------------------------------------------------------------------
xor ax,ax  ; обнулить ax
mov ch,7  ; поместить 7 в ch
mov al,ch  ; поместить ch в al
mov bl,4    ; поместить 4 в bl 
div bl         ;делим ax/bl 7/4
mov cl,ah   ;целую часть частного(3) копируем в cl  
;---------------------------------------------------------------------------------
exit:            
mov ax,4c00h ; выход из программы        
int 21h ; передача управления ОС
end start
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
model small
.stack 100h
;---------------------------------------------------------------------------------
.data                                                         
C db 0,2,3,4,5 ; массив из 5 байт
 T db 2,4,5    ; массив из 3 байт
A db 5 Dup(?) ; массив из 5 байт ( не инициализирован)
;---------------------------------------------------------------------------------
.code      ;начало кода                               
start:    ;точка входа в программу                                                      
mov ax, @data    ;настраиваем ds                       
mov ds, ax  ;на область  данных data                                          
;---------------------------------------------------------------------------------
xor ax,ax ;обнуляем ax
mov ch,47  ;помещаем 47 в ch
mov dl,3   ; помещаем 3 в dl
mov al,dl    ; помещаем dl в al
mul ch   ; перемножение ch и dl , помещение результата в al ( 8D или 141)     
xor dx,dx   ; обнуление dx
xor bx,bx   ;обнуление bx
mov bl,al  ; поместить число 141 из al в bl
mov dx,bx  ; поместить число 141 из bx в dx
;---------------------------------------------------------------------------------
mov cx,3   ; поместить 3 в cx для счетчика цикла; 
mov si,0      ;обнулить  si 
mov di,0       ;обнулить  di
m1: ;метка для цикла
mov al, C[si] ;в al кладем элемент массива C с индексом si
mov A[di],al ;из al кладем в элемент массива A с индексом di
inc si ;увеличиваем si на 1             
inc si   ;увеличиваем si на 1           
inc di    ;увеличиваем di на 1          
loop m1   ;повторим cx 3 раза      
;---------------------------------------------------------------------------------
mov cx,2 ; поместить в счетчик число 2 итерации 
mov si,0 ;обнулим si
m2: ; метка для цикла
mov al, T[si] ;в al кладем элемент массива T с индексом si
mov A[di],a  l;из al кладем в элемент массива A с индексом di
inc si ;увеличиваем si на 1             
inc si ;увеличиваем si на 1             
inc di ;увеличиваем di на 1             
loop m2 ;повторим cx 2 раза      
;---------------------------------------------------------------------------------
exit:                                 
mov ax,4c00h            
 int    21h
end start

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
model small
.386
.stack 100h
;---------------------------------------------------------------------------------
.data                                                                                           
a Db 'qwertyuiopasdfghjklzxcvbnm','$'
S Db 'dfапfgпokждждjiusdыkjdч', '$' 
C Db 8 Dup(?)
;---------------------------------------------------------------------------------
.code                                     
assume  ds:@data,es:@data
start:                                       
mov ax, @data                       
mov ds, ax                             
mov es, ax      
;---------------------------------------------------------------------------------
xor ax,ax ; обнулить ax
mov si,0 ; обнулить si
m1: метка начала цикла
lea di,a ; поместить в di  адрес переменной 
mov al,s[si] ; поместить в al элемент массива s индексом si
cld ; очистить флаг направления для обработки строки слева направо,
repne scas a 
je found ;условный переход если флаг нуля равен 1
jmp exit1 ; безусловный переход к метке
found: ; метка
inc ah ; увеличить ah на 1
exit1: ;метка
inc si ; увеличить si на 1
cmp si,25 ; сравнить содержимое регистра с числом 25
jle m1 ; переход на метку если ZF не равно 0
mov al,23 ; поместить число 23 в al
sub al,ah ; поместить в al =al-ah
;---------------------------------------------------------------------------------
xor ax,ax  ; обнулить ax
mov si,0   ;обнулить si     
mov ax,2h  ; поместить 2 в ax
mov c[si],1h ;поместить в 1-й элемент массива 1
mov c[si+1],1h ; поместить в 1-й элемент массива 1
mov cx,6 ;поместить 6  в сх
mov si,2 ; поместить 2 в si
m3: ; метка
mov bl,c[si-1]  ; поместить в bl 2-элемент
add bl,c[si-2]   ; сложить и поместить в bl сумму 1-го и второго элемента массива
mov      [c+si],bl ; поместить резьтат в элемент массива c
jnc     ;m4   проверка состояния флага переноса    
adc     word ptr c[si]+2,0 ; Целочисленное сложение с переносом
m4:
inc si ;увеличить на 1 si
loop m3 ; уменьшить cx на 1
;---------------------------------------------------------------------------------
exit:                                 
mov ax,4c00h            
int 21h
end start

и еще хотел спросить , каков принцип решения вот это штуки

По заданной таблице переключений составить циклограмму и логические уравнения

Т А К Т Ы
№ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
a 1 1 0 0 1 1 1 0 0 0 1 1 1 1 1
b 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1
c 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0
d 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1
e 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0
f 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0
X 0 1 1 1 1 0 0 0 0 0 0 1 1 1 0
Y 0 1 1 1 1 1 0 0 1 1 1 0 0 0 0
Z 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0


Не сочтите за недоделанного чайника , но горим, поэтому если есть возможность то протяните руку помощи. Сам я далек от ассемблера и специализируюсь на веб технологиях, но как говорится иногда жизнь идет не по 3 китам ( линейная, вилка, цикл)
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
13.02.2011, 14:51 7
По поводу последнего вопроса ничего не могу подсказать, я в общем-то тоже еще начинающий Первые две програмки прокомментированы в целом правильно, кое-что, правда, добавил. Особого алгоритма в них не нашел, просто примеры умножения, деления и сложения, во второй также есть перемещение элементов в другой массив, почти как в прошлый раз. Третья состоит из двух кусков, что делает каждый из них, написал в коментах:
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
.model small
.stack 100h
;---------------------------------------------------------------------------------
.data         
C dw  0  ;определение 2-х байтовой переменной 
;---------------------------------------------------------------------------------
.code   
assume  ds:@data,es:@data
start:                                      
mov ax, @data   
mov ds, ax                             
 mov es, ax       
;---------------------------------------------------------------------------------
add ax,bx ; сложить ax и bx и поместить в ax
add ax,dx ; сложить ax и dx и поместить в ax
 add ax,cx ; сложить ax и cx и поместить в ax
add ax,bp ; сложить ax и bp и поместить в ax
add ax,si ; сложить ax и si и поместить в ax
add ax,di ; сложить ax и di и поместить в ax
add ax,sp ; сложить ax и sp и поместить в ax
mov c,ax ; поместить ax  в двухбайтовую переменную C
;---------------------------------------------------------------------------------
xor ax,ax  ; обнулить ax
mov ch,7  ; поместить 7 в ch
mov al,ch  ; поместить ch в al
mov bl,4    ; поместить 4 в bl 
div bl         ;делим ax/bl 7/4
mov cl,ah   ;целую часть частного(3) копируем в cl  // в cl из ah копируется остаток(3),целая часть(1) лежит в al
;---------------------------------------------------------------------------------
exit:            
mov     ax,4c00h ; выход из программы        
int     21h ; передача управления ОС
end start
 
__________________________________________________________________
 
span class="kw4"> model small
.stack 100h
;---------------------------------------------------------------------------------
.data                                                         
C db 0,2,3,4,5 ; массив из 5 байт
 T db 2,4,5    ; массив из 3 байт
A db 5 Dup(?) ; массив из 5 байт ( не инициализирован)
;---------------------------------------------------------------------------------
.code      ;начало кода                               
start:    ;точка входа в программу                                                      
mov ax, @data    ;настраиваем ds                       
mov ds, ax  ;на область  данных data                                          
;---------------------------------------------------------------------------------
xor ax,ax ;обнуляем ax
mov ch,47  ;помещаем 47 в ch
mov dl,3   ; помещаем 3 в dl
mov al,dl    ; помещаем dl в al
mul ch   ; перемножение ch и dl , помещение результата в al ( 8D или 141)//результат будет в ax     
xor dx,dx   ; обнуление dx
xor bx,bx   ;обнуление bx
mov bl,al  ; поместить число 141 из al в bl
mov dx,bx  ; поместить число 141 из bx в dx
;0,3 и 5 из массива C перемещаются в массив A:
mov cx,3   ; поместить 3 в cx для счетчика цикла; 
mov si,0      ;обнулить  si 
mov di,0       ;обнулить  di
m1: ;метка для цикла
mov al, C[si] ;в al кладем элемент массива C с индексом si
mov A[di],al ;из al кладем в элемент массива A с индексом di
inc si ;увеличиваем si на 1             
inc si   ;увеличиваем si на 1           
inc di    ;увеличиваем di на 1          
loop m1   ;повторим cx 3 раза      
;Дальше в массив A записываем эл-ты массива T:
mov cx,2 ; поместить в счетчик число 2 итерации 
mov si,0 ;обнулим si
m2: ; метка для цикла
mov al, T[si] ;в al кладем элемент массива T с индексом si
mov A[di],a  l;из al кладем в элемент массива A с индексом di
inc si ;увеличиваем si на 1             
inc si ;увеличиваем si на 1             
inc di ;увеличиваем di на 1             
loop m2 ;повторим cx 2 раза      
;---------------------------------------------------------------------------------
exit:                                 
mov     ax,4c00h                
 int    21h
end start
 
___________________________________________________________________
 
span class="kw4"> model small
.386
.stack 100h
;---------------------------------------------------------------------------------
.data                                                                                           
a Db 'qwertyuiopasdfghjklzxcvbnm','$'
S Db 'dfапfgпokждждjiusdыkjdч', '$' 
C Db 8 Dup(?)
;---------------------------------------------------------------------------------
.code                                     
assume  ds:@data,es:@data
start:                                       
mov ax, @data                       
mov ds, ax                             
mov es, ax      
;Проверяется каждый символ строки s, есть ли такой же в строке a. В результате в ah оказывается число символов, входящих 
;в строку a, в al - число символов, которых в строке a нет:
xor ax,ax ; обнулить ax
mov si,0 ; обнулить si
m1: метка начала цикла//метка для условного перехода jle
lea di,a ; поместить в di  адрес переменной //адрес начала строки a
mov al,s[si] ; поместить в al элемент массива s индексом si//его будем искать в строке a
cld ; очистить флаг направления для обработки строки слева направо,
//сюда надо вставить mov cx,26(число символов строки a, для команды repne scasb)
repne scas a ;//должно быть так:repne scasb 
je found ;условный переход если флаг нуля равен 1//нашли символ - переход на found
jmp exit1 ; безусловный переход к метке//символ не найден - на метку exit1
found: ; метка
inc ah ; увеличить ah на 1//в ah ведется подсчет найденных символов
exit1: ;метка
inc si ; увеличить si на 1
cmp si,25 ; сравнить содержимое регистра с числом 25//с индексом посл.символа строки S, т.е.'ч'(22, а не 25)
jle m1 ; переход на метку если ZF не равно 0//переход если si<=22(если еще остались непроверенные символы)
mov al,23 ; поместить число 23 в al//все символы строки s проверены, кладем в al их число
sub al,ah ; поместить в al =al-ah//в al окажется число ненайденных символов
;Результат работы следующего куска - последовательность из 8 эл-тов, в которой каждый последующий эл-т равен сумме двух
;предыдущих, кроме первых двух(единицы):1,1,2,3,5,8,13(Dh),21(15h)
xor ax,ax  ; обнулить ax//лишняя строка, ax нигде дальше не используется
mov si,0   ;обнулить si     
mov ax,2h  ; поместить 2 в ax//лишняя строка
mov c[si],1h ;поместить в 1-й элемент массива 1
mov c[si+1],1h ; поместить в 1-й элемент массива 1//во 2 эл.массива тоже записать 1
mov cx,6 ;поместить 6  в сх
mov si,2 ; поместить 2 в si
m3: ; метка
mov bl,c[si-1]  ; поместить в bl 2-элемент
add bl,c[si-2]   ; сложить и поместить в bl сумму 1-го и второго элемента массива
mov      [c+si],bl ; поместить резьтат в элемент массива c
jnc     ;m4   проверка состояния флага переноса//для 6 прогонов цикла никакого переноса не возникнет    
adc     word ptr c[si]+2,0 ; Целочисленное сложение с переносом
m4:
inc si ;увеличить на 1 si
loop m3 ; уменьшить cx на 1
;---------------------------------------------------------------------------------
exit:                                 
mov     ax,4c00h                
int     21h
end start
1
73 / 73 / 11
Регистрация: 20.11.2009
Сообщений: 238
13.02.2011, 16:51 8
Ыпы,
циклограмма, наверно, составляется так: единичка - есть сигнал, нолик - нет сигнала. Выглядит это как-то так
Общий алгоритм, что делает программа

По поводу логических уравнений: могу конечно ошибаться, но пусть родственник "шустрит" там где учится, потому что возможна своя специфика таких уравнений.
1
13.02.2011, 16:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2011, 16:51
Помогаю со студенческими работами здесь

подскажите что эта программа делает
.model tiny .code org 100h start: mov ah,4Fh ; set video regim 1024*768, 32К colors,...

что делает эта программа

что делает эта программа?
Ниже представлен код программы на языке ассемблер, помогите описать что он выполняет и написать...

Дать понять пользователю, что программа что-то делает, а не зависла
Написал программу для поиска текста в файлах, но т.к. файлов много программа &quot;зависает&quot; на время...

Что алгоритм делает и найти его трудоёмкость
Что выполняет алгоритм, найти его трудоёмкость. Псевдокод. integer Findlargest (integer: array...

Я не могу понять что делает данная программа. Точнее что делают функции используемые в это коде
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;ctime&gt; using namespace std; int g(int a, int...


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

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