1127 TITLE Ex6.ASM ;===== Inmatning av 1-4 (ASCII)HEX-tecken varefter ges. ;===== Efter konvertering ASCII -> HEX lagras tecknen i DX i ordning 1,2,3,4 ;===== Via rutinen Wr_Byte skrives tecknen p† nytt ut (1 byte i taget) ;===== Wr_Byte anropas 2 ggr om ett ord skall skrivas ;------------------------------------------------------------------------ CR EQU 0DH ;------------------------------------------------------------------------ CSEG SEGMENT ASSUME CS:CSEG,DS:CSEG ORG 100H Start: jmp Begin ;------------------------------------------------------------------------ ;==== L„s in tecken med eko Hex_In PROC NEAR mov dx,00h ;Nollst„ll registret Next_Char: mov ah,01h ;GetChar int 21h ;-------- Testa om ------------------------------------------------- cmp al,cr jz Avsluta ;------------------------------------------------------------------------- call Asc2Hex ;Konvertera ASCII -> HEX cbw ;Konvert Byte -> Word mov cl,04h ;F”rbered shift 4 ggr sal dx,cl ;Verkst„ll shiftet add dx,ax ;Spara AX i DX jmp Next_Char ;Ny inmatning Avsluta: ret Hex_In ENDP ;-------------------------------------------------------------------------- ;==== Konvertering ASCII -> HEX (Ingen test av tecken > 'F') Asc2Hex PROC NEAR cmp al,'F' ;Žr tecknet gement? jc Ej_gem ;Om inte hoppa ”ver maskningen and al,0dfh ;Om gemen maska med DFh Ej_gem: sub al,30h ;Om HEX, minska med 30h cmp al,0ah ;Žr tecknet < 0ah = 10d ? jc siffra ;Om s† hoppa ”ver subtr med 7 sub al,07h Siffra: ret Asc2Hex ENDP ;------------------------------------------------------------------------- ;==== Utskrift av Byte. Rutinen f”ruts„tter att aktuell Byte ;==== placeras i DL-registret innan anropet. Wr_Byte PROC NEAR mov ch,02h ;CH = NibbleR„knare Next_Nibble: mov cl,04h ;F”rbered shift 4 ggr rol dl,cl ;Hi nibble <-> Lo nibble mov al,dl ;Konvertering H2A med Hi ;Nibble i 1:a varvet and al,0fh ;Maska bort h”ga delen daa ;add 6 om 'A'-'F' !!! add al,0f0h ;Carry=1 om 'A'-'F' adc al,40h ;Klart ASCII-v„rde Skriv: push dx ;Spara ordet tillf„lligt mov dl,al ;Skriv ut mov ah,02h int 21h pop dx ;H„mta ordet dec ch ;R„kna ner nibble-r„knaren cmp ch,00h ;B†da nibblarna bearbetade? jnz Next_Nibble ;Om inte forts„tt ret Wr_Byte ENDP ;---------------------------------------------------------------------- ;===== LF f”r att kunna se skillnaden p† inmatning och utmatning lf PROC NEAR push dx mov dl,0ah mov ah,02h int 21h pop dx ret lf ENDP ;======================================================================= Begin: call Hex_In call LF Skriv_Hi: push dx ;Spara undan ordet mov dl,dh ;HiByte f”r utskrift cmp dl,00h ;HiByte = 0 - Skriv LoByte jz Skriv_Lo call Wr_Byte Skriv_Lo: pop dx ;H„mta ordet f”r utskrift ;av Lo-Byte call Wr_Byte ;Lo-Byte finns i DL ret ;----------------------------------------------------------------------- CSEG ENDS END Start ;======================================================================= . 0