Массив: В масиве из 15 элементов найти сумму элементов от 4 до 9. - Assembler

Узнай цену своей работы

Формулировка задачи:

На практике работаем с ассемблером, но толком никто не объясняет ничего. Помогите, пожалуйста.

Задание: в масиве из 15 элементов найти сумму элементов от 4 до 9. Ввод массива с клавиатуры.

Понимаю, что задание не сложное. Но подскажите, пожалуйста, как сделать этот ручной ввод массива. Искала..но нашла без объяснений..и то мало. Не могу никак разобраться.

Решение задачи: «Массив: В масиве из 15 элементов найти сумму элементов от 4 до 9.»

textual
Листинг программы
;-------------------------- Steck field ----------------------
sseg     segment  stack 'stack' 
           db 128 dup(?)                          
sseg     ends                 
                        
;================Data field===============
dseg     segment 'data'        
   text0   db       'Find sum of elements of array from 2 to 7.',13,10, '$'                       
   text1   db    'Input the array:' ,13,10 , '$'
   text2   db    10,13,'Sum of elements of array from 2 to 7 equal to  $'  
      MAS  dw  10 dup (?)          
   Sum   dw    ? 
   Errstr db 10, 'String that was input is not  a number.' , 13, 10, 'Please, repeat a lead-in: $'                
   TEN  dw 10
 
;-------For derivation result converted  in ASCII ------
 
Num     dw  ?              ; Хранение переводимой переменной
StrNum  db 8 dup (?), '$' ; Хранение результата перевода
Negate  db ?              ; Флаг отрицательности (исп. только в процедуре перевода)
 
;------------For  input numbers from keyboard----------
 
NumPar  label byte    ; Структура для прерывания ДОС
MaxLen  db 8          ; Максимальная длинна поля ввода
ActLen  db ?          ; Длина введенной строки
NumFld  db 8 dup (?)  ; Строка
; -- For converting numbers from ASCII to binary ---
MulFact db 10         ; Фактор для умножения
SumTemp dw  ?          ; Результат перевода
 
 
 
 
; ------------------For check input numbers----------------
 
Good    db ?          ; Флажок правильности ввода числа   
   dseg     ends                                 
 
;==============Text of program============
 
cseg     segment 'code'                                  
            assume  cs:cseg, ds:dseg, ss:sseg    
  start proc far                             
          mov   ax, dseg                      
          mov   ds, ax                       
;-------------------------------------------------------------------
    lea DX, text0      ; Вызывается в случае ошибки
        call WrStr                   
    lea DX, text1     
        call WrStr                  
                  mov si, 0
                   mov cx, 10
    
m1:     call ReadChislo
        mov ax, Num
        mov mas[si], ax
        add si,2
        loop m1
 m2: 
mov si, 0
mov cx, 10     
  m3: mov ax, mas[si]
          cmp   ax, 2
          jnge  m4
          cmp   ax, 7
           jnle  m4
         
          add   Sum, ax 
 m4:     add si, 2
    loop  m3
 m5: mov ax, sum
         cbw
         mov num, ax       
 
 m6: 
         lea dx, text2
         call WrStr
         call strcon
         lea dx, strnum
         call WrStr
         mov   ah, 4Ch             
         int 21h                
  start  endp    
; ------------------------------------------------------------------
WrStr proc
        push ax
        mov  ah, 09h; Функция вывода строки на экран
        int  21h    ; Прерывание ДОС
        pop  ax
        ret     ; Возврат из процедуры
WrStr endp
; ------------------------------------------------------------------
ReadChislo proc
          push ax 
          push bx 
          push cx 
          push dx
          push si 
        xor cx,cx
        xor ax,ax
        xor bx,bx
        mov  Negate, 0
        mov ah, 01h 
        int 21h
        cmp al,'-'
        jne do_while
        mov Negate,1
        jmp end_while
do_while:
        cmp al, '0'
        jb err
        cmp al, '9'
        ja err  
        sub al,'0'
        cbw
        inc cx
        mov dx,ax
        mov ax,bx
        mov bx,dx
        xor dx,dx
        mul TEN
        add bx,ax
end_while:
        mov ah, 01h 
        int 21h
        jmp do_while
err:    
        cmp al,' '
        jne err2
        cmp cx,0
        je err2
        cmp Negate,0
        je end_num
        neg bx
end_num:
        mov Num,bx
        jmp end_proc
err2:
lea DX, errstr      ; Вызывается в случае ошибки
call WrStr        ; Выводит сообщение о повторе ввода
end_proc:   pop si 
        pop dx 
        pop cx 
        pop bx
        pop  ax
        ret          ; Возврат из процедуры
ReadChislo endp
 
StrCon proc
     push ax 
     push cx 
     push dx
     mov cx, 10 ; Фактор деления равен 10
     lea si, StrNum + 7; Последний символ строки вывода
     mov ax, Num        ; Заносим в ax число
     mov Negate, 0 ; Флаг отрицательности пока не 
                              ; установлен
     cmp ax, 8000h      ; Если старший бит установлен
     jb d10         ; то число отрицательно
     neg ax ; Возвращаем к положительной форме
     mov Negate, 1  ; Устанавливаем флаг отрицательности
 
d10:  cmp ax, 10        ; Если частное меньше 10 то 
                                   ;               прекратить цикл
         jb d20                ;            и начать рассмотрение знака
         cwd                   ; Иначе расширить знак (для деления)
         div cx                ; И разделить на фактор деления
         or dl, 30h           ; Перевести остаток в ASCII
         mov [si], dl       ; И записать в строку
         dec si                 ; Уменьший индекс
         jmp d10             ; И вернуться на начало цикла
 
d20:  or al, 30h          ; Перевести частное в ASCII
         mov [si], al       ; И занести в строку
 
         cmp Negate, 0 ; Если не был установлен флаг 
                                            ;отрицательности
         jz d30                ; То выйти из процедуры
        dec si                  ; Иначе еще раз уменьшить индекс
        mov byte ptr [si], '-'     ; И записать в него значок 
                                             ;минуса
d30:  pop dx
         pop cx 
         pop ax 
         ret                                ; Возврат из процедуры
StrCon endp
cseg ends      
                              end   start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы