- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
.MODEL small ;отводим под стек и под данные по 64Кб код занимает 1 сегмент, данные и стек обьеденены в одну группу
.STACK 100h ;отмечаем начало сегмента стека
.DATA ;отмечаем начало сегмента данных
_STDOUT_ equ 1 ; из синтаксического описания видно, что с помощью equ идентификатору
;можно ставить в соответствие как числовые выражения, так и текстовые строки,
;а псевдооператор “=” может использоваться только с числовыми выражениями;
vivod db 0Dh, 0Ah, '$' ; $-кон. стр.
String db 82 dup(?); выделение памяти для строки
PosLen db 14 dup(?); выделение памяти для строки (числа)
Pos dw ? ; память для первого числа
Len dw ? ; для второго
.CODE ;отмечаем начало сегмента кодов
preob proc ; процедура преобразования из строки в число
xor ax, ax
mov bx, ax
mov cx, 10 ; для реализации цикла
_repeat:
mov bl, [si] ; помещаем в bl символ строки
inc si ; в si переходим к ячейке следующего символа
sub bl, '0'; преобразуем ASCII код в число
jb _break ; если SF = 1 то выходим из процедуры(указывает, что между числами стоит пробел, числовой код пробела меньше числового кода нуля)
cmp bl, 9 ; сравниваем, если число больше 9 - то это символ - идём на выход
ja _break
mul cx
add ax, bx ;прибавляет в регистр ax нужное число
jmp _repeat
_break:
ret ; возврат в в главный код
preob endp
main PROC
;инициализация сегментного регистра ds адресом сегмента данных
mov ax, @data
mov ds, ax
;ввод строки
mov [String], byte ptr 80
mov ah, 0Ah
lea dx, [String]
int 21h
;ввод строки чисел
mov al,10 ; перенос строки
int 29h ; быстрый вывод символов на экр(экон байт)
mov [PosLen], byte ptr 14
mov ah, 0Ah
lea dx, [PosLen]
int 21h
;преобразование строки в первое число
lea si, [PosLen+2]
call preob
mov [Pos], ax
call preob
mov [Len], ax
mov al,10 ; перенос строки
int 29h ; быстрый вывод символов на экр(экон байт)
mov ah, 40h ;номер функции помещается в ah
mov bx, _STDOUT_ ;в bx хранится дескриптор стандартного выходного потока
mov cx, [Len] ; кол-во выводимых символов
lea dx, [String+1] ; адрес буфера вывода
add dx, [Pos] ; берем 1 сим. и добавляем число, чтобы перейти к нужному нам символу
int 21h
;завершение программы
xor ax,ax
int 16h
mov ax,4c00h
int 21h
MAIN ENDP
END MAIN