; Tomas Skala, skalat2, Ct9:15 ; Uloha 2, 66b, verze pro 80286, svina-verze .286 .model tiny .data .code org 100h start: xor CX, CX push CX ; kvuli prvnimu zavolani beg: Write: ; vypis HEX cisla v zavorkach z SI jcxz null ; pokud neni v bufferu zadne cislo k tisknuti skoc na beg: (null vynuluje registry pri startu) mov CX, 5 mov AL, '(' ; prvni zavorka Wloop: int 29h rol SI,4 ; chceme horni ctyri bity, zarotujeme si je uplne vespod mov AX, SI ; nechceme znicit SI, pracovat budeme tedy s AX and AL, 0fh ; a pouze se spodnimi 4mi bity; daa ; pokud AL>09 => AL:=AL+6 add AL, -10h ; jestlize je AL>=10h (daa pricetlo 6), je nutne pricist 1 => tento radek plni carry adc AL, 40h ; pricti 30h + 10h (z pred. radku) + c ; aam ; pokud je AL>=10 pak AH=1 AL-=10 ; db 0D5h, 11h ; aad 17 ; pokud je AH=1 pak AL+=17 - jedna se o vypis ABCDEF ; add AL, '0' loop Wloop ; opakuj 4x pro 4cislice (popate se sice provede vypocet, ale nevypise se) mov AL, 'h'; ; tisk "h)" int 29h mov AL, ')'; int 29h null: xor SI, SI ; vynuluj buffer pri startu a pri kazdem vypsani cisla beg: pop AX ; obnoveni posledniho stisknuteho znaku int 29h mov AH, 08h ; cekani na zmacknuti klavesy int 21h cmp AL, 27 ; jestlize ESC => ukonci program jz k push AX ; uloz klavesu pro pozdejsi vytisknuti sub AL, '0' mov BX, 10 db 3Ah ; cmp AL, BL ; pokud byla v AL cislice ('0'..'9'), pak cmp naplni Carry k:ret jnc Write ; pokud neni, zkus vypsat buffer cbw ; je potreba vynulovat AH (AL=<0,9> => AH=00) xchg AX, SI ; 4 radky = SI:=SI*10+AL mul BX add AX, SI xchg AX, SI loop beg ; nastav priznak CX a skoc na beg end start