Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
dima_
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 23
1

Прокомментировать приведенный код и объяснить его назначение

14.12.2012, 20:33. Просмотров 719. Ответов 10
Метки нет (Все метки)

Доброго времени суток! Прошу помочь разобраться с программой на ассемблере, написать комменты или объяснить как она работет. Заранее спасибо

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
.386
 
.model flat, stdcall
option casemap :none
 
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
include \masm32\include\msvcrt.inc 
includelib \masm32\lib\msvcrt.lib
 
 
 
.data
message db "Vvedite stroky: ",0dh,0ah,0
message1 db "Kakoi simvol budem iskat'? ", 0dh,0ah,0
message2 db "Kolishestvo naidennyh simvolov v stroke: ", 0
message_err db "Takogo simvola v stroke net...", 0dh,0ah,0
format db '%d',0
index dd ?
 
 
.code
 
start proc
 
local string[260]:byte
 
invoke crt_printf,offset message ;вывел меседж
lea esi,string ; адрес, по которому хранится строка
mov edi,esi ; перемещаем адрес строки в edi
invoke crt_gets,esi 
 
invoke crt_printf,offset message1
invoke crt_getchar
mov ebx,eax
 
mov index,0
 
invoke crt_strlen,esi
mov ecx,eax
 
beg:
lodsb
stosb
cmp al,bl
jz @1
jmp @2
 
@1:
inc index
 
@2:
loop beg
 
cmp index,0
jz @3
invoke crt_printf,offset message2
invoke crt_printf,addr format , index
jmp @4
 
@3:
 
 ; Выдаем ошибку
invoke crt_printf, offset message_err
 
@4:
 
 ; Ждем символ
invoke crt__getch
invoke crt__exit
 
; Конец
start endp
end start
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2012, 20:33
Ответы с готовыми решениями:

Подробно прокомментировать приведенный код
.model small .stack 256 .data cr equ 13 lf equ 10 Perenos db cr,lf,'$' PER Dw 0...

Разобрать код и объяснить его функционал
data A ds B ds R ds CT1 ds CH ds CT2 ds code:...

Разобрать приведенный код
Добрый день, товарищи программисты! Пытаюсь разобрать ассемблерный код. Наткнулся на такие...

Что делает приведенный код
Добрый день! возникла передо мной такая задача, разобраться в коде ассемблера, но так как я вообще...

Подробно разобрать приведенный код
Собственно сабж : .text:08398500 ;GNET::Skill419Stub::State1::~State1() .text:08398500 ...

10
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
14.12.2012, 20:59 2
Вводим строку, потом символ, далее ищем, сколько раз этот символ в строке появился. Если нашли, выводим сколько. Или ошибку.
Стр. 36 и 50 -лишние.
1
dima_
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 23
14.12.2012, 21:17  [ТС] 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
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
.data
message db "Vvedite stroky: ",0dh,0ah,0
message1 db "Kakoi simvol budem iskat'? ", 0dh,0ah,0
message2 db "Kolishestvo naidennyh simvolov v stroke: ", 0
message_err db "Takogo simvola v stroke net...", 0dh,0ah,0
format db '%d',0
index dd ?
 
 
.code
 
start proc
 
local string[260]:byte
 
invoke crt_printf,offset message ;вывел месседж
lea esi,string ; адрес, по которому хранится строка
invoke crt_gets,esi 
 
invoke crt_printf,offset message1 ; выводим месседж
invoke crt_getchar ; считываем строку
mov ebx,eax
 
mov index,0 ; присваиваем index == 0
 
invoke crt_strlen,esi
mov ecx,eax
 
beg:
lodsb ; Считать байт по адресу ESI в AL
cmp al,bl ; если значения регистров ал и бл равны переходим к метке @1
jz @1 ;переход к метке @1
jmp @2 ; переход к метке @2
 
@1:
inc index ;увеличение index
 
@2:
loop beg ; возвращаемся к beg
 
cmp index,0 ; если index == 0
 
jz @3 ; выдаем ошибку
;если символ есть, то:
invoke crt_printf,offset message2 ; сообщение
invoke crt_printf,addr format , index ; печатаю index
 
jmp @4
 
@3:
 
invoke crt_printf, offset message_err ; Выдаем ошибку
 
@4:
 
 ; Ждем символ
invoke crt__getch ;ВОТ ТУТ НЕ ПОНЯТНО
invoke crt__exit
 
; Конец
start endp
end start
0
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
14.12.2012, 21:28 4
Цитата Сообщение от dima_
;ВОТ ТУТ НЕ ПОНЯТНО
стандартная сюшная _getch(); - ждём кнопку.
Цитата Сообщение от dima_ Посмотреть сообщение
Assembler
1
2
3
cmp al,bl ; если значения регистров ал и бл равны... 
jz @1 ; ...то переход к метке @1, 
jmp @2 ; иначе переход к метке @2
поправил комменты.
1
dima_
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 23
14.12.2012, 21:33  [ТС] 5
Мне в целом непонятно, что делает
Assembler
1
2
3
4
5
@4:
 
 ; Ждем символ
invoke crt__getch 
invoke crt__exit


И еще вопросик: что делает invoke и для чего нужна ?
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,069
14.12.2012, 21:36 6
Цитата Сообщение от dima_ Посмотреть сообщение
; Ждем символ
invoke crt__getch
invoke crt__exit
И еще вопросик: что делает invoke и для чего нужна ?
ждем нажатия клавиши и выходим из проги. invoke это макрос масма для вызова процедуры, близкий к высокоуровневым языкам
1
dima_
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 23
14.12.2012, 21:48  [ТС] 7
Спасибо!
И вроде последний вопрос остался

Assembler
1
invoke crt_gets,esi
что делает эта строчка? считывает из регистра esi в строку? если да, то в какую строку?

и что делает вот эта строчка
Assembler
1
invoke crt_strlen,esi
0
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
14.12.2012, 21:56 8
Цитата Сообщение от dima_ Посмотреть сообщение
invoke crt_gets,esi
получить строку с клавы в буфер по адресу из ESI.
Цитата Сообщение от dima_ Посмотреть сообщение
invoke crt_strlen,esi
получить длину строки по адресу из ESI.
1
dima_
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 23
14.12.2012, 21:59  [ТС] 9
Спасибо большое
0
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
14.12.2012, 22:54 10
dima_, на будущее - описание ф-ций с префиксом crt_ лежит здесь. Надо просто отбросить префикс.
2
Памирыч
Почетный модератор
20915 / 8799 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
14.12.2012, 23:52 11
Господа, если Вы цитируете код, не забывайте его заключать в теги.
0
14.12.2012, 23:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 23:52

Исправить и оптимизировать приведенный код
data SEGMENT byte ;Сегмент даних s1 db 1,2,3,4,5,6,7,8 ...

Что делает приведенный код
NORMAL DB 7 ;07H INVERSE DB 112 ;70H VIDEO_SEG DW 45056 ;0B000H COLUMNS DW ?...

Разобрать приведенный код и объяснить его назначение
объясните, что делает этот метод static string NewMas(ref int i, int indexdel, int mas, ref...


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

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

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