CSc 3210 Computer Organization and Programming
Fall Quarter 1998
Programming Assignment #1 (Due: 28 September 1998, Monday)

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 and INT instructions.
  3. To write, debug and run your first assembly language program.

Problem Description:

Write an assembler program that will compute the number of characters and words in a sentence stored in a string which is internally defined in the data segment of your program as follows:

SENTENCE  DB 'I hope to finish this assignment in time so that I do '
          DB 'not get a late penalty for this assignment.'
You may assume that the sentence always ends with a period. The sentence may be big enough that it may not fit in one line as shown in the example. Your program should work for any sentence 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 characters      = xxxx                       |
  |  Number of words           =  xxx                       |
   _________________________________________________________
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 sentence 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 sum
    tlink /v sum
    
  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
Tue Sep 15, 1998