Difference between revisions of "CSC231 Homework 3 2014"

From dftwiki3
Jump to: navigation, search
(Looping. Version 2)
Line 91: Line 91:
 
ecx = 1
 
ecx = 1
 
</source>
 
</source>
 +
<br />
 +
==Looping. Version 3==
 +
<br />
 +
* Now try this program
 +
<br />
 +
::<source lang="asm">
 +
;;; ; loop3.asm
 +
;;; ; D. Thiebaut
 +
;;; ;
 +
;;; ; a simple program using a loop in which the ecx
 +
;;; ; register is printed.
 +
;;; ;
 +
;;; ; to assemble and run:
 +
;;; ;
 +
;;; ;    nasm -f elf loop1.asm
 +
;;; ;    nasm -f elf 231Lib.asm
 +
;;; ;    ld -melf_i3896 -o loop1 loop1.o 231Lib.o
 +
;;; ;    ./loop1
 +
;;; ; -------------------------------------------------------------------
 +
 +
extern _printDec
 +
extern _println       
 +
extern _printString
 +
 +
 +
;;;  ------------------------------------------------------------
 +
;;;  data areas
 +
;;;  ------------------------------------------------------------
 +
 +
                section .data
 +
Array          dd      1, 10, 20, 50, 100, 150, 200, 500, 1000
 +
ARRAYLEN        equ    ($-Array)/4    ; the number of dwords in Array
 +
temp            dd      0              ; a place to save ecx when needed
 +
       
 +
;;;  ------------------------------------------------------------
 +
;;;  code area
 +
;;;  ------------------------------------------------------------
 +
 +
                section .text
 +
                global  _start
 +
 +
_start:
 +
 +
 +
                mov    ecx, ARRAYLEN
 +
                mov    ebx, Array
 +
for:     
 +
 +
;;; display the integer at [ebx]
 +
                mov    eax, dword[ebx]
 +
                add    ebx, 4        ; make ebx point to next int in array
 +
                call    _printDec
 +
                call    _println
 +
               
 +
                loop    for
 +
 +
;;;  exit
 +
 +
                mov    eax,1
 +
                mov    ebx,0
 +
                int    0x80    ; final system call
 +
</source>
 +
<br />
 +
* Read it carefully.  Can you predict what it will output?
 +
* Assemble, link, and run it.
 +
* <font color="magenta">Verify that your intuition was correct.</font>  If it was not, make sure you understand why.
 +
* You are now ready for the assignment.
 +
<br />
 +
=Problem #1=

Revision as of 14:39, 29 September 2014

--D. Thiebaut (talk) 15:17, 29 September 2014 (EDT)


Preparation


Looping. Version 1


  • Create the following program in your beowulf2 directory:


;;; ; loop1.asm
;;; ; D. Thiebaut
;;; ;
;;; ; a simple program using a loop in which the ecx
;;; ; register is printed.
;;; ;
;;; ; to assemble and run:
;;; ;
;;; ;     nasm -f elf loop1.asm
;;; ;     nasm -f elf 231Lib.asm
;;; ;     ld -melf_i3896 -o loop1 loop1.o 231Lib.o
;;; ;     ./loop1
;;; ; -------------------------------------------------------------------

extern _printDec                       ; the function that prints eax in decimal
extern _println                          ; the function that brings the cursor to the next line.

;;;  ------------------------------------------------------------
;;;  code area
;;;  ------------------------------------------------------------

                section .text
                global  _start

_start:
                mov     ecx, 10
for:            mov     eax, ecx
                call    _printDec
                call    _println
                loop    for

;;;  exit()

                mov     eax,1
                mov     ebx,0
                int     0x80    ; final system call


  • Run it.
  • Verify that it displays the different values of ecx, the loop counter.


Looping. Version 2


  • This time we write the same program as the one above, but add some code to make it display "ecx = 10", "ecx = 9", etc.
  • So the body of the loop will look something like this:


                mov     ecx, msg
                mov     edx, MSGLEN
                call    _printString


You should recognize the way _printString works: you pass the address of the string in ecx, the length of the string in edx, and you call the function.
  • The problem with this code is that it modifies ecx, which is our loop counter. So we'd better save ecx before we execute this code and restore it right after. We use a variable called temp for this purpose:


;;; in the data segment:
temp           dd        0                    ; safe place to save ecx

;;; back in the code segment:

                mov     dword[temp], ecx
                mov     ecx, msg
                mov     edx, MSGLEN
                call    _printString
                mov     ecx, dword[temp]


  • Update your program with the new code, indicate that _printString is an extern function, and assemble, link, and run your new program.
  • Verify that its output looks like this:


ecx = 10
ecx = 9
ecx = 8
ecx = 7
ecx = 6
ecx = 5
ecx = 4
ecx = 3
ecx = 2
ecx = 1


Looping. Version 3


  • Now try this program


;;; ; loop3.asm
;;; ; D. Thiebaut
;;; ;
;;; ; a simple program using a loop in which the ecx
;;; ; register is printed.
;;; ;
;;; ; to assemble and run:
;;; ;
;;; ;     nasm -f elf loop1.asm
;;; ;     nasm -f elf 231Lib.asm
;;; ;     ld -melf_i3896 -o loop1 loop1.o 231Lib.o
;;; ;     ./loop1
;;; ; -------------------------------------------------------------------

extern _printDec
extern _println        
extern _printString


;;;  ------------------------------------------------------------
;;;  data areas
;;;  ------------------------------------------------------------

                section .data
Array           dd      1, 10, 20, 50, 100, 150, 200, 500, 1000
ARRAYLEN        equ     ($-Array)/4     ; the number of dwords in Array
temp            dd      0               ; a place to save ecx when needed
        
;;;  ------------------------------------------------------------
;;;  code area
;;;  ------------------------------------------------------------

                section .text
                global  _start

_start:


                mov     ecx, ARRAYLEN
                mov     ebx, Array
for:      

;;; display the integer at [ebx]
                mov     eax, dword[ebx]
                add     ebx, 4         ; make ebx point to next int in array
                call    _printDec
                call    _println
                
                loop    for

;;;  exit

                mov     eax,1
                mov     ebx,0
                int     0x80    ; final system call


  • Read it carefully. Can you predict what it will output?
  • Assemble, link, and run it.
  • Verify that your intuition was correct. If it was not, make sure you understand why.
  • You are now ready for the assignment.


Problem #1