powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
23 сообщений из 23, страница 1 из 1
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37778986
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно помочь разобраться с кодом программы написанным на есемблере! Завтра защита курсовой а я вообще ничего понять не могу! Если не тяжело прошу откоментировать каждую строчку. Заранее спасибо за помощь!
Вот код:
Код: plaintext
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.
model small
.data
;задаем массив
mas	db	9,0,6,7,4,1,5,2,8,3
n=$-mas+1
x	db	0	;временная переменная
i	dw	0
l	dw	0
m	dw	0
j	dw	0
k	dw	0
.stack	256
.486
.code
insert_item_in_tree	proc
;----------------------------------------------------------
;ПРОЦЕДУРА insert_item_in_tree (i, mas, N)
;на входе:
;si - номер элемента i в последовательности (с конца)
;mas - массив элементов
;m=n/2 - значение, равное половине числа элементов массива mas
;----------------------------------------------------------
push	si
push	cx
;j:=i
	mov	j,si	;j:=i
;@@m1:
@@m4:
	mov	si,j	;i->si
	mov	ax,j
;k:=2*j; l:=k+1
	shl	ax,1	;j*2
	mov	k,ax	;k:=j*2
	inc	ax
	mov	l,ax	;l:=k+1
;ЕСЛИ (l=<N И (mas[j]<mas[k] ИЛИ mas[j]<mas[l]) ТО ПЕРЕЙТИ_НА @@m6
;ИНАЧЕ ПЕРЕЙТИ_НА @@m2
;КОН_ЕСЛИ
	cmp	ax,m	;l<m
	ja	@@m2
	mov	al,mas[si-1]	;ax:=mas[j]
	mov	di,k
	cmp	al,mas[di-1]
	jna	@@m6

	inc	di
	cmp	al,mas[di-1]
	jna	@@m6

	jmp	@@m2
;@@m6:
;ЕСЛИ mas[k]>mas[l] ТО ПЕРЕЙТИ_НА @@m4
;ИНАЧЕ ПЕРЕЙТИ_НА @@m3
;КОН_ЕСЛИ
@@m6:
;условие выполнилось:
;2j+1+<M AND (mas[j]<mas[2j] OR mas[j]<mas[2j+1])
;обмен с mas[j]
	mov	di,k
	mov	al,mas[di-1]	;ax:=mas[k]
	inc	di
	cmp	al,mas[di-1]	;mas[k]>mas[l]
	jna	@@m3
;@@m4:
;x:=mas[j]
;mas[j]:=mas[k]
;j:=k
;mas[k]:=x
;ПЕРЕЙТИ_НА @@m1
	mov	al,mas[si-1]
	mov	x,al	;x:=mas[j]
	dec	di
	mov	al,mas[di-1]
	mov	mas[si-1],al	;mas[j]:=mas[k]
	mov	j,di	;j:=k
	mov	al,x
	mov	mas[di-1],al	;mas[k]:=x
	jmp	@@m4
;@@m3:	x:=mas[j]
;	mas[j]:=mas[l]
;	mas[l]:=x
;	j:=l
;ПЕРЕЙТИ_НА @@m1
@@m3:	;mas[k] =< mas[l]
	mov	al,mas[si-1]
	mov	x,al	;x:=mas[j]
	mov	al,mas[di-1]
	mov	mas[si-1],al	;mas[j]:=mas[l]
	mov	j,di	;j:=l
	mov	al,x
	mov	mas[di-1],al	;mas[l]:=x
	jmp	@@m4
;@@m2:
;ЕСЛИ (k==n И mas[j]<mas[k]) ТО ПЕРЕЙТИ_НА @@m7
;ИНАЧЕ ПЕРЕЙТИ_НА @@m8
;КОН_ЕСЛИ
@@m2:	; условие не выполнилось: 2j+1+<M AND (mas[j]<mas[2j] OR mas[j]<mas[2j+1])
	mov	ax,k
	cmp	ax,m
	jne	@@m1

	mov	di,k
	mov	al,mas[di-1]	;al:=mas[k]
	cmp	mas[si-1],al	;mas[j]<mas[k]
	jae	@@m1
;@@m7:	x:=mas[j]
;mas[j]:=mas[n]
;mas[n]:=x
	mov	al,mas[si-1]
	mov	x,al	;x:=mas[j]
	mov	di,n
	mov	al,mas[di-1]
	mov	mas[si-1],al	;mas[j]:=mas[n]
	mov	al,x
	mov	mas[di-1],al	;mas[n]:=x
;@@m8:
;ВОЗВРАТ
@@m1:
pop	cx
pop	si
	ret
insert_item_in_tree	endp


main:
	mov	dx,@data
	mov	ds,dx

	mov cx,0
	mov ah,02h
	lea si,mas
	inmas:
	mov dl,[si]
	add dl,30h
	int 21h
	inc cx
	inc si
	cmp cx,10
	jb inmas
	mov dx,0Ah
	int 21h
	mov dx,0Dh
	int 21h



;i:=n/2; l:=i; m:=n
	mov	ax,n	;n-1
	mov	m,ax	;m:=n
	shr	ax,1
	mov	i,ax	;i:=n\2
	mov	l,ax	;l:=i
;//строим пирамиду на основе входного массива
;ДЛЯ k:=1 ДО l
;строим пирамиду:
	mov	cx,l	;цикл по k:=1..l
	mov	si,i
@@cycl1:
;НАЧ_БЛОК_1
	mov	i,si
;insert_item_in_tree (i, mas, m)
	call	insert_item_in_tree
;i:=i-1
	dec	si	;i:=i-1
;КОН_БЛОК_1
	loop	@@cycl1
;а теперь собственно сортировка:
;//сортируем пирамиду
;ДЛЯ k:=2 ДО n
	mov	cx,n-1	;n-2
@@cycl2:
;НАЧ_БЛОК_1
;x:=mas[1]
;mas[1]:=mas[m]
;mas[m]:=x
;m=m-1
	xor	si,si
	mov	al,mas[si]
	mov	x,al	;x:=mas[1]
	mov	di,m
	mov	al,mas[di-1]
	mov	mas[si],al	;mas[1]:=mas[m]
	mov	al,x
	mov	mas[di-1],al	;mas[m]:=x
	dec	m
	inc	si	;i:=1
;insert_item_in_tree (1, mas, m)
	call	insert_item_in_tree
;КОН_БЛОК_1
	loop	@@cycl2
;вывод
	
	mov cx,0
	mov ah,02h
	lea si,mas
	outmas:
	mov dl,[si]
	add dl,30h
	int 21h
	inc cx
	inc si
	cmp cx,10
	jb outmas
;выход	
	mov	ax,4c00h
	int	21h
end	main
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779037
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот есемблер мне вообще не нужен я в основном на делфе программирую, но есть такое "но" как учебная программа университета! Нам сказали взять код из Юрова и дописать код на вывод масива. На паре просто объяснить любой кусок программы который захочет препод!
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779061
ALKIR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, заставьте себя повнимательнее посмотрить в код программы, которую написали
у вас каждый участок программы достаточно полно прокомментирован
(, тем более "на делфе программируете" - разберетесь)
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779063
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ALKIR,это код не на столько сложный что бы за его объяснение платить! или я ошибаюсь? В принципе в книге он расписан немного но хотелось бы не теряться в нем когда спросят!
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779065
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я вообще есемблер не знаю вот в чем проблема! При других обстоятельствах я бы на форум не обращался!
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779079
ALKIR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда, задавайте вопрос более конкретно, что, в каком месте - не понятно?

иначе, получается, что вам непонятно все - а за 1 день знания не придут
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779103
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ALKIRтогда, задавайте вопрос более конкретно, что, в каком месте - не понятно?

иначе, получается, что вам непонятно все - а за 1 день знания не придут
Если не тяжело то откоментируйте все строки начиная от "push si". А с командами я как то разберусь гугл мне в этом поможет)) Заранее весьма благодарен!
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779121
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sho0t,

Они и так почти все откомментированы, за вычетом main.
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779122
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ALKIR,но если у вас нету времени прошу объяснить хотя бы эту часть кода:

mov cx,0
mov ah,02h
lea si,mas
outmas:
mov dl,[si]
add dl,30h
int 21h
inc cx
inc si
cmp cx,10
jb outmas



;выход
mov ax,4c00h
int 21h
end main
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779125
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AbstractionSho0t,

Они и так почти все откомментированы, за вычетом main.
Ах да и main тоже если можно! А с остальным разберусь! И еще раз спасибо!
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779135
Gwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sho0t,
21h прерывание -это сервис DOS
ah =2 -вывод на дисплей
4с -стандартное завершение программы
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779139
ALKIR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
push si
push cx
;С этой конструкции (инструкций) начинается ПРОЦЕДУРА insert_item_in_tree (выше описание заголовка)
;инструкция push помещает значение в стек
;зачем эта инструкция здесь - непонятно
;можно предопложить, что автор намерен использовать в теле процедуры регистры si и cx,
;и заранее обезопасился, но по факту этого не видно
;другое предположение - вместо пользователя эти инструкции написал компилятор с другого языка


...
pop cx
pop si
ret
;Здесь выход из процедуры
;Инструкция pop возвращает верхний элемент из стека
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779142
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ALKIRpush si
push cx
;С этой конструкции (инструкций) начинается ПРОЦЕДУРА insert_item_in_tree (выше описание заголовка)
;инструкция push помещает значение в стек
;зачем эта инструкция здесь - непонятно
;можно предопложить, что автор намерен использовать в теле процедуры регистры si и cx,
;и заранее обезопасился, но по факту этого не видно
;другое предположение - вместо пользователя эти инструкции написал компилятор с другого языка


...
pop cx
pop si
ret
;Здесь выход из процедуры
;Инструкция pop возвращает верхний элемент из стека
спасибо
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779148
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ALKIR,

а что вы скажите об этой части кода?

main:
mov dx,@data
mov ds,dx

mov cx,0
mov ah,02h
lea si,mas
inmas:
mov dl,[si]
add dl,30h
int 21h
inc cx
inc si
cmp cx,10
jb inmas
mov dx,0Ah
int 21h
mov dx,0Dh
int 21h
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779153
Gwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sho0t,
это вывод массива на экран
с переводом строки в конце
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779158
ALKIR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sho0t,


main:
mov dx,@data
mov ds,dx
;если посмотреть в начало программы, то можно увидеть .data
;здесь в сегментные регистры dx,ds загружается начало сегмента данных
;ПОСМОТРЕТЬ(в учебнике), что такое сегментная модель small
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779185
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ALKIR,

а можно по конкретней объяснить этот кусок кода

mov cx,0
mov ah,02h
lea si,mas
inmas:
mov dl,[si]
add dl,30h
int 21h
inc cx
inc si
cmp cx,10
jb inmas
mov dx,0Ah
int 21h
mov dx,0Dh
int 21h


и этот
;вывод

mov cx,0
mov ah,02h
lea si,mas
outmas:
mov dl,[si]
add dl,30h
int 21h
inc cx
inc si
cmp cx,10
jb outmas

И на этом думаю все, тока желательно полностью их объяснить а не в общем, если можно конечно!
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779201
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
асемблер.... оляля.... что вспоминается


main:
mov dx,@data
mov ds,dx


почему не
mov ds,@data
- патамушта сегментные регистры сами с памятью не умеют работать - они же в этой работе используются

mov cx,0
mov ah,02h
lea si,mas
в si - адрес того самого массива...

mov dl,[si]
add dl,30h

в закинули байт, добавили 30h - код нуля. похоже - получили из цифры 0...9 аски-код...

int 21h
посмотрел на содержимое ah которое заполнено mov ah,02h
и вывел символ
http://yandex.ru/yandsearch?text=int+21h+02h&lr=213

inc si - увеличили si - он у нас для адресации используется
inc cx - увеличили cx, потом прыгнем если там ... то ли 10 то ли больше?
cmp cx,10 - сравнили cx с 10
jb inmas - собственно пругнули на метку....

склероз.....
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779206
ALKIR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GwaSho0t,
это вывод массива на экран
с переводом строки в конце

mov cx,0;cx используется как счетчик, обнуляется
mov ah,02h;будем использовать фукцию 02h для прерывания int
lea si,mas; определим адрес данных mas db 9,0,6,7,4,1,5,2,8,3
;! всего 10 байт
inmas:;это метка на нее будем возвращаться
mov dl,[si];si - это указатель на mas, помещаем в dl следующий байт
add dl,30h;ПОСМОТРЕТЬ что такое таблица ISCII - здесь выполняется преобразование к символу
int 21h;вызываем фукцию 02h
inc cx; увеличиваем счетчик
inc si;переходим к следующему элементу в mas
cmp cx,10; сравнимаем счетчик и 10
jb inmas; если счетчик меньше 10 переходим на метку inmas

;ниже выводим символы 10 и 13 - это перевод картеки
mov dx,0Ah;Это 10
int 21h
mov dx,0Dh;Это 13
int 21h
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779216
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir Baskakovасемблер.... оляля.... что вспоминается


main:
mov dx,@data
mov ds,dx


почему не
mov ds,@data
- патамушта сегментные регистры сами с памятью не умеют работать - они же в этой работе используются

mov cx,0
mov ah,02h
lea si,mas
в si - адрес того самого массива...

mov dl,[si]
add dl,30h

в закинули байт, добавили 30h - код нуля. похоже - получили из цифры 0...9 аски-код...

int 21h
посмотрел на содержимое ah которое заполнено mov ah,02h
и вывел символ
http://yandex.ru/yandsearch?text=int+21h+02h&lr=213

inc si - увеличили si - он у нас для адресации используется
inc cx - увеличили cx, потом прыгнем если там ... то ли 10 то ли больше?
cmp cx,10 - сравнили cx с 10
jb inmas - собственно пругнули на метку....

склероз.....
спасибо огромное
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779221
ALKIR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mov cx,0
mov ah,02h
lea si,mas
outmas:
mov dl,[si]
add dl,30h
int 21h
inc cx
inc si
cmp cx,10
jb outmas

;это такой же вывод как и предыдущий,
;с тем исключением, что не выводиться перевод каретки,
;вместо этого выполняется завершение программы:

mov ax,4c00h
int 21h
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779226
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ALKIRGwaSho0t,
это вывод массива на экран
с переводом строки в конце

mov cx,0;cx используется как счетчик, обнуляется
mov ah,02h;будем использовать фукцию 02h для прерывания int
lea si,mas; определим адрес данных mas db 9,0,6,7,4,1,5,2,8,3
;! всего 10 байт
inmas:;это метка на нее будем возвращаться
mov dl,[si];si - это указатель на mas, помещаем в dl следующий байт
add dl,30h;ПОСМОТРЕТЬ что такое таблица ISCII - здесь выполняется преобразование к символу
int 21h;вызываем фукцию 02h
inc cx; увеличиваем счетчик
inc si;переходим к следующему элементу в mas
cmp cx,10; сравнимаем счетчик и 10
jb inmas; если счетчик меньше 10 переходим на метку inmas

;ниже выводим символы 10 и 13 - это перевод картеки
mov dx,0Ah;Это 10
int 21h
mov dx,0Dh;Это 13
int 21h
Огромное спасибо, классно расписали...все сразу стало понятно! И следующий кусок также если можно!
...
Рейтинг: 0 / 0
Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
    #37779229
Sho0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ALKIR,



Огромное вам спасибо думаю все теперь будет нормально. Еще раз спасибо что не пожалели потратить свое время на меня!
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите пожалуйста, вопрос жизни и смерти!!! Нужно разобраться с кодом Assembler!!!Плз
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]