Мелкие задачки для крупных мозгов №27

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 28 июн 2006.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Продолжая тему задачки 26.



    Есть два прямоугольника(двумерные множества) с целочисленными неотрицательными координатами в диапазоне от 0 до 2^32-1. Указатель на первый прямоугольник находится в регистре ESI, а на второй - в регистре EDI. Каждая координата занимает двойное слово, и у обоих прямоугольников они расположенны в порядке X1,Y1,X2,Y2. Причем X1<=X2, а Y1<=Y2. Размеры прямоугольника можно вычислить так: SX=X2-X1, SY=Y2=Y1. S=SX*SY - площадь прямоугольника. Необходимо написать 3 функции, которые вычисляют площади фигур, получающихся при выполнении операций объединения, пересечения и симметричной разности. Результат необходимо поместить в регистры EDX:EAX.



    Пример:

    A=RECT(1,1,3,3)

    B=RECT(2,2,4,4)

    Площадь объединения=7.

    Площадь пересечения=1.

    Площадь сим.разности=6.



    Здесь тоже как обычно всё делаем без переходов.
     
  2. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    процедура нахождения пересечения, результат в eax. сохранение используемых регистров не производится.

    главная идея - использования команд условной пересылки CMOVcc. еси работает(вечером потестирую) то чтото больно просто получается... интел за нас решила проблему с переходами)))



    conj proc

    mov eax,[esi+8]

    cmp eax,[edi+8]

    cmovnc eax,[edi+8]



    mov ebx,[esi]

    cmp ebx,[edi]

    cmovc ebx,[edi]



    xor edx,edx

    sub eax,ebx

    cmovnc edx,eax



    mov eax,[esi+12]

    cmp eax,[edi+12]

    cmovnc eax,[edi+12]



    mov ebx,[esi+4]

    cmp ebx,[edi+4]

    cmovc ebx,[edi+4]



    xor ecx,ecx

    sub eax,ebx

    cmovnc ecx,eax



    mov eax,edx

    mul ecx

    ret

    conj endp



    объединение. результат в eax



    un proc

    mov eax,[esi+8]

    sud eax,[esi]

    mov edx,[esi+12]

    sub edx,[esi+4]

    mul edx

    mov ebx,eax



    mov eax,[edi+8]

    sud eax,[edi]

    mov edx,[edi+12]

    sub edx,[edi+4]

    mul edx



    add ebx,eax

    call conj

    sub ebx,eax

    mov eax,ebx

    ret

    un endp



    симметрическая разность.результат в eax

    sr proc

    call un

    mov eax,ecx

    call conj

    sub ecx,eax

    mov eax,ecx

    ret

    sr endp
     
  3. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    тут прикинул что вызов процедуры это тоже переход.. скитайте что это макросы)