Difference between revisions of "CSC231 Homework 8 2017"
(→Problem #2) |
(→Problem #2) |
||
Line 144: | Line 144: | ||
The functions should behave as follows: | The functions should behave as follows: | ||
<br /> | <br /> | ||
− | * '''f1'''. Receives the address of a string in the stack, and converts the string to uppercase, replacing all the alphabetic characters in the string to uppercase. We assume that the string, as in C, is terminated by a '\0' char. Here is an example of how to call the function: | + | * '''f1( s )'''. Receives the address of a string '''s''' in the stack, and converts the string to uppercase, replacing all the alphabetic characters in the string to uppercase. We assume that the string, as in C, is terminated by a '\0' char. Here is an example of how to call the function: |
::<source lang="asm"> | ::<source lang="asm"> | ||
s1 db "Hello world!", 0 | s1 db "Hello world!", 0 | ||
Line 162: | Line 162: | ||
</source> | </source> | ||
:The code above will print "HELLO WORLD!" | :The code above will print "HELLO WORLD!" | ||
+ | <br /> | ||
+ | * '''f2(a, b, c)''': f2 receives 3 ints in the stack and computes '''2a + 3b -c''' and returns this value in eax. | ||
+ | Here is an example of how to call the function: | ||
+ | ::<source lang="asm"> | ||
+ | a dd 3 | ||
+ | b dd 5 | ||
+ | c dd 7 | ||
+ | ... | ||
+ | push dword[a] | ||
+ | push dword[b] | ||
+ | push dword[c] | ||
+ | call f2 | ||
+ | |||
+ | ; eax should now contain 2a + 3b - c = 2*3 + 3*5 - 7 = 14 | ||
+ | </source> | ||
<onlydft> | <onlydft> | ||
==Solution Program== | ==Solution Program== |
Revision as of 17:10, 14 April 2017
--D. Thiebaut (talk) 16:09, 14 April 2017 (EDT)
Page under construction!
Contents
Problem #1: Programming in C
Write a C program that receives 3 DNA strings on the command line, the first one will be saved under the variable (pointer) called marker1, the second one marker2, and the last one, DNA. Your C program will search for the markers in the DNA, and will zap all the bases (characters) it finds between marker1 and marker2 (and including those of the markers), replacing them with dashes.
Here are some examples of how your program should operate:
231b@aurora ~ $ ./hw8_1 AGC ACC ACCGGGGGAGCCAAAGCTTTTTACCTT ACCGGGGG-----------------TT 231b@aurora ~ $ ./hw8_1 AGCA ACC ACCGGGGGAGCCAAAGCTTTTTACCTT ACCGGGGGAGCCAAAGCTTTTTACCTT 231b@aurora ~ $ ./hw8_1 AGC AT ACCGGGGGAGCCAAAGCTTTTTACCTT ACCGGGGGAGCCAAAGCTTTTTACCTT 231b@aurora ~ $ ./hw8_1 AC TG ACACACACGGGGGGTGTGTGTG ----------------TGTGTG 231b@aurora ~ $ ./hw8_1 AC TG TGACACACACGGGGGGTGTGTGTG TG----------------TGTGTG
- Notes
- When the first or second markers are not found in the DNA, the program outputs the original DNA string.
- When the first marker appears several time, the first occurrence is the one used.
- When the second marker appears several times, its first occurrence after an occurrence of the first marker is used.
- When found, the two markers are also zapped with dashes.
Starting Seed
Start with this skeleton program, and call it hw8_1.c.
#include <stdio.h> #include <stdlib.h> #include <string.h> void main( int argc, char *argv[] ) { char *marker1, *marker2, *DNA; if (argc < 4 ) { printf( "syntax: %s marker1 marker2 DNA\n", argv[0] ); return; } marker1 = argv[1]; marker2 = argv[2]; DNA = argv[3]; //--- print the markers and DNA --- /* (for debugging purpose) printf( "Marker1 = %s\n", marker1 ); printf( "Marker2 = %s\n", marker2 ); if ( strlen( DNA ) > 80 ) printf( "DNA = %.*s...%s (%d bases)\n\n", 10, DNA, DNA+((int)strlen(DNA)-10), (int) strlen( DNA) ); else printf( "DNA = %s\n\n", DNA ); */ //--- add your code below this point --- }
You may want to uncomment the section under the "print the markers and DNA" comment to see how the program gets the 3 strings. Comment it back when you understand what happens.
Testing Your Program
I have made the executable version of the solution available. It should already be in your PATH, so you don't need to "getcopy" it.
To perform a batch test of your program against the solution, first create a batch file using the code below, and call it testHw8_1.sh.
#! /bin/bash # testHw8_1.sh # Your name # Tests the hw8_1 program by feeding it different markers and DNA strings. # The output is fed in "cat -v" which will display unprintable (junk) characters. prog="./hw8_1" echo AGC ACC ACCGGGGGAGCCAAAGCTTTTTACCTT $prog AGC ACC ACCGGGGGAGCCAAAGCTTTTTACCTT | cat -v echo AGCA ACC ACCGGGGGAGCCAAAGCTTTTTACCTT $prog AGCA ACC ACCGGGGGAGCCAAAGCTTTTTACCTT | cat -v echo AGC AT ACCGGGGGAGCCAAAGCTTTTTACCTT $prog AGC AT ACCGGGGGAGCCAAAGCTTTTTACCTT | cat -v echo AC TG ACACACACGGGGGGTGTGTGTG $prog AC TG ACACACACGGGGGGTGTGTGTG | cat -v echo AC TG TGACACACACGGGGGGTGTGTGTG $prog AC TG TGACACACACGGGGGGTGTGTGTG | cat -v
- Then copy this script file into another script file called testHw8_1sol.sh.
cp testHw8_1.sh testHw8_1sol.sh
- Next, edit the second script and change the assignment to the $prog variable:
prog="hw8_1sol"
- (no dot-slash here!)
- You now have two scripts that should output the exact same text, if your program is correct.
- You can go one more step toward being certain of the correctness of your output by using the diff command, as you did in previous assignment.
Hints
You should look up the C string.h library on the Web, for ideas...
Moodle Submission
- Look for the Homework 8 Problem 1 section.
Problem #2
Write an assembly program called hw8_2.asm that contains several functions, but no main program. The main program will be in a separate file, that will be assembled separately, and linked to your program to create a fully executable file.
The functions should behave as follows:
- f1( s ). Receives the address of a string s in the stack, and converts the string to uppercase, replacing all the alphabetic characters in the string to uppercase. We assume that the string, as in C, is terminated by a '\0' char. Here is an example of how to call the function:
s1 db "Hello world!", 0 s1Len equ $-s1 ... mov eax, s1 push eax call f1 mov ecx, s1 mov edx, s1Len-1 ; figure out why the -1! mov eax, 4 mov ebx, 1 int 0x80
- The code above will print "HELLO WORLD!"
- f2(a, b, c): f2 receives 3 ints in the stack and computes 2a + 3b -c and returns this value in eax.
Here is an example of how to call the function:
a dd 3 b dd 5 c dd 7 ... push dword[a] push dword[b] push dword[c] call f2 ; eax should now contain 2a + 3b - c = 2*3 + 3*5 - 7 = 14