TASM: найти сумму положительных элементов массива двухбайтовых знаковых чисел - Assembler

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

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

данная программа считает сумму ненулевых элементов массива однобайтовых чисел без знака и результат записывает в файл, помогите переделать чтоб считало сумму положительных элементов массива двухбайтовых знаковых чисел.
masm
model small
.386
.stack 100h
.data
count db 10
mas dw 10,0,11,5,44,13,0,0,3,1; сумма 87
fileName db "result.txt",0
Result db 3 dup(?),'$'
sum dw ?
.code
;----------------
Output proc
push    -1  ;Сохраним признак конца числа
    mov cx,10   ;Делим на 10
Loop11: mov dx,0    ;Очистим регистр dx (xor dx,dx - оптимальнее)
    div cx  ;Делим 
    push    dx  ;Сохраним цифру
    cmp ax,0    ;Остался 0? (оптимальнее or ax,ax)
    jne Loop11  ;нет -> продолжим
    mov ah,2h
loop22: pop dx  ;Восстановим цифру
    cmp dx,-1   ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex}
    je  exit1
    add dl,'0'  ;Преобразуем число в цифру
    int 21h ;Выведем цифру на экран
    jmp loop22 ;И продолжим  
exit1:mov ah, 01h
int 21h
cmp al,  0dh
jne exit1
ret
Output endp
;-------------
 
start:
mov ax, @data
mov ds, ax
xor bx,bx 
mov si,0
loop_1:
cmp si,20
je end_loop
cmp mas[si],0
je l
jne l2
l: add si,2
jmp loop_1
l2:
add bx,mas[si]
add si,2
jmp loop_1
end_loop:
mov sum,bx
mov ax,bx
;call Output

mov ah, 3Ch
xor cx, cx
xor bx,bx
mov dx, offset fileName
int 21h  
mov bx,ax;сохранение дескриптора файла
 
mov ax, sum
mov cl, 10
div cl
add al, 30h
add ah, 30h
mov [Result], al
mov [Result+1], ah
 
mov ah, 40h 
mov cx, 2   
lea dx, Result 
int 21h
 
mov ah, 3Eh 
int 21h
mov ax, 4c00h
int 21h
end start

Решение задачи: «TASM: найти сумму положительных элементов массива двухбайтовых знаковых чисел»

textual
Листинг программы
test ax,ax
jns positiv
negativ:

Объяснение кода листинга программы

  1. Test - проверка регистра AX на ноль
  2. Jns - переход на метку positiv, если AX не равен нулю
  3. Negativ - начало цикла, который будет выполняться, пока AX не станет равным нулю
  4. Inc - увеличение значения AX на единицу
  5. Cmp - сравнение значения AX с нулем
  6. Jl - переход на метку negativ, если AX меньше нуля
  7. Jg - переход на метку positiv, если AX больше нуля
  8. Dec - уменьшение значения AX на единицу
  9. Cmp - сравнение значения AX с нулем
  10. Jl - переход на метку negativ, если AX меньше нуля
  11. Jg - переход на метку positiv, если AX больше нуля
  12. Dec - уменьшение значения AX на единицу
  13. Cmp - сравнение значения AX с нулем
  14. Jl - переход на метку negativ, если AX меньше нуля
  15. Jg - переход на метку positiv, если AX больше нуля
  16. Dec - уменьшение значения AX на единицу
  17. Cmp - сравнение значения AX с нулем
  18. Jl - переход на метку negativ, если AX меньше нуля
  19. Jg - переход на метку positiv, если AX больше нуля
  20. Positiv - конец цикла и вывод суммы положительных чисел в регистре AX

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


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

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

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