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
| ;Прога #1e
;--------------------------Сегмент данных----------------------
DATA SEGMENT PARA PUBLIC 'DATA' USE16
nxt db 0ah,0dh,'$'
dialog1 db 'BBeguTe cTpoKy:',0ah,0dh,'$' ;Строка диалога с пользователем
dialog2 db '<<Programm 1e - npeo6pa3oBaHue cuMBoJIoB cTpoKu B BepxHuu/Hu}|{Huu perucTp>>',0ah,0dh,0ah,0dh,'$' ;Строка диалога с
buffer1 db 100 dup(0),'$' ;Буфер, в который будет записана строка1
buffer2 db 100 dup(0),'$' ;Буфер, в который будет записана строка в верхнем регистре
buffer3 db 100 dup(0),'$' ;Буфер, в который будет записана строка в нижнем регистре
DATA ENDS
;--------------------------------------------------------------
;------------------Сегмент кода программы----------------------
CODE SEGMENT PARA PUBLIC 'CODE' USE16
assume CS:CODE,DS:DATA,SS:SSEG
include IntToStr.asm ;Подлкючаем файл с процедурой IntToStr - перевод бинарного числа в строку
;-------Процедура MAIN-------
main proc
;---Загружаем в регистр ds адрес сегмента данных:
mov ax,data
mov ds,ax
;---Чистим экран:
mov ax,3
int 10h
;---Вывод диалога на экран:
mov ah, 09h
lea dx, dialog2
int 21h
;---Вывод сообщения на экран:
mov ah, 09h
lea dx, dialog1
int 21h
;---Ввод строки пользователем:
mov bx, 0
mov cx, 32h
lea dx, buffer1
mov ah, 3fh
int 21h
;---Переводим символы строки в нижний и верхний регистр:
call Regs
;---Вывод результата на экран:
call next
mov ah, 09h
lea dx, buffer2
int 21h
call next
;---Вывод результата на экран:
mov ah, 09h
lea dx, buffer3
int 21h
;---Выход из программы:
call getch
mov ax,4c00h
int 21h
main endp
;----------------------------
;-----Процедура Regs-----
;---Преобразовываем символы исходной строки в верхний регистр и копируем их в результирующюю строку:
Regs proc
push dx
push bx
push cx
push si
;---Преобразовываем символы исходной строки в верхний регистр и копируем их в результирующюю строку:
mov si, 0 ;Регистр si - позиция текущего символа в строке
mov ax, 0
label1:
mov al, [buffer1+si] ;Считываем текущий символ в исходной строке
cmp al, 97 ;Сравниваем его ANSII код с 97 (буква "a")
jb no1 ;Если код символа меньше кода 97, значит символ не в нижнем регистре -> переходим на метку no1
cmp al, 122 ;Сравниваем его ANSII код с 122 (буква "z")
ja no1 ;Если код символа больше кода 122, значит символ не буква -> переходим на метку no1
sub al, 32 ;Иначе отнимаем 32 (переводим в верхний регистр)
no1:
mov [buffer2+si], al ;Копируем текущий символ в результирующую строку
inc si
cmp al, ah ;Сравниваем прочитанный символ с 0
jne label1 ;Пока не встречен 0, продолжаем преобразование строки
mov [buffer2+si], '$' ;Дополняем строку символом-ограничителем
;---Преобразовываем символы исходной строки в нижний регистр и копируем их в результирующюю строку:
mov si, 0 ;Регистр si - позиция текущего символа в строке
mov ax, 0
label2:
mov al, [buffer1+si] ;Считываем текущий символ в исходной строке
cmp al, 65 ;Сравниваем его ANSII код с 65 (буква "A")
jb no2 ;Если код символа меньше кода 65, значит символ не буква -> переходим на метку no2
cmp al, 90 ;Сравниваем его ANSII код с 90 (буква "Z")
ja no2 ;Если код символа больше кода 122, значит символ не в верхнем регистре -> переходим на метку no21
add al, 32 ;Иначе прибавляем 32 (переводим в нижний регистр)
no2:
mov [buffer3+si], al ;Копируем текущий символ в результирующую строку
inc si
cmp al, ah ;Сравниваем прочитанный символ с 0
jne label2 ;Пока не встречен 0, продолжаем преобразование строки
mov [buffer3+si], '$' ;Дополняем строку символом-ограничителем
pop si
pop cx
pop bx
pop dx
ret
Regs endp
;----------------------------
;процедура - ожидание нажатия клавиши
getch proc
mov ah,01h
int 21h
ret
getch endp
;----------------------------
;процедура - перевод строки
next proc
mov ah, 09h
lea dx, nxt
int 21h
ret
next endp
;----------------------------
CODE ENDS
;---------------------------------------------------------------
;----------------------Сегмент стека программы------------------
SSEG SEGMENT PARA STACK 'STACK' USE16
DB 100h DUP(0)
SSEG ENDS
;---------------------------------------------------------------
END main |