; findmax: PeANUt assembler (test) program for COMP2300 Lab Exercise 5: ; inputs a list of cardinals (terminated by 999) ; and outputs the maximum of the list ; #include ; #include "InOut.h" external ReadCard ; /* ReadCard, external WriteInt ; WriteInt */ external Max ; #include "max.h" /*Max*/ ; int main() { Sent: data 999 ; const int Sent=999; /* to terminate list */ ; mxn: block 1 ; short int mxn, /*current max. of the list*/ n: block 1 ; n; /*current elt. of list*/ findmax: ; load #0 ; mxn = 0; store mxn ; loada n ; ReadCard(n); /* AC = n (address) */ incsp #1 ; /* SP = SP + 1 */ store !0 ; /* Mem[SP] = AC; ie. push n on stack*/ call ReadCard ; incsp #-1 ; /* SP = SP - 1, ie. pop stack */ fwhile: load n ; while (n != Sent) { /* AC = Mem[n] */ cmp Sent ; /* compare AC, Mem[Sent] */ beq fendwh ; ; ; mxn = Max(n, mxn); ; ; ; ; ; ; ; ; ; ; ; /*scanf("%d",&n);*/ loada n ; ReadCard(n); /* AC = n (address) */ incsp #1 ; /* SP = SP + 1 */ store !0 ; /* Mem[SP] = AC; ie. push n on stack*/ call ReadCard ; incsp #-1 ; /* SP = SP - 1, ie. pop stack */ jmp fwhile ; } /*while*/ fendwh: ; /*printf("%4d",mxn);*/ load mxn ; WriteInt(mxn, 4); /* AC = Mem[mxn] */ incsp #1 ; /* SP = SP + 1 */ store !0 ; /* Mem[SP] = AC; ie. push Mem[mxn] on stack*/ load #4 ; /* AC = 4 */ incsp #1 ; /* SP = SP + 1 */ store !0 ; /* Mem[SP] = AC; ie. push 4 on stack*/ call WriteInt ; incsp #-2 ; /* SP = SP-2, ie. pop Mem[mxn],4 from stack*/ load #'\n' ; putchar('\n'); /* AC = '\n' */ trap #3 ; /* write AC to terminal */ trap #1 ; } /* main() */ end findmax ;