; Tomas Skala, skalat2, Ct9:15 ; Uloha 2, 69b, verze pro 8086 .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 CL, 4 mov AL, '(' ; prvni zavorka Wloop: int 29h rol SI, CL ; 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 dec bx dec bx jnz 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 xor CX, CX beg: pop AX ; obnoveni posledniho stisknuteho znaku int 29h bfirst: mov AH, 08h ; cekani na zmacknuti klavesy int 21h cmp AL, 27 ; jestlize ESC => ukonci program jz konec push AX ; uloz klavesu pro pozdejsi vytisknuti sub AL, '0' mov BX, 10 cmp AL, BL ; pokud byla v AL cislice ('0'..'9'), pak cmp naplni Carry 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 konec: ret end start