Advertisement
Guest User

Untitled

a guest
Oct 25th, 2014
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;Определяем стек
  2. STACKSG SEGMENT PARA    STACK   'Stack'
  3.         DB      100    DUP(?)  ;Задаем размер стека
  4. STACKSG ENDS
  5.  
  6. DECIMAL_SIZE EQU 5
  7.  
  8. DATA SEGMENT    ;Описание сегмента данных
  9.           array db -1,2,-3,4,-5; элементы массива
  10.       zero db 0
  11.       sum db 0
  12.           MESSAGE       db "Result is $"        ;Текст сообщения
  13.         NR              db 0AH,0DH,'$'          ;Текст перевода строки
  14.         RESULT          db DECIMAL_SIZE DUP('0');Буфер для перевода цифры в десятичную строку
  15. DATA ENDS
  16.  
  17.  
  18. CODE SEGMENT    ; Описание сегмента кода
  19. ASSUME CS:CODE,DS:DATA,SS:STACKSG ; Директива настройки сегментных регистров
  20.         PRINT   PROC    near            ;Печать числа в AX на терминал
  21.                                         ;Вход в процедуру
  22.         PUSH    BP                      ;Сохранение старой базы автоматических
  23.                                         ;переменных
  24.         MOV     BP,SP                   ;Установка новой базы на вершине стека
  25.         SUB     SP,DECIMAL_SIZE+1       ;Выделение памяти для буфера
  26.                                         ;(верхушку стека сдвигаем на размер буфера)
  27.  
  28.         MOV     CX,DECIMAL_SIZE         ;Количество символов в новой строке
  29.         DEC     BP                      ;Перевести базу на символ ниже (BP=BP-1)
  30.         MOV     [BP], BYTE PTR '$'      ;Занести в буфер символ конца строки
  31.         MOV     BX,10                   ;База для перевода числа в десятичное
  32.  
  33. NEXT_C: DEC BP                          ;Вычисление адреса предыдущего символа
  34.         XOR DX,DX                       ;Обнуление регистра DX (расширение операнда для деления)
  35.         DIV BX                          ;Деление на 10 (BX=10)
  36.         ADD DL, '0'                     ;Превращение остатка от деления в соответствующий символ
  37.         MOV [BP],DL                     ;Запись символа в буфер
  38.         DEC CX                          ;Декремент счетчика буфера
  39.         JNZ NEXT_C                      ;Переход если не ноль
  40.  
  41.         MOV     AH,09                   ;выводим на экран сообщение
  42.         LEA     DX, MESSAGE             ;загрузка адреса
  43.         INT     21h                     ;вызов прерывания
  44.        
  45.         MOV     DX, BP                  ;выводим на экран result
  46.         PUSH    DS                      ;Сохранение в стеке значение сегментного регистра
  47.         MOV     AX,SS                   ;Передача нового значения DS=ES
  48.         MOV     DS,AX                   ;DS:DX должен адресовать строку
  49.         MOV     AH,09                   ;
  50.         INT     21h                     ;
  51.         POP     DS                      ;Востанавливаем старое значение DS
  52.         LEA     DX, NR                  ;Переводим строку
  53.         MOV     AH,09
  54.         INT     21h
  55.                                         ;Выход из процедуры
  56.         ADD     SP,DECIMAL_SIZE+1       ;Освобождаем автоматическую память в стеке
  57.         POP     BP                      ;Востанавливаем старое значение базы
  58.                                         ;автоматических переменных
  59.         RET                             ;Возврат из процедуры
  60. PRINT   ENDP
  61.     START:
  62.         MOV AX, DATA                    ; загрузить в DS
  63.         MOV DS, AX                      ;селектор сегмента данных
  64.         LEA BX, ARRAY                   ; загрузить в BX начальный адрес массива
  65.         MOV CX, 5                       ; инициализировать счетчик  
  66.                  
  67.     CYCLE:
  68.         mov al,[bx]                     ; поместили i'й элемент в аккум
  69.         cmp al,zero                     ; сравнили с 0
  70.         JG BE                           ; если выражение больше 0, то переходим к be
  71.         NEG AL                          ; инвертируем знаковое число
  72.                  
  73.     BE:  
  74.         ADD sum, AL                     ; выполняем сложение
  75.         INC BX                          ; перейти к следующему элементу массива
  76.         LOOP CYCLE                      ; проверка на выход из цикла (--CX при CX=0)
  77.         JMP EXIT
  78.                  
  79.     EXIT:  
  80.         MOV AL,sum                     
  81.         MOV AH,0                       
  82.          
  83.         CALL PRINT                      ;вызов процедуры принт                          
  84.         xor AL,Al
  85.         mov AH,4ch
  86.         int 21h
  87. CODE ENDS
  88. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement