Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Определяем стек
- STACKSG SEGMENT PARA STACK 'Stack'
- DB 100 DUP(?) ;Задаем размер стека
- STACKSG ENDS
- DECIMAL_SIZE EQU 5
- DATA SEGMENT ;Описание сегмента данных
- array db -1,2,-3,4,-5; элементы массива
- zero db 0
- sum db 0
- MESSAGE db "Result is $" ;Текст сообщения
- NR db 0AH,0DH,'$' ;Текст перевода строки
- RESULT db DECIMAL_SIZE DUP('0');Буфер для перевода цифры в десятичную строку
- DATA ENDS
- CODE SEGMENT ; Описание сегмента кода
- ASSUME CS:CODE,DS:DATA,SS:STACKSG ; Директива настройки сегментных регистров
- PRINT PROC near ;Печать числа в AX на терминал
- ;Вход в процедуру
- PUSH BP ;Сохранение старой базы автоматических
- ;переменных
- MOV BP,SP ;Установка новой базы на вершине стека
- SUB SP,DECIMAL_SIZE+1 ;Выделение памяти для буфера
- ;(верхушку стека сдвигаем на размер буфера)
- MOV CX,DECIMAL_SIZE ;Количество символов в новой строке
- DEC BP ;Перевести базу на символ ниже (BP=BP-1)
- MOV [BP], BYTE PTR '$' ;Занести в буфер символ конца строки
- MOV BX,10 ;База для перевода числа в десятичное
- NEXT_C: DEC BP ;Вычисление адреса предыдущего символа
- XOR DX,DX ;Обнуление регистра DX (расширение операнда для деления)
- DIV BX ;Деление на 10 (BX=10)
- ADD DL, '0' ;Превращение остатка от деления в соответствующий символ
- MOV [BP],DL ;Запись символа в буфер
- DEC CX ;Декремент счетчика буфера
- JNZ NEXT_C ;Переход если не ноль
- MOV AH,09 ;выводим на экран сообщение
- LEA DX, MESSAGE ;загрузка адреса
- INT 21h ;вызов прерывания
- MOV DX, BP ;выводим на экран result
- PUSH DS ;Сохранение в стеке значение сегментного регистра
- MOV AX,SS ;Передача нового значения DS=ES
- MOV DS,AX ;DS:DX должен адресовать строку
- MOV AH,09 ;
- INT 21h ;
- POP DS ;Востанавливаем старое значение DS
- LEA DX, NR ;Переводим строку
- MOV AH,09
- INT 21h
- ;Выход из процедуры
- ADD SP,DECIMAL_SIZE+1 ;Освобождаем автоматическую память в стеке
- POP BP ;Востанавливаем старое значение базы
- ;автоматических переменных
- RET ;Возврат из процедуры
- PRINT ENDP
- START:
- MOV AX, DATA ; загрузить в DS
- MOV DS, AX ;селектор сегмента данных
- LEA BX, ARRAY ; загрузить в BX начальный адрес массива
- MOV CX, 5 ; инициализировать счетчик
- CYCLE:
- mov al,[bx] ; поместили i'й элемент в аккум
- cmp al,zero ; сравнили с 0
- JG BE ; если выражение больше 0, то переходим к be
- NEG AL ; инвертируем знаковое число
- BE:
- ADD sum, AL ; выполняем сложение
- INC BX ; перейти к следующему элементу массива
- LOOP CYCLE ; проверка на выход из цикла (--CX при CX=0)
- JMP EXIT
- EXIT:
- MOV AL,sum
- MOV AH,0
- CALL PRINT ;вызов процедуры принт
- xor AL,Al
- mov AH,4ch
- int 21h
- CODE ENDS
- END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement