Базовый интерфейс, функция вывода звука, функция для просчёта выражения
12.10.2012, 19:10. Показов 1910. Ответов 0
ОЧЕНЬ НУЖНА ПОМОЩЬ!
Нужно реализовать программу, которая по нажатию клавиши, а после "enter" выполняла такие функции:
"a": Расчёт значения выражения ((a1-a2)*a3*a4+a5)
Значения a1=-1, a2=2, a3=1, a4=2, a5=3 должны вводиться с клавиатуры.
"s": Вывод звука динамика.
"d": Выход из программы.
Шаблоны файлами прикреплены к сообщению.
Шаблон программы прилагается:
Кликните здесь для просмотра всего текста
| 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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
| IDEAL
MODEL small
STACK 256
DATASEG
; При входе буфер по адресу ds:dx должен быть оформлен так:
; -------T---T---T---T---T---┐
; │string│ ? │ ? ? ? ? - string- максимально допустимая
; L------+---+---+---+---+----- длина ввода (от 1 до 254)
;
; При выходе буфер заполнен данными следующим образом:
; -------T---------T---T---T---T---┐
; │string│ str_len │ T E X T - 0dH str_len- действительная длина
; L------+---------+---+---+---+----- данных без завершающего CR(здесь -04H).
string db 254 ;объявление переменной string,
;определяющей максимально допустимое
;число вводимых символов
str_len db 0 ;под запись реально
;выводимого числа символов: str_len
db 254 dup ('*') ; Буфер
;первоначально заполнен символами '*'для
;удобства его просмотра в отладчике до и
;после выполнения программы.
system_message_1 DB "Input command\ " ,'$'
system_message_2 DB "Program end" ,'$'
;
display_message_0 DB "------------programm for lab 3 is running !!!--------", 13, 10, '$'
display_message_1 DB "c - for count", 13, 10, '$'
display_message_2 DB "b - for beep", 13, 10, '$'
display_message_3 DB "q - for exit", 13, 10, '$'
display_message_4 DB "----------programm for lab is END !!! - for exit", 13, 10, '$'
message DB ?
test_message_1 DB "!!! count DISPLAY", 13, 10, '$'
test_message_2 DB "!!! beep DISPLAY", 13, 10, '$'
test_message_3 DB "q - for exit", 13, 10, '$'
CODESEG
Start:
mov ax, @data ;Инициализируем сегмент данных
mov ds, ax
Main_cikle:
;-------------------------------------------------------------------
call display_foo_main
;------------------------------------------------------------------
;считать строку символов из стандартного ввода в буфер
mov ah, 0ah ; ah <- 0ah (пересылаем в регистр
; ah номер функции DOS для ввода: 0ah)
mov dx, offset string ; dx <- offset string (пересылаем в
; регистр dx смещение началабуфера в
;сегменте данных)
int 21h ; реализуем функцию DOS для ввода: 0ah
;через прерывание int 21h
xor ax, ax
mov bx, offset string
mov ax, [bx+1]
shr ax, 8
cmp ax, 063h ; c ascii =63h
je Count
cmp ax, 062h ; b ascii =62h
je Beep
cmp ax, 071h ; q ascii =71h
je Exit
jmp Main_cikle
Count:
mov dx, offset test_message_1
call display_foo
; any foo
jmp Main_cikle
Beep:
; any foo
mov dx, offset test_message_2
call display_foo
jmp Main_cikle
; После появления запроса с текущей позиции курсора вводим произвольную
; строку символов с числом <= 254. После ввода последнего символа
; нажимаем ENTER и возвращаемся в отладчик (TD).
;В отладчике с адреса <=DS:0000 просматриваем состояние буферапосле ввода
; Для вывода строки из буфера на экран необходимо преобразоватьформат
; введенной строки данных. Для этого заменяем последний символ введенной
; строки: возврат каретки - 0dh на символ '$'-24h. Символ $ завершает
; ASCII$ - строку
xor bh, bh ;bh <- bh xor bh (обнуляем регистр bh)
mov bl, [str_len] ;bl <- M(DS:str_len)
;пересылаем в bl длину реально
;введенной строки
mov [byte bx + 2], '$' ;M(DS:(bx+2)) <- 24h,
;ASCII - код '$'
; заменяем символ 0dh на '$'
; заменяем в буфере значение переменной <string> на 0dh - ASCII - код, а
; значение переменной <str_len> - на 0ah - перевод строки
mov [byte ds:0], 0dh ; M(DS:0000 <- 0dh)
mov [byte ds:1], 0ah ; M(DS:0001 <- 0ah)
; реализуем функцию DOS 09h для вывода на экран строки из буфера.
; При выводе строки по первому символу (0dh) произойдет возврат
; каретки, а по второму (0ah) - перевод строки при этом выводимая
; строка будет располагаться в начале следующей строки экрана
; при выполнении функции 09h вывод символов на экран будет
; продолжаться до появления символа '$' - код 24h.
mov ah, 09h ;ah<-09h (записываем номер функции
;DOS в регистр ah)
mov dx, offset string ; dx<-offset string=0000h
;записываем в регистр DX смещение
;выводимой строки
int 21h ;вызов системной функции DOS
; стандартный выход из выполняемой программы
Exit:
mov dx, offset display_message_4
call display_foo
mov ax,04C00h ; ah - 4ch (функция DOS выхода из
; программы и передачи управления
int 21h ;вызов пpеpывания DOS
;-------------------------------------------------------
PROC display_foo_main
mov dx, offset display_message_0
call display_foo
mov dx, offset display_message_1
call display_foo
mov dx, offset display_message_2
call display_foo
mov dx, offset display_message_3
call display_foo
mov dx, offset system_message_1
call display_foo
ret
ENDP display_foo_main
PROC display_foo
mov ah,9
int 21h
xor dx, dx
ret
ENDP display_foo
;-----------------------------------------------------
END Start |
|
Есть пример выполнения, но он не компилируется TASM'ом 16\32-битным.
Кликните здесь для просмотра всего текста
| 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
| TITLE A10SELMU (EXE)
.MODEL SMALL
.STACK 256
.DATA
;----------------------------------------------------------------
TOPROW EQU 08 ;
BOTROW EQU 15 ;
LEFCOL EQU 26 ;
ATTRIB DB ? ;
ROW DB 00 ;
SHADOW DB 19 DUP(ODBH) ;
MENU DB 0C9H, 17 DUB(OCDH), 0BBH
DB 0BAH, 'L - for count ', 0BAH
DB 0BAH, 'Z - for beep ', 0BAH
DB 0BAH, 'X - for quit ', 0BAH
DB 0C8H, 17 DUP(0CDH), 0BCH
PROMPT DB 'To select an item , use Up/Down Arrow'
DB ' and press Enter'
.386 ;------------------------------------------------------------
.CODE
A10MAIN PROC FAR ;
MOV AX,@data ;
MOV DS,AX ;
MOV ES,AX ;
CALL Q10CLEAR ;
MOV ROW,BOTROW+4 ;
A20:
CALL B10MENU ;
MOV ROW,TOPROW+1 ;
MOV ATTRIB,16H ;
CALL D10DISPLAY ;
CALL C10INPUT ;
CMP AL,1BH ;
JNE A20 ;
MOV AX,0600H ;
CALL Q10CLEAR ;
MOV AX,4C00H ;
INT 21,H
A10MAIN ENDP
;------------------------------------------------------------------
B10MENU PROC NEAR
PUSHA ;
MOV AX,1301H ;
MOV BX,0060H ;
LEA BP,SHADOW ;
MOV CX,19 ;
MOV DH,TOPROW+1 ;
MOV DL,LEFCOL+1 ;
B20: INT 10H
INC DH ;
CMP DH,BOTROW+2 ;
JNE B20 ;
MOV ATTRIB,71H ;
MOV AX,1300H ;
MOVZX BX,ATTRIB ;
LEA BP,MENU ;
MOV CX,19 ;
MOV DH,TOPROW ;
MOV DL,LEFCOL ;
B30:
INT 10H
ADD BP,19 ;
INC DH ;
CMP DH,BOTROW+1 ;
JNE B30 ;
MOV AX,1301H ;
MOVZX BX,ATTRIB ;
LEA BP,PROMPT ;
MOV CX,79 ;
MOV DH,BOTROW+4 ;
MOV DL,00 ;
INT 10H
POPA ;
RET
B10MENU ENDP
;---------------------------------------------------------------------
C10INPUT PROC NEAR
PUSHA ;
C20: MOV AH,10H ;
INT 16H ;
CMP AH,50H ;
JE C30 ;
CMP AH,48H ;
JE C40 ;
CMP AL,0DH ;
JE C90 ;
CMP AL,1BH ;
JE C90 ;
JMP C20 ;
C30:
MOV ATTRIB,71H ;
CALL D10DISPLAY ;
INC ROW ;
CMP ROW,BOTROW-1 ;
JBE C50 ;
MOV ROW,TOPROW+1 ;
JMP C50
C40: MOV ATTRIB,71H ;
CALL D10DISPLY ;
DEC ROW ;
CMP ROW,TOPROW+1 ;
JAE C50 ;
MOV ROW,BOTROW-1 ;
C50: MOV ATTRIB,17H ;
CALL D10DISPLY ;
JMP C20
C90: POPA RET
C10INPUT ENDP
;-----------------------------------------------------------------------
D10DISPLY PROC NEAR ;
PUSHA ;
MOVZX AX,ROW ;
SUB AX,TOPROW ;
IMUL AX,19 ;
LEA SI,MENU+1 ;
ADD SI,AX ;
MOV AX,1300H ;
MOVZX BX,ATTRIB ;
MOV BP,SI ;
MOV CX,17 ;
MOV DH,ROW ;
MOV DL,LEFCOL+1 ;
INT 10H
POPA
RET
D10DISPLY ENDP
;------------------------------------------------------------------------
Q10CLEAR PROC NEAR
PUSHA
MOV AX,0600H
MOV BH,61H ;
MOV CX,0000 ;
MOV DX,184FH ;
INT 10H
POPA
RET
Q10CLEAR ENDP
END A10MAIN |
|
0
|