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:
Объяснение кода листинга программы
Test- проверка регистра AX на нольJns- переход на меткуpositiv, если AX не равен нулюNegativ- начало цикла, который будет выполняться, пока AX не станет равным нулюInc- увеличение значения AX на единицуCmp- сравнение значения AX с нулемJl- переход на меткуnegativ, если AX меньше нуляJg- переход на меткуpositiv, если AX больше нуляDec- уменьшение значения AX на единицуCmp- сравнение значения AX с нулемJl- переход на меткуnegativ, если AX меньше нуляJg- переход на меткуpositiv, если AX больше нуляDec- уменьшение значения AX на единицуCmp- сравнение значения AX с нулемJl- переход на меткуnegativ, если AX меньше нуляJg- переход на меткуpositiv, если AX больше нуляDec- уменьшение значения AX на единицуCmp- сравнение значения AX с нулемJl- переход на меткуnegativ, если AX меньше нуляJg- переход на меткуpositiv, если AX больше нуляPositiv- конец цикла и вывод суммы положительных чисел в регистре AX