CSc 3210 Computer Organization and Programming
Fall 1999
Programming Assignment #1 (Due: 29 September 1999, Wednesday)

Assignment Objectives:

  1. To become familiar with Turbo Assembler and Turbo Debugger.
  2. To gain experience with several basic features of assembly laguage, including stack segment, data segment, and code segment; the .DB, .DW, .MODEL, .CODE, .DATA, .STACK and PROC directives; the MOV, ADD, SUB, DIV, SHL, CMP, JL, JE, and INT instructions.
  3. To write, debug and run your first assembly language program.

Problem Description:

Write an assembler program that will count the number of negative, zero and positive elements in an array of integers. The array of integers is internally defined in the data segment of your program as follows:

NUMBERS  DB 10, -24, 36, 0, 45, -11, 0, -20
         DB 11, 24, 26, -57, -20
The array of numbers may be big enough that it may not fit in one line. Your program should work for any array that is defined in the data segment of your program. The output of the program should look like the following (centered on the screen):
    
   _________________________________________________________
  |  Name: Raj Sunderraman                                  |
  |  This program executed on September 10, 1998 at 5:10 PM |
  |  Number of negatives       = xxxx                       |
  |  Number of zeros           = xxxx                       |
  |  Number of positives       = xxxx                       |
   _________________________________________________________
The output should be enclosed in a nice rectangle which can be created by using the extended ASCII characters on page 6-31 of the course notes. The rectangle shown above is NOT how it should appear in your output. The first line of the output should contain your name. The second line of the output should contain the date and time of execution of the program in the format indicated. You would have to obtain the system date and time to accomplish this. The remaining lines of the output should appear exactly as shown (except for the answers, which would be different depending on the time you ran your program and the array you include in the data segment). The output of your program should match, in every detail, the format illustrated above. Points will be deducted for any variation. The program should wait for user to press any key before terminating.

Submission Instructions: Electronically submit count.asm and count.exe by the deadline and submit a hard copy printout of the program listing of count.asm.

Hints:

  1. To assemble the program use the /l and /zi options and use the /v option while linking as follows:
    tasm /zi /l count
    tlink /v count
    
  2. To determine the system time and date use the DOS interrupt 21H as follows:
        
        MOV   AH,2CH ; get system time
        INT   21H
    
    After the interrupt, CH contains the hour (00 - 23), CL contains minutes (00 - 59) and DH contains seconds (00 - 59).
        
        MOV   AH,2AH ; get system date
        INT   21H
    
    After the interrupt, DH contains the month (01 - 12), DL contains day (01 - 31) and CX contains year (1980 - 2099).
  3. After getting the system date and time, you need to convert the various components from numeric to character form by extracting digits one by one, adding 30H to each (to convert to ASCII), and storing the resulting character in a buffer. To extract a digit from a number n, just divide n by 10; the remainder is n's rightmost digit.
  4. To divide a word by a byte, use the DIV instruction. For example,
      DIV  TEN
    would divide AX by 10 (assuming TEN has been declared as a byte containing 10). After the instruction has executed, AL will contain the quotient and AH will contain the remainder. Notice that the instruction does not mention a register, since division is always done in the AX register. Warning: Instructions such as
       DIV  10
    are rejected by the assembler.
  5. To print the information on the screen, use the DOS interrupt 21H as follows:
       MSG   DB  'Hello!','$'  ; message string to be displayed
                            ; notice dollar symbol at end.
       ...
       ...
       MOV   AH,09H  ; request display
       LEA   DX,MSG  ; load address of message
       INT   21H     ; DOS interrupt
    
  6. To clear the screen, use BIOS interrupt 10H as follows:
       
       MOV   AX,0600H ; AH 06 (scroll), AL 00 (full screen)
       MOV   BH,30    ; Attribute: color setting 
       MOV   CX,0000  ; upper left row:column
       MOV   DX,184FH ; lower right row=24,column=79
       INT   10H      ; interrupt call to BIOS
    
  7. To set the cursor at a particular location on screen use BIOS interrupt 10H as follows:
       
       MOV  DL,10   ; column 10
       MOV  DH,5    ; row 5
       MOV  BH,0    ; page 0
       MOV  AH,02H  ; request set cursor
       INT  10H     ; interrupt call to BIOS
    
  8. To wait for user to press any key before terminating use DOS interrupt 16H as follows:
       
       MOV   AH,10H
       INT   16H
    



Raj Sunderraman
Thu Sep 16, 1999