← All posts tagged asm

Когда вижу вот такое, я понимаю, что когда-то я был гениален:

CalcMULAB MACRO BA, BB, NH, NL
    IntCalcMULAB BA, BB, NH, NL, %(NH+1), %(NH+2), %(NH+3), %(NH+4)
ENDM            
IntCalcMULAB MACRO BA, BB, NH, NL, NH1, NH2, NH3, NH4
    MULAB BA, BB
    IF NL<>-1
    ADD A, Calc&NL
    MOV Calc&NL, A
    ENDIF       
    MOV A, Calc&NH
    IF NL<>-1   
    ADDC A, B   
        ELSE    
        ADD  A, B
    ENDIF           
    MOV Calc&NH, A
    IF NH<4
        MOV A, Calc&NH1
        ADDC A, #0
        MOV Calc&NH1, A
        IF NH<3
            MOV A, Calc&NH2
            ADDC A, #0
            MOV Calc&NH2, A
            IF NH<2
                MOV A, Calc&NH3
                ADDC A, #0
                MOV Calc&NH3, A
                IF NH<1
                    MOV A, Calc&NH4
                    ADDC A, #0
                    MOV Calc&NH4, A
                ENDIF
            ENDIF
        ENDIF
    ENDIF
ENDM
MULAB MACRO BA, BB
    MOV A, BA
    MOV B, BB
    MUL AB
ENDM

asm

Самая кавайная ошибка, которую видел, это проверку на ноль двурегистрового числа вида:
MOV A, LowPart
ADD A, HighPart
JZ DoIfZero
отлаживать потом — настоящее наслаждение

Кстати, еще тупой вопрос, как на сях в embedded пишутся вычисления без потери точности с фиксированной точкою?
Например, есть число: 10A.0*A.0 = A64.00
Прикол в том, что результат ДО отброса лишнего нуля не влезает в 16 бит...

asm

При использовании условных переходов, метки ухода по "не надо делать" можно ставить трёх типов: метка, говорящая, что НЕ делается, метка, говорящая о конце того, что ДЕЛАЛОСЬ, или метка, которая показывает, что БУДЕТ делаться дальше.
Какие ставите вы?