From 41a02001bcb75ecf61d5a4716ad9e5eac5afd91a Mon Sep 17 00:00:00 2001 From: sayanmitracode <sayan.mitra@gmail.com> Date: Tue, 2 Oct 2018 23:50:22 -0500 Subject: [PATCH] lecture 12 --- Fall2018/lec12_ptrarray.c | 35 ++++++++ Fall2018/lec12_swap.c | 26 ++++++ Fall2018/lec12_switch.c | 28 ++++++ Fall2018/lec3_poly.asm | 47 ++++++++++ Fall2018/lec4_usestack.asm | 111 +++++++++++++++++++++++ Fall2018/lec5_calc.asm | 176 +++++++++++++++++++++++++++++++++++++ Fall2018/lec5_palin.asm | 126 ++++++++++++++++++++++++++ Fall2018/lec8_quad.c | 34 +++++++ Fall2018/test.asm | 127 ++++++++++++++++++++++++++ Fall2018/test.c | 30 +++++++ 10 files changed, 740 insertions(+) create mode 100644 Fall2018/lec12_ptrarray.c create mode 100644 Fall2018/lec12_swap.c create mode 100644 Fall2018/lec12_switch.c create mode 100644 Fall2018/lec3_poly.asm create mode 100644 Fall2018/lec4_usestack.asm create mode 100644 Fall2018/lec5_calc.asm create mode 100644 Fall2018/lec5_palin.asm create mode 100644 Fall2018/lec8_quad.c create mode 100644 Fall2018/test.asm create mode 100644 Fall2018/test.c diff --git a/Fall2018/lec12_ptrarray.c b/Fall2018/lec12_ptrarray.c new file mode 100644 index 0000000..0bf0045 --- /dev/null +++ b/Fall2018/lec12_ptrarray.c @@ -0,0 +1,35 @@ +#include <stdio.h> +#include <string.h> + + +int main() +{ + char str[20]; + char *sptr; + sptr = &str[0]; + char achr; + int i; + int n = strlen(str); + printf("\n length of string is %d",n); + printf("Enter a string with less than 20 characters: "); + scanf("%s", str); + scanf("%c",&achr); + printf("\n string = %s of lenght=%lu \n",str,strlen(str)); + i = 0; + while(str[i]!='\0') + { + if(i%2 ==0) + *(str+i) = *(str+i)+2; + else + *(str+i) = ' '; + i++; + } + i=0; + while(str[i]!='\0') + { + printf("%d. %c %c %c %c\n",i,str[i], *(str + i), *(&str[0]+i), *(sptr+i)); + i++; + } + + return 0; +} diff --git a/Fall2018/lec12_swap.c b/Fall2018/lec12_swap.c new file mode 100644 index 0000000..3fdc586 --- /dev/null +++ b/Fall2018/lec12_swap.c @@ -0,0 +1,26 @@ +#include <stdio.h> + +int swap(int * arg_a, int * arg_b); + +int main() +{ + int a = 4; + int b = 400; + printf("\n Before a = %d, b = %d", a,b); + printf("\n addresses a = %p, b = %p", &a,&b); + swap(&a,&b); + printf("\n After a = %d, b = %d", a,b); + printf("\n addresses a = %p, b = %p", &a,&b); + + return 0; +} + + +int swap(int * arg_a, int * arg_b) +{ + int temp; + temp = *arg_a; + *arg_a = *arg_b; + *arg_b = temp; + return 0; +} diff --git a/Fall2018/lec12_switch.c b/Fall2018/lec12_switch.c new file mode 100644 index 0000000..da702cc --- /dev/null +++ b/Fall2018/lec12_switch.c @@ -0,0 +1,28 @@ +#include<stdio.h> + + +int main() +{ + int a; + printf("\n Enter a choice (0-2)"); + scanf("%d",&a); + + switch (a){ + case 0: // + { + printf("You chose 0"); + break; + } + case 1: // + { + printf("You chose 1"); + break; + } + case 2: // + { + printf("You chose 2"); + break; + } + } + return 0; +} diff --git a/Fall2018/lec3_poly.asm b/Fall2018/lec3_poly.asm new file mode 100644 index 0000000..d04f8b2 --- /dev/null +++ b/Fall2018/lec3_poly.asm @@ -0,0 +1,47 @@ +.ORIG x3000 + + +;;; MAIN + LD R1, VAL_X + LD R2, VAL_X + JSR MULT ;R0<- X^2 + ADD R4, R0, #0 ;R4 <- X^2 + ADD R1, R4, #0 ;R1 <- X2 + JSR MULT ;R0 <- X3 + ADD R5, R0, #1 ; + LD R2, VAL_A + ADD R1, R5, #0 ; + JSR MULT ; R0 <- a X^# + + + + +VAL_A .FILL x7 +VAL_B .FILL x5 +VAL_C .FILL x9 +VAL_X .FILL x4 + + +SUBTR +;;; INPUT: R1, R2, +;;; OUTPUT: R0 = R1 - R2 + + ST R2, saveR2SUB + ST R4, saveR4SUB + NOT R2, R2 + ADD R2, R2, #1 + ADD R0, R1, R2 + LD R2, saveR2SUB + LD R4, saveR4SUB + RET + + saveR2SUB .BLKW 1 + +MULT +;;; INPUT: R1, R2 +;;; OUTPUT: R0 <- R1 * R2 +;;; Assumes all positive +;;; preserves the values of R1, R2 + + +.END diff --git a/Fall2018/lec4_usestack.asm b/Fall2018/lec4_usestack.asm new file mode 100644 index 0000000..37fc13f --- /dev/null +++ b/Fall2018/lec4_usestack.asm @@ -0,0 +1,111 @@ +.ORIG x3000 + +;;; Demonstration of a stack + +MAIN + ;; Pushes multiples of in the stack and then pops them + AND R4,R4,#0 ; + AND R1, R1,#0 + LD R2, ASCII + ADD R1, R1, #5 +PUSHLOOP ADD R4, R4, #1 + ADD R0, R4, #0 + JSR PUSH + ADD R1, R1, #-1 + BRP PUSHLOOP + ADD R1, R1, #6 +POPLOOP + JSR POP + ADD R0, R0, R2 + OUT + ADD R1, R1, #-1 + BRP POPLOOP + HALT + +ASCII .fill x30 + + + + + + + +;;; Pushes R0 at the top of the stack +;;; IN: R0 +;;; OUT: R5 (0-success; 1 fail) +;;; USES: R3: stack end, R4: stack_top + + + + + +PUSH + ;; Save registers + ST R3, saveR3push + ST R4, saveR4push + ;; Set R5 to 0 + AND R5, R5, #0 + ;; Lod top and end + LD R3, stack_end + LD R4, stack_top + ;; check full: end-1 = top + ADD R3, R3, #-1 + NOT R3, R3 + ADD R3, R3, #1 + Add R3, R4, R3 ;R3 = top - (end -1) + BRz OVERFLOW + ;; not overflow + STR R0, R4, #0 ;push R0 + ADD R4, R4, #-1 + ST R4, stack_top ;move top of stack up by one + BRNZP PUSH_DONE +OVERFLOW + ADD R5, R5, #1 +PUSH_DONE + ;; restore registers + LD R3, saveR3push + LD R4, saveR4push + RET + + saveR4push .BLKW 1 + saveR3push .BLKW 1 + +;;; POPs and stores in R0 +;;; IN: none +;;; OUT: R5 (0-success; 1 fail); poped value in R0 +;;; USES: R3: stack_start, R4: stack_top + +POP + ;; Save registers + ST R3, saveR3pop + ST R4, saveR4pop + ;; Set R5 to 0 + AND R5, R5, #0 + ;; Lod top and end + LD R3, stack_start + LD R4, stack_top + ;; check full: start = top + NOT R3, R3 + ADD R3, R3, #1 + Add R3, R4, R3 ;R3 = top - start + BRz UNDERFLOW + ;; not underflow + LDR R0, R4, #0 ;R0<- popped value + ADD R4, R4, #1 ;update stack pointer + ST R4, stack_top + BRNZP POP_DONE +UNDERFLOW + ADD R5, R5, #1 +POP_DONE + ;; restore registers + LD R3, saveR3pop + LD R4, saveR4pop + RET + + saveR4pop .BLKW 1 + saveR3pop .BLKW 1 + + stack_start .FILL x3600 + stack_end .FILL x35F0 + stack_top .FILL x3600 + .END diff --git a/Fall2018/lec5_calc.asm b/Fall2018/lec5_calc.asm new file mode 100644 index 0000000..bec093f --- /dev/null +++ b/Fall2018/lec5_calc.asm @@ -0,0 +1,176 @@ +; stack implementation + +.ORIG x3000 + + ;; R1: address of the char to be read + ;; R2: char being read + ;; R3, R4: operands popped from stack + ;; R0: item to push on stack + ;; R5: ASCII values on '0', '9', '+', etc. used for checks + LEA R1, string_start +READ_LOOP + ;; read char + LDR R2, R1, #0 + BRz DONE_READ ;; if end finish + ;; prepare output + ADD R0, R2, #0 + OUT + ;; check for number '0' <= R2 <= '9' + LD R5, char_val_0 + NOT R5, R5 + ADD R5, R5,#1 + ADD R3, R2, R5 ; R3 < '0' i.e., R3 <- R2 - '0' + BRN HANDLE_OPERATORS + NOT R3, R2 + ADD R3, R3, #1 ; R3 <- -R2 + LD R5, char_val_9 + ADD R5, R5, R2 ; R3 <- '9' - R2 + BRN DONE_CHAR + ;; handle operands + ;; convert and push operands + LD R5, char_val_0 + NOT R5, R5 + ADD R5, R5, #1 + ADD R0, R5, R0 ; R0 <- numerical value of operand + JSR PUSH ; PUSH R0 + BRNZP DONE_CHAR + +HANDLE_OPERATORS + ;; non_chars + JSR POP + ADD R3, R0, #0 ; R3 <- POP + JSR POP + ADD R4, R0, #0 ; R4 <- POP + ;; do operators + NOT R2, R2 + ADD R2, R2, #1 ; R2 <- negation of char operator + LD R5, char_val_plus + ADD R5, R2, R5 ; R5 <- '+' - R2 + BRNP NOT_ADD + ADD R0, R3, R4 ;R0 <- R3 + R4 + JSR PUSH ;PUSH result + BRNZP DONE_CHAR + + ;; not add +NOT_ADD + ;; subtraction + LD R5, char_val_sub + ADD R5, R2, R5 ; R5 <- '-' - R2 + BRNP NOT_MINUS + NOT R4, R4 + ADD R4, R4, #1 + ADD R0, R3, R4 ; R0 <- R3 - R4 + JSR PUSH + BRNZP DONE_CHAR + + ;; not subtraction +NOT_MINUS + ;; multiplication + LD R5, char_val_mul + ADD R5, R2, R5 ; R5 <- '*' - R2 + BRNP NOT_MULTI + AND R0, R0, #0 +MULT_LOOP + ADD R0, R4, R0 + ADD R3, R3, #-1 + BRP MULT_LOOP + JSR PUSH + BRNZP DONE_CHAR + ;; not multiplication +NOT_MULTI + BRNZP DONE_CHAR + +DONE_CHAR + ADD R1, R1, #1 + BRNZP READ_LOOP + +DONE_READ + HALT + + + + ;; POP + ;; IN: nothing + ;; OUT: if stack is successful (not empty) then R0 will contain the value poped R5 will be 1 + ;; else R5 will be 0 +POP + ;; save registers + ST R3, POP_save_R3 + ST R4, POP_save_R4 + ;; check empty + LD R4, STACK_TOP + LD R3, STACK_START + ;; clear register 5 + AND R5, R5, #0 + ;; stack underflow stack_top = stack_start + NOT R3, R3 + ADD R3, R3, #1 + ADD R3, R3, R4 + BRZ STACK_UNDERFLOW + ADD R4, R4, #1 + LDR R0, R4, #0 + ;; update top + ST R4, STACK_TOP + BRnzp POP_DONE +STACK_UNDERFLOW + ADD R5, R5, #1 +POP_DONE + ;; restore register + LD R3, POP_save_R3 + LD R4, POP_save_R4 + RET + +;; push data +POP_save_R3 .BLKW #1 +POP_save_R4 .BLKW #1 + + + ;; PUSH + ;; IN: R0 will contain value to be pushed + ;; OUTPUT: R5 = 0 success if stack is not full, update stack + ;; = 1 fail if stack is full, stack remains unchanged +PUSH + ;; save registers + ST R3, PUSH_save_R3 + ST R4, PUSH_save_R4 + ;; check full + LD R4, STACK_TOP + LD R3, STACK_END + ;; + AND R5, R5, #0 + ;; check stack_end - 1 = stack_top + ADD R3, R3, #1 + NOT R3, R3 + ADD R3, R3, #1 ; R3 <- -(stack_end - 1) + ADD R3, R3, R4 + BRz STACK_OVERFLOW + ;; save item + STR R0, R4, #0 ; + ADD R4, R4, #-1 + ST R4, STACK_TOP + BRnzp PUSH_DONE +STACK_OVERFLOW + ADD R5, R5, #1 +PUSH_DONE + ;; restore register + LD R3, PUSH_save_R3 + LD R4, PUSH_save_R4 + RET + +;; push data +PUSH_save_R3 .BLKW #1 +PUSH_save_R4 .BLKW #1 + + +; data +STACK_TOP .FILL x4000 +STACK_START .FILL x4000 +STACK_END .FILL x3F00 +string_start .STRINGZ "34+5*" +char_val_0 .Fill x30 +char_val_9 .Fill x39 +char_val_plus .Fill x2B +char_val_sub .Fill x2D +char_val_mul .Fill x2A + + .END diff --git a/Fall2018/lec5_palin.asm b/Fall2018/lec5_palin.asm new file mode 100644 index 0000000..6d7dbbc --- /dev/null +++ b/Fall2018/lec5_palin.asm @@ -0,0 +1,126 @@ +.ORIG x3000 + +;;; checking a palindrome + +MAIN + ;; R1: addres of char to read + ;;; R2: char being read + ;; R5 = 1 not palindrome + ;; = 0 palindrome + AND R5, R5, #0 + LEA R1, string_start +READ_LOOP + LDR R2, R1, #0 + BRZ DONE_READ + ADD R0, R2, #0 + ST R5, saveR5palin + JSR PUSH + LD R5, saveR5palin + ADD R1, R1, #1 + BRNZP READ_LOOP +DONE_READ + LEA R1, string_start +CHECK_LOOP + LDR R2, R1, #0 + BRZ DONE + ST R5, saveR5palin + JSR POP ;R0 <- char + LD R5, saveR5palin + NOT R2, R2 + ADD R2, R2, #1 + ADD R2, R2, R0 ;R2 <- char - popped val + BRNP MISMATCH + ADD R1, R1, #1 + BRNZP CHECK_LOOP +MISMATCH ADD R5, R5, #1 +DONE + HALT + +ASCII .fill x30 +STRING_start .stringz "kayok" + + + +saveR5palin .BLKW 1 + + + +;;; Pushes R0 at the top of the stack +;;; IN: R0 +;;; OUT: R5 (0-success; 1 fail) +;;; USES: R3: stack end, R4: stack_top + + + + + +PUSH + ;; Save registers + ST R3, saveR3push + ST R4, saveR4push + ;; Set R5 to 0 + AND R5, R5, #0 + ;; Lod top and end + LD R3, stack_end + LD R4, stack_top + ;; check full: end-1 = top + ADD R3, R3, #-1 + NOT R3, R3 + ADD R3, R3, #1 + Add R3, R4, R3 ;R3 = top - (end -1) + BRz OVERFLOW + ;; not overflow + STR R0, R4, #0 ;push R0 + ADD R4, R4, #-1 + ST R4, stack_top ;move top of stack up by one + BRNZP PUSH_DONE +OVERFLOW + ADD R5, R5, #1 +PUSH_DONE + ;; restore registers + LD R3, saveR3push + LD R4, saveR4push + RET + + saveR4push .BLKW 1 + saveR3push .BLKW 1 + +;;; POPs and stores in R0 +;;; IN: none +;;; OUT: R5 (0-success; 1 fail); poped value in R0 +;;; USES: R3: stack_start, R4: stack_top + +POP + ;; Save registers + ST R3, saveR3pop + ST R4, saveR4pop + ;; Set R5 to 0 + AND R5, R5, #0 + ;; Lod top and end + LD R3, stack_start + LD R4, stack_top + ;; check full: start = top + NOT R3, R3 + ADD R3, R3, #1 + Add R3, R4, R3 ;R3 = top - start + BRz UNDERFLOW + ;; not underflow + ADD R4, R4, #1 ;update stack pointer + LDR R0, R4, #0 ;R0<- popped value + ST R4, stack_top + BRNZP POP_DONE +UNDERFLOW + ADD R5, R5, #1 +POP_DONE + ;; restore registers + LD R3, saveR3pop + LD R4, saveR4pop + RET + + saveR4pop .BLKW 1 + saveR3pop .BLKW 1 + + stack_start .FILL x3600 + stack_end .FILL x35F0 + stack_top .FILL x3600 + .END diff --git a/Fall2018/lec8_quad.c b/Fall2018/lec8_quad.c new file mode 100644 index 0000000..ffe611a --- /dev/null +++ b/Fall2018/lec8_quad.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include <math.h> +// finding roots of a quadratic equations +/* Sept 2018 + ECE 220 + */ + +int main() +{ + float a,b,c,det; + float x1,x2; + printf("\n Input the coefficients a,b,c:"); + scanf("%f %f %f", &a,&b,&c); + det = b*b - (4 * a * c); + if (det == 0) + { + x1 = -(b/(2*a)); + x2 = x1; + printf("\n Repeated roots at %f %f\n", x1, x2); + } + else if (det > 0) + { + x1 = (-b + sqrt(det))/(2*a); + x2 = (-b - sqrt(det))/(2*a); + printf("\n Distinct real roots at %f %f\n", x1, x2); + } + else // det < 0 + { + x1 = -b/(2*a); + x2 = sqrt(-det)/(2*a); + printf("\n Distinct complex roots at %f+i%f, and %f-i%f\n", x1,x2, x1, x2); + } + return 0; +} diff --git a/Fall2018/test.asm b/Fall2018/test.asm new file mode 100644 index 0000000..c91d20e --- /dev/null +++ b/Fall2018/test.asm @@ -0,0 +1,127 @@ +.ORIG x3000 + +;;; checking a palindrome + +MAIN + ;; R1: addres of char to read + ;;; R2: char being read + ;; R5 = 1 not palindrome + ;; = 0 palindrome + ;; R6: 1 (overflow) 0 (normal) + LEA R1, STRING_start + AND R5, R5, #0 +READ_LOOP + LDR R2, R1, #0 + BRZ DONE_READ + ADD R0, R2, #0 + ST R5, saveR5palin + JSR PUSH + ;; check for stack overlow + ADD R6, R5, #0 + LD R5, saveR5palin + ADD R1, R1, #1 + BRNZP READ_LOOP +DONE_READ + LEA R1, STRING_start +CHECK_LOOP + LDR R2, R1, #0 + BRZ DONE + ST R5, saveR5palin + JSR POP ;R0 <- popped char + LD R5, saveR5palin + NOT R0, R0 + ADD R0, R0, #1 + ADD R0, R2, R0 ;R0 <- reach car - popped char + BRNP MISMATCH + ADD R1, R1, #1 + BRNZP CHECK_LOOP +MISMATCH + ADD R5, R5, #1 +DONE ;end + + HALT + +STRING_start .stringz "kayok" + +saveR5palin .BLKW 1 + + + +;;; Pushes R0 at the top of the stack +;;; IN: R0 +;;; OUT: R5 (0-success; 1 fail) +;;; USES: R3: stack end, R4: stack_top + + + + +PUSH + ;; Save registers + ST R3, saveR3push + ST R4, saveR4push + ;; Set R5 to 0 + AND R5, R5, #0 + ;; Lod top and end + LD R3, stack_end + LD R4, stack_top + ;; check full: end-1 = top + ADD R3, R3, #-1 + NOT R3, R3 + ADD R3, R3, #1 + Add R3, R4, R3 ;R3 = top - (end -1) + BRz OVERFLOW + ;; not overflow + STR R0, R4, #0 ;push R0 + ADD R4, R4, #-1 + ST R4, stack_top ;move top of stack up by one + BRNZP PUSH_DONE +OVERFLOW + ADD R5, R5, #1 +PUSH_DONE + ;; restore registers + LD R3, saveR3push + LD R4, saveR4push + RET + + saveR4push .BLKW 1 + saveR3push .BLKW 1 + +;;; POPs and stores in R0 +;;; IN: none +;;; OUT: R5 (0-success; 1 fail); poped value in R0 +;;; USES: R3: stack_start, R4: stack_top + +POP + ;; Save registers + ST R3, saveR3pop + ST R4, saveR4pop + ;; Set R5 to 0 + AND R5, R5, #0 + ;; Lod top and end + LD R3, stack_start + LD R4, stack_top + ;; check full: start = top + NOT R3, R3 + ADD R3, R3, #1 + Add R3, R4, R3 ;R3 = top - start + BRz UNDERFLOW + ;; not underflow + ADD R4, R4, #1 ;update stack pointer + LDR R0, R4, #0 ;R0<- popped value + ST R4, stack_top + BRNZP POP_DONE +UNDERFLOW + ADD R5, R5, #1 +POP_DONE + ;; restore registers + LD R3, saveR3pop + LD R4, saveR4pop + RET + + saveR4pop .BLKW 1 + saveR3pop .BLKW 1 + + stack_start .FILL x3600 + stack_end .FILL x35F0 + stack_top .FILL x3600 + .END diff --git a/Fall2018/test.c b/Fall2018/test.c new file mode 100644 index 0000000..cffb548 --- /dev/null +++ b/Fall2018/test.c @@ -0,0 +1,30 @@ +#include <stdio.h> +#include <math.h> +// finding roots of a quadratic equations + +int main() +{ + float a,b,c,d,x1,x2; + scanf("%f %f %f",&a, &b,&c); + d = b*b - 4 * a * c; + if (d == 0) + { + x1 = -b / (2 * a); + x2 = x1; + printf("\n repeated root at %f", x1); + } + else if ( d > 0) + { + x1 = (-b + sqrt(d)) / (2 * a); + x2 = (-b - sqrt(d)) / (2 * a); + printf("\n real roots at %f %f", x1, x2); + } + else + { + x1 = sqrt(-d) / (2 * a); + x2 = -b/ (2 * a); + printf("\n complex roots at %f+i %f and %f -i %f", x2, x1, x2, x1); + } + + return 0; + } -- GitLab