Binary Number Output • To display a number in binary format, a program looks at each bit in the number and sends the ASCII equivalent of a ‘1’ (31h) or a ‘0’ (30h) to the screen using the DOS single character Int 21h function 2. – The 8-bit value E6h (1110 0110) would have 31h,31h,31h,30h,30h,31h,31h,30h Hex Number Output • To display the 8-bit value E6h as a HEX number, the ASCII codes for ‘E’(45h) and ‘6’(36h) would be sent using Int 21h, function 2. Procedure to Display Hex Digit Input: AL • Clear upper 4-bits of AL (should only have values 0-F) • Check AL for 0-9 (CMP AL,9) – (Add AL,30h if 0-9) • Must be Char if above 9 – (Add AL, 37h if char; 37h + 10d = 41h(‘A’)) • Use Int21h, function 2 to display char (DL holds char) Procedure to Display 1 Hex Digit Input: AL Out1hex proc And Cmp Ja Add Jmp Ischar: add Printit: Mov Mov Int Ret Out1hex endp al,0fh al,9 ischar al,30h printit al,37h dl,al ah,2 21h ;only want lower 4 bits of AL ;is 4 bit value above 9? ;convert to ascii digit '0' to '9' ;convert to ascii digit 'A' to 'F' ;print it using DOS single char output Procedure for CRLF • Use Int 21h, function 2 to display ASCII values for CR (0Dh), LF (0Ah). Pcrlf Pcrlf proc Mov Mov Int Mov Mov Int Ret endp ;print carriage return/line feed dl,0Dh ;carriage return ah,2 ;function # goes into AH 21h ;print it dl,0Ah ;line feed ah,2 ;function # 21h Irvine Library Procedures • Writeint – writes an unsigned 16-bit integer to standard output in ASCII binary, decimal, octal, or hexadecimal format. Input: AX=integer, BX=radix(2,8,10,or 16) • Writeint_signed – writes a 16-bit integer to standard output in signed decimal ASCII format. Input: AX=integer. Irvine Library Procedures • Writelong - writes an unsigned 32-bit integer to standard output in ASCII binary, decimal, octal, or hexadecimal format. Input: EAX=integer, BX=radix(2,8,10,or 16) • Writebcd – writes an 8-bit binary coded decimal byte to standard output. Input: AL=byte. • Crlf – Writes a carriage return and line feed to standard output. Irvine Library Procedures • Clrscr – Clears the screen and locates the cursor at the upper left corner. No input. Works only on video page 0, and only in text mode. • Writestring – Writes a null terminated string to standard output. Input: DX points to the string. • Readint – Reads a signed ASCII decimal string from standard input and stores it as a 16-bit binary integer. Input: none. Output: AX contains the value. Changing Model Size • Using a small model size requires that procedures must be within the code segment (within 256 bytes). Therefore only the offset address is needed in the call instruction. • Using a Medium model size allows larger differences in placement of procedures. Therefore the value of CS must also be saved when going to the procedure. CS and IP are both pushed onto the stack. Lab6A- Question C • Writing 16 different characters (0-F) as a most significant digit and 16 different characters as a least significant digit results in a total of 256 different values. Want to have two loops with the inner loop changing the LSD and the outer loop changing the MSD. Can use a shr instruction to get upper 4 bits into lower 4 bits. Lab 6B – Using Irvine Library Procedures to Display Integers in Different Bases • Writeint uses BX to determine desired radix. – – – – – BX=2 BX=8 BX=10 BX=16 AX=integer ;display in binary ;display in octal ;display in decimal ;display in hex • Writeint_signed displays signed 16-bit value as a signed decimal ASCII format. More on Lab6B – Irvine Libraries • Note that with Writestring, strings can finally be null-terminated. (much more common than DOS ‘$’) • What is maximum value that can be represented with 16 bits using 2’s complement format (216 = ?) More on Lab6B – Irvine Libraries • What directive is needed to access the Irvine libraries? – Extrn Clrscr:proc, Crlf:proc, Readint:proc • When linking must have complete path of irvine libraries unless the irvine.lib is the current directory. Unsigned Decimal Number Output • To display the 8-bit value E6h as an unsigned decimal number, first a conversion must occur. – E6h = (14*16)+6=230(decimal) • The ASCII codes for ‘2’(32h), ‘3’(33h), ‘0’(30h) would be sent using Int21h, function 2. Signed Decimal Number Output • To display the 8-bit value E6h as a signed decimal number (2s complement representation), first a conversion must occur. – E6h = 11100110b = -1Ah= -26(decimal) • The ASCII codes for ‘-’(2Dh),‘2’(32h), ‘6’(36h), would be sent using Int21h, function 2. Lab6C – Number Input • Uses Irvine library procedure to Writestring to output. • Uses Readstring to read in data as a string • Readstring – Reads a string of characters from standard output and stores them in a null terminated string. Input: DX=string pointer. CX= maximum string count. Output: AX=number of characters typed. Lab 6C- What to do? • Call to dec2hex has BX pointing to ASCII string. Expects converted results in AX. • Each string is 2 bytes long (excluding null char). First byte is ASCII representation of MSD. Second byte is LSD. Procedure for Lab6C-Question 4 • Subtract 30h to convert from ASCII to decimal. • Multiply by 10. • Save value • Put LSD in AL. Subtract 30h to convert • Add value to 10s value.