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
.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