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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д