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

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

24.05.2012, 18:56. Показов 2662. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru