Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Работа с массивами


Автор: Hidalgo 29.12.2010, 22:04
Добре время суток, помогите в решение задачи, заранее спасибо: 

1 .Разработать процедуру Big2Sub (var M1, M2, Carry; len: word), где M1, M2 сверхбольшие целые положительные числа (байтовые массивы длиной len). Операция - М1 = М1-М2. Переменной байтового типа Carry присваивается значение 1 при наличии займа и 0 при ее отсутствии. Должны использоваться команды для 32-разрядных данных. Если значение len не кратно 4, то для вычитания последних байт использован команды для 8-разрядных данных. Считать, что М1, М2 i Carry находятся в одном сегменте.


вот сделал почти процедуру, но не могу понять куда надо прописать переменную 
Код


Carry




что бы присвоить значение 1 при наличии займа и 0 при ее отсутствии....

подскажите пожалуйста
вот сама процедура:
Код

.386
 
;M1-M2                                         
_Text segment PARA PUBLIC 'Code' USE16
 
Big2Sub PROC far
                PUBLIC Big2Sub 
                        
        ASSUME  cs:_Text,ds:_Text,es:_Text
            
             ; prolog
        push bp
                                mov bp,sp
                                add bp,6
                                ; konets prologa
 
                                lds si,[bp+2]         ;  M2
                                les di,[bp+6]         ;  M1
 
                                mov AX,word ptr [bp] ;v AX znacheniya len
 
                                mov BX,4
                                div BL               ;частка в AL, остача в AH 
                                mov BX,AX            ;частка в ВL, остача в ВH
                                
                                xor CX,CX
                                mov CL,AL            ;к1льк1сть 1терац1й в1дн1мання по 4 байта
                                CLC                  ;скидання флага переносу
                                CLD                  ;скидання флага напряму        
                                
                                
                        @sub:
                                LODSD                ;4 байта 1з M2 записуємо  в EAX  
                                sbb es:dword ptr [di],EAX                ; M1 - M2 - CF
                           
                                        
                                add di,4             ; збўльшуємо змўщення на 4 байта  
                                dec cx
                        jnz  @sub       
                                 
                                mov CL,BH            ;к1льк1сть 1терац1й в1дн1мання по 1 байту
                        or cl,cl
                        JZ end
 
                 
                        @sub2:
                                 LODSB               ;1 байт ўз M2 записуємо  в AL  
                                 sbb es:byte ptr [di],AL                 ;M1 - M2 - CF
                                 inc di              ;зб1льшуємо зм1щення на 1 байт      
                                 dec cx       
                        jnz @sub2
 
                        end:
                                  ;epilog    
        pop bp
        
        ret 10
Big2Sub endp
 
_Text ends                          ; konets segmenta             
end


Автор: iff 29.12.2010, 22:55
Инструкция SBB устанавливает флаг CF, если перенос был.

Автор: Hidalgo 15.2.2011, 01:22
Код

.386

;M1-M2

_Text segment PARA PUBLIC 'Code' USE16

Big2Sub PROC far
         PUBLIC Big2Sub
    ASSUME  cs:_Text
         ; prolog
        push bp
        mov bp,sp
        add bp,6    ;bp + адрес повернення
        pusha
         

            Len    EQU    [bp]
            p_Carry    EQU    bp+2
            p_M2    EQU    bp+6
            p_M1    EQU    bp+10

                ;M1 M2 Carry лежать в одному сегмент?, тому
                lds si,[p_M2]
                les di,[p_M1]

                    mov AX,Len        ;в AX значення len
                    mov BX,4
                    div BL               ;частка в AL, остача в AH
                    mov CX,AX            ;частка в CL, остача в CH
                    CLC                  ;скидання флага переносу
                    CLD

                ;в CH к?льк?сть ?терац?й в?дн?мання по 4 байта
                @sub:
                    LODSD                ;4 байта ?з M2 записуємо  в EAX
                    sbb es:dword ptr [di],EAX                ; M1 - M2 - CF


                inc di             ; зб?льшуємо зм?щення на 4 байта  (add зм?нює CF)
                inc di
                inc di
                inc di

                    dec cl
                
                jnz  @sub

                    mov CL,BH            ;к?льк?сть ?терац?й в?дн?мання по 1 байту
                inc ch

                @sub2:
                dec ch
                jz _end

                    LODSB               ;1 байт ?з M2 записуємо  в AL
                    sbb es:byte ptr [di],AL                 
                    inc di              ;зб?льшуємо змўщення на 1 байт
                jmp @sub2

                _end:
                    lds di,[p_Carry]
                    
                ; для передачи значения в Carry
                    jc neg_M1
                        mov byte ptr [di],0
                    jmp _epilog
                    neg_M1:
                        mov byte ptr [di],1

                _epilog:

        popa
    pop bp
    
        ret 14
Big2Sub endp

_Text ends 
end

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)