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
| title Lab_4 (Пасека Ксения и Хошимова Мунисса 621п, 2011)
.model large,C
LOCALS @@
; b/a+1 , a<b
; y= 25 , a=b
; (a*a*a-5)/b , a>b
CODESEG
EXTRN C f:BYTE ; Флажок "Деление на ноль": f=1
; Флажок "Переполнение при 16-разрядном умножении" f=2
; <<<<<<<<<<<<<<Данные знаковые!!!>>>>>>>>>>>>>>
public C lab4I
lab4I proc far
ARG a:WORD,b:WORD RETURNS y:WORD
mov f,0 ;ok!
mov ax,a ;<ax>=a
mov bx,b ;<bx>=b
cmp ax,bx ;сравнение a~b
jg @@A_more_B ;a>b goto @@A_more_B
jl @@A_less_B ;a<b goto @@A_less_B
;================== a = b ==================
mov ax,25
jmp short @@Exit
;================== a < b ==================
@@A_less_B:
cmp ax,0 ;сравнение a~0
JE @@ERROR ;a=0 goto @@ERROR
mov ax,bx ;<ax>=b
CWD
IDIV a ;<ax>=<dx:ax>/a
ADC ax,1 ;<ax>=b/a+1
JC @@ERROR_perepoln
jmp short @@Exit
;===================a > b ==================
@@A_more_B:
cmp bx,0 ;сравнение b~0
JE @@ERROR ;b=0 goto @@ERROR
Imul a ;<dx:ax>=a*a
cmp dx,0 ;сравнение <dx>~0
JNE @@ERROR_perepoln ;Переполнение при знаковом умножении
Imul a ;<dx:ax>=a*a*a
sub ax,5 ;<ax>=<ax>-5
sbb dx,00000h
Idiv bx
JC @@ERROR_perepoln ;<ax>=(a*a*a-5)/b
jmp short @@Exit
;=============== Деление на ноль =============
@@ERROR:
mov f,1
ret
;===Переполнение при 16-разрядном умножении ====
@@ERROR_perepoln:
mov f,2
ret
;============ Получение результата ===========
@@Exit:
mov y,ax
ret
;=========== Конец процедуры ================
lab4I endp
; <<<<<<<<<<<<<Данные БЕЗзнаковые!!!>>>>>>>>>>>>
public C lab4U
lab4U proc far
ARG a:WORD,b:WORD RETURNS y:WORD
mov f,0 ;ok!
mov ax,a ;<ax>=a
mov bx,b ;<bx>=b
cmp ax,bx ;сравнение a~b
jA @@A_more_B ;a>b goto @@A_more_B
jB @@A_less_B ;a<b goto @@A_less_B
;================== a = b ==================
mov ax,25
jmp short @@Exit
;================== a < b ==================
@@A_less_B:
cmp ax,0 ;сравнение a~0
JE @@ERROR ;a=0 goto @@ERROR
mov ax,bx ;<ax>=b
xor dx, dx
DIV a ; <ax>=<dx:ax>/a - ДЕЛЕНИЕ БЕЗЗНАКОВОЕ!!!!
ADC ax,1
JC @@ERROR_perepoln ;<ax>=b/a+1
jmp short @@Exit
;===================a > b ==================
@@A_more_B:
cmp bx,0 A ;сравнение b~0
JE @@ERROR
xor dx, dx ;a=0 goto @@ERROR
mul a ;<dx:ax>=a*a
cmp dx,0 ;сравнение <dx>~0
JNE @@ERROR_perepoln ;Переполнение при БЕЗзнаковом умножении
mul a ;<dx:ax>=a*a*a
SUB ax,5 ;<ax>=<ax>-5 (мл.часть)
sbb dx,00000h ;!!!!!!!! <dx>=<dx> +(ст.часть числа -5)
div bx
JC @@ERROR_perepoln ;<ax>=(a*a*a-5)/b - ДЕЛЕНИЕ БЕЗЗНАКОВОЕ!!!!
jmp short @@Exit
;=============== Деление на ноль =============
@@ERROR:
mov f,1
ret
;=============== Переполнение при 16-разрядном умножении =========
@@ERROR_perepoln:
mov f,2
ret
;=============== Получение результата =========
@@Exit:
mov y,ax
ret
;=========== Конец процедуры ================
lab4U endp
end |