Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
.NET ONLY
 Аватар для DEA7H
71 / 71 / 7
Регистрация: 05.10.2011
Сообщений: 495

Описать процедуру

24.05.2012, 18:56. Показов 2709. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть задача! Нужно в строке подсчитать количество таких знаков как "<<" ">>" "="; Она сделана и работоспособна вот код:
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
146
147
model small
stack 256
 
STACKSEGMENT SEGMENT STACK
  db 80 dup(?)
STACKSEGMENT ENDS
 
DATASEGMENT SEGMENT
  Buffer db 'asdjh<l>>>>===<<ja>s==dh<asj<<', 10, 13, '$'
  EnterString db 10, 13, '$'
  LStr db 'Count of <: ', 10, 13, '$'
  HStr db 'Count of >: ', 10, 13, '$'
  EStr db 'Count of =: ', 10, 13, '$'
  Len db 30
  LCount db 0
  HCount db 0
  ECount db 0  
DATASEGMENT ENDS
 
CODESEGMENT SEGMENT
ASSUME SS:STACKSEGMENT, DS:DATASEGMENT, CS:CODESEGMENT
Start:
  MOV AX, DATASEGMENT
  MOV DS, AX
 
  MOV DX, Offset Buffer
  CALL PrintString
  
  MOV SI, Offset Buffer
  CLD
  XOR CX, CX
  MOV CL, Len
  LCycle:
    LODSB
    CMP AL, '<'
    JE LFind
    JMP LEnd
    LFind:
      MOV AL, LCount
      INC AL
      MOV LCount, AL
    LEnd:
  LOOP LCycle
  
  MOV SI, Offset Buffer
  CLD
  XOR CX, CX
  MOV CL, Len
  HCycle:
    LODSB
    CMP AL, '>'
    JE HFind
    JMP HEnd
    HFind:
      MOV AL, HCount
      INC AL
      MOV HCount, AL
    HEnd:
  LOOP HCycle
  
  MOV SI, Offset Buffer
  CLD
  XOR CX, CX
  MOV CL, Len
  ECycle:
    LODSB
    CMP AL, '='
    JE EFind
    JMP EEnd
    EFind:
      MOV AL, ECount
      INC AL
      MOV ECount, AL
    EEnd:
  LOOP ECycle
  
  MOV DX, Offset LStr
  CALL PrintString
  
  XOR AX, AX
  MOV AL, LCount
  CALL PrintNumber
  
  MOV DX, Offset EnterString
  CALL PrintString
  
  MOV DX, Offset HStr
  CALL PrintString
  
  XOR AX, AX
  MOV AL, HCount
  CALL PrintNumber
  
  MOV DX, Offset EnterString
  CALL PrintString
  
  MOV DX, Offset EStr
  CALL PrintString
  
  XOR AX, AX
  MOV AL, ECount
  CALL PrintNumber
  
  MOV DX, Offset EnterString
  CALL PrintString
  
  MOV AX, 4C00h
  INT 21h
 
  ;процедура виведення рядка з DX
  PrintString PROC
    PUSH AX
    MOV AH, 9
    INT 21h
    POP AX
    RET
  PrintString ENDP
  
  PrintNumber PROC
    PUSH AX
    PUSH CX
    PUSH DX
    PUSH BX
    XOR CX, CX
    MOV BX, 000Ah
    Cont:  
      XOR DX, DX
      DIV BX
      PUSH DX
      INC CX
      OR AX, AX
      JNZ Cont
      MOV AH, 02h
    Next:
      POP DX
      ADD DL, 30h
      INT 21h
      LOOP Next
      POP BX
      POP DX
      POP CX
      POP AX
      RET
  PrintNumber ENDP
 
CODESEGMENT ENDS
  END Start
1.rar

Вот что собственно мне не ясно! Не могли-бы вы написать комментарии к каждой строчке к вот этой процедуре:
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
PrintNumber PROC
    PUSH AX
    PUSH CX
    PUSH DX
    PUSH BX
    XOR CX, CX
    MOV BX, 000Ah
    Cont:  
      XOR DX, DX
      DIV BX
      PUSH DX
      INC CX
      OR AX, AX
      JNZ Cont
      MOV AH, 02h
    Next:
      POP DX
      ADD DL, 30h
      INT 21h
      LOOP Next
      POP BX
      POP DX
      POP CX
      POP AX
      RET
  PrintNumber ENDP
И вопрос, почему именно нужно использовать вот такую процедуру а нельзя просто выводить строку с нужными данными...

Заранее благодарен!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2012, 18:56
Ответы с готовыми решениями:

описать процедуру, которая уменьшает вдвое отрицательные элементы массива.
Подскажите в чем ошибка %nolist include mac.lib %list A_DATA segment para A DW 10 dup(?) SPp DW ? K DW ?

Описать близкую процедуру F(X, N, P)
Здравствуйте. Помогите, пожалуйста, решить задачу на Assembler. Описать близкую процедуру F(X, N, P), определяющую, сколько элементов...

описать близкую процедуру
τесть вот такая задачка Описать близкую процедуру F(X, N, P), определяющую, сколько элементов мас- сива X из N байтов равно...

24
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
24.05.2012, 19:14
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
PrintNumber PROC
    PUSH AX
    PUSH CX
    PUSH DX
    PUSH BX;сохраняем регистр
    XOR CX, CX;обнуляем счетчик
    MOV BX, 000Ah
    Cont:  
      XOR DX, DX;обнуляем регистр
      DIV BX;делим AX на BX
      PUSH DX;сохраняем старшую часть
      INC CX;инкрементим счетчик
      OR AX, AX
      JNZ Cont;если не ноль, то продолжаем деление на 10
      MOV AH, 02h;задаем номер функции
    Next:
      POP DX;достаем
      ADD DL, 30h
      INT 21h;печатаем
      LOOP Next;и пошло, и поехало
      POP BX
      POP DX
      POP CX
      POP AX;регистры восстанавливаем
      RET;возврат.
  PrintNumber ENDP
Цитата Сообщение от DEA7H Посмотреть сообщение
И вопрос, почему именно нужно использовать вот такую процедуру а нельзя просто выводить строку с нужными данными
Не понял. Что ты хотел сказать?
1
.NET ONLY
 Аватар для DEA7H
71 / 71 / 7
Регистрация: 05.10.2011
Сообщений: 495
24.05.2012, 19:42  [ТС]
Спасибо, то что нужно, только можно еще вот эти 2 строчки описать:
Assembler
1
MOV BX, 000Ah
и
Assembler
1
OR AX, AX
0
 Аватар для Troll_Face
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
24.05.2012, 19:44
Цитата Сообщение от DEA7H Посмотреть сообщение
OR AX, AX
проверка на ноль

Добавлено через 28 секунд
Цитата Сообщение от DEA7H Посмотреть сообщение
MOV BX, 000Ah
основание системы счисления
1
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
24.05.2012, 19:45
DEA7H,
Assembler
1
MOV BX, 000Ah
- устанавливаем основание системы исчисления: 10 (на 10 все время делить будем)

Цитата Сообщение от DEA7H Посмотреть сообщение
OR AX, AX
Она устанавливает ZF, если AX=0. Но я считаю как одну команду две строки:
Assembler
1
2
OR AX, AX
      JNZ Cont;если не ноль, то продолжаем деление на 10
1
.NET ONLY
 Аватар для DEA7H
71 / 71 / 7
Регистрация: 05.10.2011
Сообщений: 495
24.05.2012, 20:39  [ТС]
Спасибо! Теперь все понятно! Спасибо большое!
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
24.05.2012, 20:43
Цитата Сообщение от DEA7H
написать комментарии
В коде 3 лишних байта.
0
 Аватар для Troll_Face
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
24.05.2012, 21:15
Charles Kludge, Да ты крут, к 3 байтам придрался
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
24.05.2012, 21:29
Fatal Error, А ты пальцы-то не растопыривай, лучше найди какие.
И покажи ТСу, как сделать, чтобы рез-т ф-ции можно было выводить через его PrintString.
0
 Аватар для Troll_Face
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
24.05.2012, 22:12
Цитата Сообщение от Charles Kludge Посмотреть сообщение
покажи ТСу, как сделать, чтобы рез-т ф-ции можно было выводить через его PrintString.
мне лень, я пытаюсь понят как работают прерывания

Добавлено через 3 минуты
Charles Kludge, а кто тебе нарушение приписал, если не секрет?
0
.NET ONLY
 Аватар для DEA7H
71 / 71 / 7
Регистрация: 05.10.2011
Сообщений: 495
25.05.2012, 00:02  [ТС]
И вопрос, почему я использую вот такую процедуру для того чтобы вывести количество найденных символов в в строке, а не могу просто выводить значение счетчика (ну сколько оно там наинковало когда попадался нужный символ)...
0
 Аватар для Troll_Face
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
25.05.2012, 06:56
Потому что для вывода чисел их сначала надо преобразовать в ASCII код, а потом выводить. Попробуй выведи просто число и увидешь что будет.
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
25.05.2012, 09:42
Цитата Сообщение от Charles Kludge Посмотреть сообщение
А ты пальцы-то не растопыривай, лучше найди какие.
Вместо
Assembler
1
2
3
4
5
6
7
8
9
push ax
push cx
push dx
push bx
...
pop bx
pop dx
pop cx
pop ax
Assembler
1
2
3
pusha
...
popa
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
25.05.2012, 11:53
Цитата Сообщение от Charles Kludge Посмотреть сообщение
В коде 3 лишних байта.
int 29h использовать при выводе, освобождается ровно 3 байта.
Assembler
1
2
3
    pop ax
    add al,30h
    int 29h
Что интересно, команда add al,30h на байт короче, чем add dl,30h.
0
.NET ONLY
 Аватар для DEA7H
71 / 71 / 7
Регистрация: 05.10.2011
Сообщений: 495
25.05.2012, 13:35  [ТС]
А зачем вообще помещать в стек эти регистры:
Assembler
1
2
3
4
PUSH AX
    PUSH CX
    PUSH DX
    PUSH BX
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
25.05.2012, 13:44
Вобще-то так принято, сохранять изменяемые регистры перед входом в подпрограмму, при выходе - восстанавливать. Ведь регистры используются в основной программе, подпрограмма же их испортит.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
25.05.2012, 13:51
Цитата Сообщение от programmisto
pusha
...
popa
А есть уверенность, что это прокатит на эмо8086? pusha/popa - 286+
0
.NET ONLY
 Аватар для DEA7H
71 / 71 / 7
Регистрация: 05.10.2011
Сообщений: 495
25.05.2012, 14:04  [ТС]
а зачем тогда:
Assembler
1
OR AX, AX
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
25.05.2012, 14:15
programmisto уже ответил на этот вопрос:
Цитата Сообщение от programmisto Посмотреть сообщение
Она устанавливает ZF, если AX=0
Если ax = 0, значит частное нуль, дальше делить не нужно, все цифры найдены(лежат в стеке).
0
.NET ONLY
 Аватар для DEA7H
71 / 71 / 7
Регистрация: 05.10.2011
Сообщений: 495
25.05.2012, 14:24  [ТС]
Ну это я понял! Я хочу понять как там меняются флаги...
Ну типа вывести состояние флагов после выполнения данной команды.
И почему именно AX, AX?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2012, 14:24
Помогаю со студенческими работами здесь

Описать близкую процедуру
τесть вот такая задачка Описать близкую процедуру F(X, N, P), определяющую, сколько элементов мас- сива X из N байтов равно...

Описать близкую процедуру SHIFT_N
Описать близкую процедуру SHIFT_N, которой передается начальный адрес некоторого массива из 100 байтов и которая за один просмотр этого...

Описать процедуру, которая вычисляет число четных элементов в массиве
Здравствуйте, недавно начал проходить Assembler, а точнее пару дней назад. Написать и отладить программу на языке ассемблера. В программе...

Описать процедуру SUM(X, N, S): присвоить параметру слову S сумму элементов массива X из N знаковых байтов
Это задание)))) Дано описание: A DB 100 DUP(?) ; числа со знаком B DW ? Описать близкую процедуру SUM(X, N, S), которая присваивает...

Описать близкую процедуру F(X, N, P), определяющую, сколько элементов мас- сива X из N байтов равно байту P
Здравствуйте! Нужна помощь с Ассемблером. Есть задание: Описать близкую процедуру F(X, N, P), определяющую, сколько элементов мас- ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru