Найти сумму первых К отрицательных элементов массива - Assembler
Формулировка задачи:
Листинг программы
- model small
- .data
- mas db -12, 2, 7, 3, -2, 0, 21, -9, 0, 16 ;исходный массив
- len dw $-mas ;размер массива в байтах
- .stack 256
- .code
- Show_ax PROC
- mov cx, 10
- xor di, di ; di - кол. цифр в числе
- ; если число в ax отрицательное, то
- ;1) напечатать '-'
- ;2) сделать ax положительным
- or ax, ax
- jns @@Conv
- push ax
- mov dx, '-'
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- pop ax
- neg ax
- @@Conv:
- xor dx, dx
- div cx ; dl = num mod 10
- add dl, '0' ; перевод в символьный формат
- inc di
- push dx ; складываем в стэк
- or ax, ax
- jnz @@conv
- ; выводим из стэка на экран
- @@Show:
- pop dx ; dl = очередной символ
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- dec di ; повторяем пока di<>0
- jnz @@show
- ret
- Show_ax ENDP
- start:
- mov ax, @data
- mov ds, ax
- lea bx, mas ;берём в bx адрес первого элемента
- mov cx, len ;счетчик цикла
- xor ax, ax
- cikl: cikl: mov ah, [bx]
- cmp ah, 0
- jns @Positive
- add al, ah
- @Positive:
- inc bx ;переходим к следующему элементу
- loop cikl
- cbw
- call Show_ax
- mov ax, 4c00h
- int 21h
- end start
Решение задачи: «Найти сумму первых К отрицательных элементов массива»
textual
Листинг программы
- ;-- Преобразование строки по адресу SI в знаковое число (до первого неверного символа) -------------
- ; Результат: AX - число (в случае переполнения = 32767 или -32767), DL - завершающий символ
- ; Меняет AX, BX, DX, SI
- StrToInt proc
- xor bx,bx ; bx = 0 - пока предполагаем, что у числа знака нет
- xor dx,dx ; dx = 0 - результат, пока будет в dx
- cmp byte ptr [si],'-' ; сравниваем первый символ с минусом
- jne @@nextchar ; если это НЕ минус, то перепрыгиваем
- inc bx ; если минус, помечаем, что число отрицательное (bx = 1)
- inc si ; и увеличиваем указатель на 1 (переходим к следующему символу)
- @@nextchar:
- lodsb ; читаем символ в al из ds:[si], si=si+1
- sub al,'0' ; преобразуем al в цифру
- cmp al,9 ; проверяем цифру
- ja @@badch ; прыгаем, если цифра не 0..9
- imul dx,dx,10 ; умножаем dx на 10
- jo @@overflow ; переходим, если произошло переполнение
- cbw ; ah = 0
- add dx,ax ; добавляем ax к dx
- jno @@nextchar ; переходим, если НЕ произошло переполнение
- @@overflow:
- ; Произошло переполнение
- mov dx,32767 ; dx = 32767
- @@badch:add al,'0' ; al = преобразуем обратно в символ (чтобы на выходе dl = завершающий символ)
- xchg ax,dx ; меняем местами dx и ax: ax = результат, dl = завершающий символ
- test bx,bx ; проверяем bx
- jz @@exit ; если bx = 0, знака нет, прыгаем
- neg ax ; иначе меняем знак
- @@exit: ret ; выходим из процедуры
- StrToInt endp
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д