Скомпилировать программу на TASM
03.12.2012, 03:38. Показов 2528. Ответов 1
| 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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
| assume CS:code, DS:data
code segment
begin:
mov AX, data
mov DS, AX
call Display_Ask_X
call Input ; ввод X (ограничено 2-мя символами)
mov BX, AX ; Х будем хранить в ВХ
;call Display_Ask_Y
;call Input ; ввод Y (ограничено 2-мя символами)
;mov CX, AX ; Y будем хранить в СХ
call Display_ok
call Analyse ; наша процедурка
call Output ; вывод целого числа с АХ - иам наш результат
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
;----------------------------------------------------------------------------------------------------------
Analyse proc ; анализируем, что там навводили х в ВХ,
cmp BX, 0 ; проверяем условие х>0 & y>0
jng lbl_4
cmp BX, 6
jg lbl_1
jb lbl_3
lbl_4: ; =38x^3+5
mov AX, BX ; ложим Х в АХ
imul BX ;умножаем его на x
mov DI, AX ; результат кладем на склад
mov AX, BX ; ложим X в АХ
imul BX ;умножаем его на x
mov DI, AX ; результат кладем на склад
mov AX 38 ; здесь пишет ошибку тасм
imul AX
mov DI, AX ; результат кладем на склад
mov AX, 5
add AX, AX ; складываем его с 5
jmp exit_a
lbl_3: ; =1250/x
mov AX, 1250
idiv BX ; делим
jmp exit_a
lbl_1: ; по формуле
mov AX, BX ; ложим Х в АХ
imul BX ; умножаем его на x
mov DI, AX ; результат кладем на склад
mov AX 40; здесь пишет ошибку тасм
imul AX ; умножаем его на 40
mov DI, AX ; результат кладем на склад
mov AX, -23
add AX, AX ; складываем его с -23
exit_a:
ret
Analyse endp
;----------------------------------------------------------------------------------------------------------
Input proc
push BX
mov DX, offset Buff ; вводим наше число
mov AH, 10
int 21h
mov SI, offset Buff+1 ; адрес где лежит кол-во введенных цифр
xor CX, CX
mov CL, [SI] ; берем кол-во введенных цифр для цикла
cmp CX, 0 ; если ноль - на выход
je exit_lbl
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
inc SI ; берем первый разряд нашего числа
mov AL, [SI] ; пхаем его в регстр для обработки
cmp AL,'-' ; если минус - установить флаг
jne positiv
mov fl, 1 ; флаг негативного числа
dec CL ; кло-во цифр стало на 1 меньше
cmp CX, 0 ; если кроме минуса там ничего нет - на выход
je exit_lbl
inc SI ; следующий разряд нашего числа
positiv:
xor AX, AX
xor DI, DI
mov DI, 10 ; 10 - кратность
dec SI ; адрес цифры возвращаем обратно
lbl1:
inc SI ; берем следующий разряд нашего числа
xor BX, BX
mov BL, [SI] ; пхаем его в регстр для обработки
sub BL, '0' ; обрабатываем его - перобразуем в людской вид
cmp BL, 9 ; если это не цифра - на выход
ja exit_lbl
mul DI ; умножаем его на 10
add AX, BX ; складываем до купы
loop lbl1
cmp fl,1 ; если у нас отрицательное число
jne ee
neg AX ; цепляем ему минус
ee:
pop BX
ret
exit_lbl:
call Error_Exit
Input endp
;----------------------------------------------------------------------------------------------------------
Output proc
mov BX, 10 ; основа системы счисления
mov DI, offset Buff+6 ; счетчик на конец буффера
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
cmp AX, 0 ; наше число отрицаиельное?
jge Pr1
neg AX ; если да, то делаем его положительным
mov fl, 1 ; но устанавливаем флаг отриц. числа
Pr1: xor DX, DX ; тут будет остаток
div BX ; делим АХ на 10 - остаток в DX
mov SI, offset Tabl ; адес начала таблицы с символами
add SI, DX ; адрес нужного нам символа
mov DL, [SI] ; пхаем его в память, там где Buff
mov [DI], DL
dec DI ; переходим на следующее место
cmp AX, 0 ; а не закончилось ли у нас число?
jnz Pr1 ; если нет то опять за свое
cmp fl,1 ; если у нас отрицательное число
jne eee
mov DL, '-'
mov [DI], DL ; цепляем ему минус
dec DI ; переходим на следующее место
eee:
mov AH, 9 ; если да, то гуляем (выводим число на экран)
mov DX, DI ; это у нас место, где начинается символы числа
inc DX ; на самом деле чуть правее
int 21h
ret
Output endp
;----------------------------------------------------------------------------------------------------------
Display_ok proc ; сообщаем, что все хорошо
push AX
mov DX, offset text1
mov AH, 9
int 21h
pop AX
ret
Display_ok endp
;----------------------------------------------------------------------------------------------------------
Error_Exit proc ; сообщаем, что все пропало и выходим
mov DX, offset text2
mov AH, 9
int 21h
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
ret
Error_Exit endp
;----------------------------------------------------------------------------------------------------------
Display_Ask_X proc ; спрашиваем ввести Х
mov DX, offset text3
mov AH, 9
int 21h
ret
Display_Ask_X endp
;----------------------------------------------------------------------------------------------------------
Display_Ask_Y proc ; спрашиваем ввести Y
mov DX, offset text4
mov AH, 9
int 21h
ret
Display_Ask_Y endp
;----------------------------------------------------------------------------------------------------------
code ends
data segment
Buff db 3, 6 dup(0), '$'
fl db 0
Tabl db '0123456789'
text1 db 13, 10, 'All ok', 13, 10, '$'
text2 db 13, 10, 'Error Exit', 13, 10, '$'
text3 db 13, 10, 'Enter X', 13, 10, '$'
text4 db 13, 10, 'Enter Y', 13, 10, '$'
text5 db 13, 10, 'Z =', 13, 10, '$'
data ends
end
stak segment stack
db 256 dup(?)
stak ends
end begin |
|
42, 57 рядок шо я не так делаю
2.вопрос(другой код)
в командной строке
tasm /zi /l proga.asm ето делает
tlink /m /v proga.asm а здесь точку входа не находить
шо я не так делаю?
| 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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
| assume CS:code, DS:data
code segment
begin:
mov AX, data
mov DS, AX
call Display_Ask_X
call Input ; ввод X (ограничено 2-мя символами)
mov BX, AX ; Х будем хранить в ВХ
call Display_Ask_Y
call Input ; ввод Y (ограничено 2-мя символами)
mov CX, AX ; Y будем хранить в СХ
call Display_ok
call Analyse ; наша процедурка
call Output ; вывод целого числа с АХ - иам наш результат
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
;----------------------------------------------------------------------------------------------------------
Analyse proc ; анализируем, что там навводили х в ВХ, у в СХ
cmp BX, 0 ; проверяем условие х>0 & y>0
jng lbl_b
cmp CX, 0
jg lbl_1
lbl_b:
cmp BX, 0 ; проверяем условие х=0 & y!=0
jne lbl_c
cmp CX, 0
jne lbl_2
lbl_c:
cmp BX, 0 ; проверяем условие х!=0 & y=0
je lbl_4
cmp CX, 0
je lbl_3
lbl_4: ; =1
mov AX, 1
jmp exit_a
lbl_3: ; =6х
mov AX, 6
imul BX
jmp exit_a
lbl_2: ; =25у
mov AX, 25
imul CX
jmp exit_a
lbl_1: ; по формуле
mov AX, BX ; ложим Х в АХ
imul CX ; умножаем его на Y
mov DI, AX ; результат кладем на склад
mov AX, BX ; ложим X в АХ
add AX, CX ; складываем его с Y
idiv DI ; делим
exit_a:
ret
Analyse endp
;----------------------------------------------------------------------------------------------------------
Input proc
push BX
mov DX, offset Buff ; вводим наше число
mov AH, 10
int 21h
mov SI, offset Buff+1 ; адрес где лежит кол-во введенных цифр
xor CX, CX
mov CL, [SI] ; берем кол-во введенных цифр для цикла
cmp CX, 0 ; если ноль - на выход
je exit_lbl
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
inc SI ; берем первый разряд нашего числа
mov AL, [SI] ; пхаем его в регстр для обработки
cmp AL,'-' ; если минус - установить флаг
jne positiv
mov fl, 1 ; флаг негативного числа
dec CL ; кло-во цифр стало на 1 меньше
cmp CX, 0 ; если кроме минуса там ничего нет - на выход
je exit_lbl
inc SI ; следующий разряд нашего числа
positiv:
xor AX, AX
xor DI, DI
mov DI, 10 ; 10 - кратность
dec SI ; адрес цифры возвращаем обратно
lbl1:
inc SI ; берем следующий разряд нашего числа
xor BX, BX
mov BL, [SI] ; пхаем его в регстр для обработки
sub BL, '0' ; обрабатываем его - перобразуем в людской вид
cmp BL, 9 ; если это не цифра - на выход
ja exit_lbl
mul DI ; умножаем его на 10
add AX, BX ; складываем до купы
loop lbl1
cmp fl,1 ; если у нас отрицательное число
jne ee
neg AX ; цепляем ему минус
ee:
pop BX
ret
exit_lbl:
call Error_Exit
Input endp
;----------------------------------------------------------------------------------------------------------
Output proc
mov BX, 10 ; основа системы счисления
mov DI, offset Buff+6 ; счетчик на конец буффера
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
cmp AX, 0 ; наше число отрицаиельное?
jge Pr1
neg AX ; если да, то делаем его положительным
mov fl, 1 ; но устанавливаем флаг отриц. числа
Pr1: xor DX, DX ; тут будет остаток
div BX ; делим АХ на 10 - остаток в DX
mov SI, offset Tabl ; адес начала таблицы с символами
add SI, DX ; адрес нужного нам символа
mov DL, [SI] ; пхаем его в память, там где Buff
mov [DI], DL
dec DI ; переходим на следующее место
cmp AX, 0 ; а не закончилось ли у нас число?
jnz Pr1 ; если нет то опять за свое
cmp fl,1 ; если у нас отрицательное число
jne eee
mov DL, '-'
mov [DI], DL ; цепляем ему минус
dec DI ; переходим на следующее место
eee:
mov AH, 9 ; если да, то гуляем (выводим число на экран)
mov DX, DI ; это у нас место, где начинается символы числа
inc DX ; на самом деле чуть правее
int 21h
ret
Output endp
;----------------------------------------------------------------------------------------------------------
Display_ok proc ; сообщаем, что все хорошо
push AX
mov DX, offset text1
mov AH, 9
int 21h
pop AX
ret
Display_ok endp
;----------------------------------------------------------------------------------------------------------
Error_Exit proc ; сообщаем, что все пропало и выходим
mov DX, offset text2
mov AH, 9
int 21h
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
ret
Error_Exit endp
;----------------------------------------------------------------------------------------------------------
Display_Ask_X proc ; спрашиваем ввести Х
mov DX, offset text3
mov AH, 9
int 21h
ret
Display_Ask_X endp
;----------------------------------------------------------------------------------------------------------
Display_Ask_Y proc ; спрашиваем ввести Y
mov DX, offset text4
mov AH, 9
int 21h
ret
Display_Ask_Y endp
;----------------------------------------------------------------------------------------------------------
code ends
data segment
Buff db 3, 6 dup(0), '$'
fl db 0
Tabl db '0123456789'
text1 db 13, 10, 'All ok', 13, 10, '$'
text2 db 13, 10, 'Error Exit', 13, 10, '$'
text3 db 13, 10, 'Enter X', 13, 10, '$'
text4 db 13, 10, 'Enter Y', 13, 10, '$'
text5 db 13, 10, 'Z =', 13, 10, '$'
data ends
end
stak segment stack
db 256 dup(?)
stak ends
end begin |
|
0
|