Difference between revisions of "CSC231 Exercises with conditinal jumps Solutions"
(→Loop until overflow) |
(→Loop until overflow) |
||
Line 58: | Line 58: | ||
3 Solution programs: | 3 Solution programs: | ||
* [[CSC231 FibOverflowByte.asm | FibOverflowByte.asm]]: using an array of bytes | * [[CSC231 FibOverflowByte.asm | FibOverflowByte.asm]]: using an array of bytes | ||
+ | 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 | ||
+ | |||
* [[CSC231 FibOverflowWorde.asm | FibOverflowWord.asm]]: using an array of words | * [[CSC231 FibOverflowWorde.asm | FibOverflowWord.asm]]: using an array of words | ||
+ | |||
+ | 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 | ||
+ | |||
* [[CSC231 FibOverflowDWord.asm | FibOverflowDWord.asm]]: using an array of dwords | * [[CSC231 FibOverflowDWord.asm | FibOverflowDWord.asm]]: using an array of dwords | ||
− | All 3 require | + | 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 | ||
* [[CSC231 driver.c | driver.c ]] | * [[CSC231 driver.c | driver.c ]] | ||
* [[CSC231 asm_io.inc | asm_io.inc]] | * [[CSC231 asm_io.inc | asm_io.inc]] |
Revision as of 09:05, 29 October 2008
Exercises on Conditional Jumps
Contents
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:
- FibOverflowByte.asm: using an array of bytes
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
- FibOverflowWord.asm: using an array of words
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
- FibOverflowDWord.asm: using an array of dwords
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.
Same question, but with unsigned double words.
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