org 100h segment .text xor SI, SI ; v SI se bude tvorit císlo ktere budu vypisovat begin: mov AH, 8 int 21h ; klavesa -> AL cmp AL, 27 jz finish ; ESC -> konec cmp AL, '9' ja vyp_znak ; AL>'9' -> neni cislo -> skok na vyp_znak cmp AL, '0' jb vyp_znak ; AL<'0' -> neni cislo -> skok na vyp_znak mov BL, 1 ; BX je switch jestli uzivatel zadal pred aktualnim znakem cislo push AX ; ulozime ASCII cisla mov AH, 00h sub AL, '0' push AX ; ulozim vlastni cislo 0..9 mov AX, SI shl AX, 3 shl SI, 1 add AX, SI ; AX <- SI * 10 pop SI add SI, AX ; SI <- AX + cislo z klavesnice pop AX ; nacte ASCII cisla pro vypis jmp vyp_AL vyp_znak: cmp BX, 0 ; vypisovala se sekvence cislic? jnz vypisSI ; ano - vypis cislo z registru SI v hexa vyp_AL: int 29h ; vypis co je v AL jmp begin vypisSI: push AX ; ulozim ASCII znaku, ktery je po cislu mov AH, 9 mov DX, Zac int 21h ; ' (' ;VYPIS SI V HEXA ;--------------- mov CX, 4 ; budu cyclovat po 4 next: mov AX, SI call rotaceAX ; rotace AX o CX se zachovanim CX shr AX, 12 ; vypis od nejvyssiho radu cmp AL, 10 ; jb num1to9 ; AL < 10? - staci pricist k cislici '0' add AL, 7 ; ne - musim pricist jeste 7 znaku mezi '9' a 'A' num1to9: add AL, '0' int 29h ; vypise znak v AL loop next ; mame 4 hexa cifry mov AH, 9 mov DX, Kon int 21h ; 'h) ' xor BX, BX ; vynuluj switch xor SI, SI ; vynuluj nove cislo pop AX ; nacti ASCII znaku po cislu jmp vyp_AL finish: ret rotaceAX: push CX ; udelam rol AX, (16-4*CX) shl CX, 2 ; CX <- CX * 4 neg CX add CX, 16 ; CX <- 16 - CX rol AX, CL ; rotovani o CL pop CX ; puvodni CX pred rol ret Zac db ' ($' Kon db 'h) $'