Найти сумму первых К отрицательных элементов массива - 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