KinG Maguire
New member
Написать программу на языке ассемблера, которая использует стек для проверки баланса расстановки скобок в строке символов.1.1. В сегменте стека определить стек из 20 двухбайтовых ячеек с начальным значением в виде символа «$».1.2. В сегменте данных определить строку не более 20 символов, содержащую произвольное арифметическое выражение, в котором используются три вида скобок «( )», «[ ]» и «{ }». Последовательность и вложенность скобок может быть любая.1.3. Также в сегменте данных определить байтовую ячейку для сохранения результата проверки.1.4. В сегменте кода, используя стек, проверить, все ли скобки закрыты, соответствует ли каждая закрывающаяся скобка открывающейся и нет ли лишних закрывающихся скобок.1.5. В соответствующую ячейку памяти поместить код результата проверки (0 – скобки расставлены правильно, 1 - несоответствие скобок, 2 – не все скобки закрыты, 3 – лишние закрывающиеся скобки).1.6. Если возникла ошибка несоответствия скобок, то в регистр DL поместить код скобки, которая ожидается, иначе – 0.
проверьте правильно ли я написал код для данной задачи:
проверьте правильно ли я написал код для данной задачи:
Код:
s_s segment stack
dw 100 dup (0)
s_s ends
d_s segment
s1 db '(((())){{{}}}}[[qz]]','$'
r1 db 0
d_s ends
c_s segment
assume ss:s_s, ds:d_s, cs:c_s
begin:
mov ax, d_s
mov ds,ax
xor ax,ax
lea si, s1
k1: lodsb
cmp si,21
cmp al, '('
je a1
cmp al, '['
je a1
cmp al, '{'
je a1
cmp al, ')'
je b1
cmp al, ']'
je b1
cmp al, '}'
je b1
jmp k1
a1:
inc cx
push ax
jmp k1
b1:
cmp cx,0
jne q1
mov r1,3
q1: dec cx
pop bx
cmp bl,'('
jne q2
cmp al, ')'
je k1
q2: cmp bl,'['
jne q3
cmp al,']'
je k1
q3: cmp bl,'{'
jne q4
cmp al,'}'
je k1
q4: mov r1,1
cmp cx,0
je f2
jmp f3
cmp cx,0
je f2
mov r1,2
f3: pop ax
loop f3
cmp r1,1
je z1
jmp f2
z1: cmp bl, '('
je z2
cmp bl, '['
je z3
cmp bl, '{'
je z4
cmp al, ')'
je z5
cmp al, ']'
je z6
cmp al, '}'
je z7
jmp f2
z2: mov dl, ')'
jmp f2
z3: mov dl, ']'
jmp f2
z4: mov dl, '}'
jmp f2
z5: mov dl, '('
jmp f2
z6: mov dl, '['
jmp f2
z7: mov dl, '{'
f2: mov ah,4ch
int 21h
c_s ends
end begin