; Да се напише подпрограма, която да връща в регистри RDX:RAX абсолютната ; стойност (модула) на разликата между двойните думи със знак, подадени в ; регистри RCX:RDX и RSI:RDI. option prologue:none, epilogue:none .code absd128 proc _absd128 proc SUB RDX,RDI ; Извади младшите SBB RCX,RSI ; и старшите думи .if (less?) NEG RDX ; O = 0, S = 1 или O = 1, S = 0: модулът < 0 ADC RCX,0 ; - смени му знака NEG RCX .endif XCHG RAX,RDX MOV RDX,RCX ; Върни абсолютната стойност в RDX:RAX RET ; Канонично решение: ; CMP RCX,RSI ; Сравни старшите думи ; .if (less? || equal? && RDX < RDI) ; XCHG RCX,RSI ; Умаляемото < умалителя: размени старшите ; XCHG RDX,RDI ; и младшите думи на числата ; .endif ; SUB RDX,RDI ; Извади младшите ; SBB RCX,RSI ; и старшите думи ; XCHG RAX,RDX ; MOV RDX,RCX ; Върни абсолютната стойност в RDX:RAX ; RET _absd128 endp absd128 endp end