tasm вычитание из отрицательных элементов массива

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by nuxster, 5 Oct 2012.

  1. nuxster

    nuxster New Member

    Joined:
    12 Jan 2011
    Messages:
    58
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток!
    Не могу разобраться как в асме работать с отрицательными числами. Есть у меня код
    Code:
    .model small
    .stack 200h ; Стек размером 512 байт
    .486		; Архитектура процессора
    
    .data
         a db 1,2,3,4,5,6,-85,10,-9,11					; Массив "a"
         b db -1,2,3,4,5,-6,-85,-10,-9,11,1,2,3,4,5,6,7,8		; Массив "b"
         
    	; Выводимые сообщение
    message db 'Sum of the positive elements of the first array: ','$'
    message2 db 'Sum of the positive elements of the second array: ','$'
    	 
    	 s1 db 13,10,'$'		; переход на новую строку
         n equ 10				; эквивалент
         p db '    ','$'        ;       
    	 
    .code
    
    start:
    ; Начальная инициализация
         mov ax,@data
         mov ds,ax		 
         xor ax,ax				; Обнуление регистра
         xor si,si
         mov cx,n
         xor bl,bl
         mov ax,3			;очистка экрана
         int 10h				;
         mov ah,9
         mov dx,offset message	; offset-смещение (загрузка в регистр адреса, а не значения)
         int 21h			; прерывание (21h-вывод одного символа на экран)
         xor ax,ax
    
    ; Основной алгоритм
    ; Обработка массива "а"
    label1:
          cmp a[si],0		; сравнивание, 
          jnl label2			; если "не меньше" то переход на label2
          inc si				; инкремент (+1)
          cmp si,n			; если si эквивалентно 10
          je c20			; то переходим к метке c20
          loop label1		; цикл
    label2:
          add al,a[si]
          inc si
          cmp si,n
          je c21
          loop label1
    ; Обработка массива "b"
    label3:
          cmp b[si],0
          jnl label4
          inc si
          cmp si,18
          je c20
          loop label3
    	  
    label4:
          add al,b[si]
          inc si
          cmp si,18
          je c21
          loop label3
     
    ;Вывод данных
    c22:
         xor ax,ax
         mov ah,9
         mov dx,offset message2
         int 21h
         xor ax,ax
         jmp label3
    c21:
         mov cx,10		; установка счетчика в 10
         lea si,p+3		; запись смещения 
    c20: 
         cmp ax,10
         jb c30		; если ax = 10, перейти к метке c30
         xor dx,dx
         div cx			; ax делится на cx результат сохраняется в ax
         or dl,30h		; увеличение кода ASCI на 30 для вывода цифр (правая часть)
    	 mov [si],dl
         dec si			; декремент (-1)
         jmp c20
    	 
    c30:
         inc bl			; инкремент
         or al,30h		; увеличение кода ASCI на 30 для вывода цифр (левая часть)
    	 mov [si],al
         lea dx,p
         mov ah,9		; функция вывода строки
         int 21h		; вывод на экран
         mov ah,9
         mov dx,offset s1
         int 21h
         xor ax,ax
         xor si,si
         mov cx,18
         cmp bl,1
         je c22
    	
    ; Выход из программы
    c25:
        mov ax,4c00h
        int 21h
    	
    end start
    он складывает положительные элементы в 2х массивах и выводит на экран. Мне необходимо, что бы максимальное полученное число (из суммы положительных) отнялось от всех отрицательных элементов.

    Вычисление положительных элементов у меня осуществляется конструкцией:
    Code:
     
    cmp a[si],0
    ...
    
    т.е. если элемент не меньше нуля то продолжается работа с ним.