Code Generation/Exercise 6: Difference between revisions

From Wiki**3

< Code Generation
(Redirected page to ist:Code Generation/Exercise 6)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
== The Original Code ==
#REDIRECT [[ist:Code Generation/Exercise 6]]
 
Consider the following C function:
 
<c>
int powmod(int base, int exp, int modulus) {
  int accum = 1, i = 0, basepow2 = base;
  while ((exp >> i) > 0) {
    if (((exp >> i) & 1) == 1)
      accum = (accum * basepow2) % modulus;
    basepow2 = (basepow2 * basepow2) % modulus;
    i++;
  }
  return accum;
}
</c>
 
== Postfix Code ==
 
The Postfix code for the above function is as follows:
 
<asm>
TEXT
ALIGN
GLOBL powmod, FUNC
LABEL powmod
ENTER 12
INT 1
LOCAL -4
STORE
INT 0
LOCAL -8
STORE
LOCAL +8
LOAD
LOCAL -12
STORE
 
ALIGN
LABEL while
LOCAL +12
LOAD
LOCAL -8
LOAD
SHTRU
INT 0
GT
JZ while_end
 
LOCAL +12
LOAD
LOCAL -8
LOAD
SHTRU
INT 1
AND
INT 1
EQ
JZ if_end
 
LOCAL -4
LOAD
LOCAL -12
LOAD
MUL
LOCAL +16
LOAD
MOD
DUP
LOCAL -4
STORE
TRASH 4
 
ALIGN
LABEL if_end
 
LOCAL -12
LOAD
LOCAL -12
LOAD
MUL
LOCAL +16
LOAD
MOD
DUP
LOCAL -12
STORE
TRASH 4
 
LOCAL -8
LOAD
DUP
INT 1
ADD
LOCAL -8
STORE
TRASH 4
 
JMP while
LABEL while_end
 
LOCAL -4
LOAD
POP
LEAVE
RET
</asm>
 
== Compiling and Running ==
 
To compile the Postfix code directly, [[pf2asm]] can be used:
 
pf2asm powmod.pf
yasm -felf powmod.asm
 
[[category:Compiladores]]
[[category:Ensino]]

Latest revision as of 18:15, 6 December 2018