Difference between revisions of "CSC231 Exercises with conditinal jumps Solutions"

From dftwiki3
Jump to: navigation, search
(Scanning an array)
(Scanning an array)
Line 99: Line 99:
 
==Scanning an array==
 
==Scanning an array==
  
Find the '''largest''' element of a 1-dimensional array of '''signed double-words'''.  
+
* Find the '''largest''' element of a 1-dimensional array of '''signed double-words'''.  
  
<code><pre>
+
::<code><pre>
 
         section .data
 
         section .data
 
msg1    db      "large of array = ",0
 
msg1    db      "large of array = ",0
Line 156: Line 156:
 
</pre></code>
 
</pre></code>
  
Same question, but with  '''unsigned double words'''.
+
* Same question, but with  '''unsigned double words'''.
  
For unsigned double words, then change the definition of the array (so that it does not contain negative numbers), and replace the '''jg next''' instruction by '''ja next''' instruction.
+
::For unsigned double words, then change the definition of the array (so that it does not contain negative numbers), and replace the '''jg next''' instruction by '''ja next''' instruction.
  
 
==Characters and lower/upper case conversion==
 
==Characters and lower/upper case conversion==

Revision as of 09:23, 29 October 2008

Exercises on Conditional Jumps

Finding the minimum

Find the minimum of 3 signed int variables a, b, and c

	section	.data
a       dd      3
b       dd      5
c       dd      1        
min     dd      0
        
	section	.text
	global	_start

_start:

;;; if a <= b:           # if1
;;;     if a <= c:       # if2
;;;         min = a      # 
;;;     else: # a > c    # else2
;;;         min = c      
;;; else: # a > b        # else1
;;;     if b >= c:       # if3
;;;         min = c
;;;     else: # b < c    # else3
;;;         min = b

        mov     eax, dword[a]
        mov     ebx, dword[b]
        mov     ecx, dword[c]
        
if1:    cmp     eax, ebx
        jg      else1
if2     cmp     eax, ecx
        jg      else2
        mov     dword[min], eax
        jmp     done
else2:  mov     dword[min], ecx
        jmp     done
else1:
if3:    cmp     ebx, ecx
        jl      else3
        mov     dword[min], ecx
        jmp     done
else3:  mov     dword[min], ebx
done:
        

Loop until overflow

Print fibonacci numbers coded as unsigned words until the result overflows. Don't print erroneous numbers!

3 Solution programs:

fib(2) = 2
fib(3) = 3
fib(4) = 5
fib(5) = 8
fib(6) = 13
fib(7) = 21
fib(8) = 34
fib(9) = 55
fib(10) = 89
fib(2) = 2
fib(3) = 3
fib(4) = 5
fib(5) = 8
fib(6) = 13
...
fib(19) = 6765
fib(20) = 10946
fib(21) = 17711
fib(22) = 28657
fib(2) = 2
fib(3) = 3
fib(4) = 5
fib(5) = 8
...
fib(43) = 701408733
fib(44) = 1134903170
fib(45) = 1836311903

All 3 programs require

Scanning an array

  • Find the largest element of a 1-dimensional array of signed double-words.
       section .data

msg1 db "large of array = ",0 array dd 1, 3, 10, 0, -2, 44, 10 N equ ($-array)/4


       ;; -------------------------
       ;; code area
       ;; -------------------------
       section .text
       global  asm_main
---------------------------------------------------------
main program
---------------------------------------------------------

asm_main:

largest = MOSTNEG;
for ( i=0; i<N; i++ ) {
if ( array[i]>largest )
largest = array[i];
print "largest of array = ", largest
       mov     esi, 0
       mov     ebx, 0x80000000 ; most negative dword
       

for: cmp esi, N*4

       jge     done
       
       cmp     ebx, dword[array+esi]
       jg      next
       mov     ebx, dword[array+esi]

next: add esi, 4

       jmp     for

done:

       mov     eax, ebx
       call    printMax
       
       ret        
----------------------------------------------------------
printMax
gets integer in eax and prints it
----------------------------------------------------------

printMax:

       push    eax             ; save max in stack
       mov     eax, msg1        
       call    print_string    ; prints " "
       pop     eax             ; get max from stack
       call    print_int       ; print fact(i)
       call    print_nl        ; next line
       ret
  • Same question, but with unsigned double words.
For unsigned double words, then change the definition of the array (so that it does not contain negative numbers), and replace the jg next instruction by ja next instruction.

Characters and lower/upper case conversion

The program makeUpper.asm transforms all characters in a string to uppercase, but will also transform other characters that are not letters.

Modify the program so that it modifies only characters between 'a' and 'z' included.

Long/short jumps

Conditional jumps can jump only +127 bytes down, -128 bytes up in the code. How can we code something like this:

                 cmp     eax,10
                 jl      there
                 ...
                 ...
        there:   ...


when the instruction at Label there is 1000 bytes away from the jl conditional jump?

Print 2-dimensional arrays

Write the code necessary for printing an array of chars (maze) using for-loops depending on i and j indexes.

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

        section .data
maze    db "################################"     
maze2   db "            #  #           #    "     
        db "#########   #  #  #######  #   #"
        db "#           #  #        #      #"
        db "#########         ##############"
        db "#           ####               #"
        db "################################"
C       equ maze2-maze  ; num of columns
R       equ 7           ; num of rows

i        dd          0
j        dd          0