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


Автор: Nortos 25.12.2010, 11:34
Написать (используя операцию побитового сдвига*) нахождение среднего
арифметического двух длинных чисел:
unsigned int* avg(unsigned int* a, const unsigned int* b, int size);
a = (a + b) >> 1; size_a = size_b

 * сдвиг осуществляется операцией shr


Помогите решить, задача будет оплачена

Автор: Игорь1024 25.12.2010, 12:02
Ничего себе я тогда написал...

Автор: vadimych 18.1.2011, 15:07
Я думаю, ни одна команда из кода Игоря1024 работать не будет. Если unsigned int - это тип dword, то 
Код

mov eax,a
add eax,b
shr eax,1
 .

Автор: JAPH 18.1.2011, 17:55
vadimych, там unsigned int* складываются ;)

Код

    push ebp
    mov  ebp, esp
    pusha
    mov  ecx, [ebp + 16] ; size
    mov  esi, [ebp + 12] ; second
    mov  edi, [ebp + 8] ; first
; считаем, что указатели указывают на младшие байты длинных целых
; далее решение о том, складывать побайтово или подвордово, должно приниматься на основании size
; что он означает? количество составляющих unsigned int? или количество байт?
; здесь предполагаем, что первый вариант
    clc
@1: lodsd
    adc  eax, [edi]
    stosd ; не хочу add edi, 4 из-за того, что надо сохранять флаги. в принципе, дело вкуса
    loop @1
    mov  ecx, [ebp + 16]
@2: pushf
    sub  edi, 4
    popf
    rcr  dword [edi], 1 ; shr обязательна? здесь rcr более удобна имхо
    loop @2
    popa
    mov  eax, [ebp + 8] ; return value
    leave
    ret


P.S. раскопали smile скоро месяц задаче

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