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