Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с массивами 
:(
    Опции темы
Hidalgo
Дата 29.12.2010, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 12.12.2010

Репутация: нет
Всего: нет



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

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


PM MAIL   Вверх
iff
Дата 29.12.2010, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



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


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
Hidalgo
Дата 15.2.2011, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 12.12.2010

Репутация: нет
Всего: нет



Код

.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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.