model small определили модель памяти как small stack 128 выделили под

  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
.model small ;определили модель памяти как small
.stack 128 ;выделили под программу 128 байт памяти
.data ;объявили сегмент данных
err db ' error!',13,10,'$' ;определили переменную типа databyte размером 1 байт
.code ;объявляем сегмент кода
;____________________________________
ax_out proc uses dx cx ; Outputs AX
;____________________________________
.code
push ax
mov ah,02h ; 02 stands for the 21􀀀th interrupt argument
; meant to output a character
mov cx, 12d ; shift
; we divide a 16 bit number on 4 parts, 4 bits each
; each part corresponds to a HEX digit
; to output the first part we shift initial value
; 12 binary digits to the right
mainloop:
; we output 3 hex digits first, then the last one outside the loop
pop dx ; copy dx to the top of the stack
push dx
shr dx,cl
and dl, 0Fh ; now dl is equal to one of hex digits
cmp dl, 10d ; dl = 0...9-> the corresponding symbol code differs by 30h
jge add_37h ; dl = 10...15 -> the corresponding code differs by 67h
add dl, 030h
jmp print_4
add_37h:
add dl, 037h
print_4:
int 021h
sub cx,3 ; cx is decreased by 3 then decreased by 1 by the 'loop' command
; so initial value was 12, then 8, then 4, then 0
loop mainloop
; output the last digit
pop dx
push dx
and dl, 0fh
cmp dl, 010d
jge add_37h_last
add dl, 030h
jmp print_last
add_37h_last:
add dl, 037h
print_last:
int 021h
pop ax
ret
ax_out endp
begin:
mov bp,sp ;запомнили значение указателя стека
main:
mov ah,01h ;считываем введенный символ в al
int 021h
mov ah, 0h
cmp al,'q' ;сравниваем введенный символ с кодом символа q
jz quit ;если введенный символ q, то переход к метке quit
cmp al,'p' ;сравниваем введенный символ с кодом символа p
jz show ;если введенный символ q, то переход к метке show
cmp al,'+' ;сравниваем введенный символ с кодом символа +
jz addition ;если введенный символ +, то переход к метке addition
cmp al,'-' ;сравниваем введенный символ с кодом символа -
jz subtraction ;если введенный символ +, то переход к метке subtraction
cmp al,030h ;сравниваем введенный символ с кодами символов 0,9
jl error
cmp al,039h
jg error ;если код символа <=39h или >=30h
sub al,030h ;то преобразовываем код символа в число, которое он обозначает
push ax ;и записываем значение в стек
jmp main
error: ;вывод сообщение об ошибке
mov ax,@data
mov ds,ax
lea dx,err
mov ah,009h
int 021h
jmp main
addition: ;обработка +
cmp sp,07dh ;проверяем количество элементов в стеке
jg error ;если менее двух, то ошибка
mov ax, 0h ;обнуляем ax
pop ax ;достаем 1
pop dx ;достаем 2
add ax, dx ;складываем
call ax_out ;выводим сумму на экран
push ax ;помещаем сумму в стек
jmp main
subtraction: ;обработка -
cmp sp,07dh ;проверяем количество элементов в стеке
jg error ;если менее двух, то ошибка
mov ax, 0h ;обнуляем ax
pop dx ;достаем 1
pop ax ;достаем 2
sub ax, dx ;складываем
call ax_out ;выводим сумму на экран
push ax ;помещаем сумму в стек
jmp main
show:
cmp sp,bp ;проверяем стек на пустоту
jz error
pop ax
call ax_out
push ax
jmp main
quit:
mov sp,bp ; восстанавливаем значение указателя стека тем самым очищая стек;
mov ah,04ch ;корректно завершаем работу программы
int 021h
end begin