En tilsvarende IJVM metode ser således ud:int imul(int x, int y) { int p; int sign; sign = 1; if ( x < 0 ) { x = -x; sign = 0; } p = 0; while ( x > 0 ) { x = x - 1; p = p + y; } if ( sign == 0 ) p = -p; return p; }
Et hovedprogram med to argumenter er blevet udformet så imul metoden kan afprøves. Hovedprogrammet ser således ud:// Integer multiplication. .method imul .args 3 // ( int x, int y ) .define x = 1 .define y = 2 .locals 2 // int p, int sign; .define p = 3 .define sign = 4 bipush 1 istore sign // sign = 1 iload x IFLT if1 // ( x < 0 ) goto end_if1 if1: bipush 0 iload x isub istore x // x = -x bipush 0 istore sign // sign = 0 end_if1: bipush 0 istore p // p = 0; while: // while iload x ifeq end_while // ( x == 0 ) iload x iflt end_while // ( x > 0 ) // { iload x bipush 1 isub istore x // x = x - 1; iload p iload y iadd istore p // p = p + y; goto while // } end_while: iload sign IFEQ if2 // ( sign == 0 ) goto end_if2 if2: bipush 0 iload p isub istore p // ( p = -p ) end_if2: iload p ireturn // return p; .method main .args 1 .define OBJREF = 44 bipush OBJREF bipush -1 bipush 3 invokevirtual imul ireturn // return imul(-1,3)
Kørsler af hovedprogrammet med alle fire kombinationer af fortegn for argumenterne. Programmet gav (Kørslerne er foretaget med option -s så kun resultatet af funktionskaldene kan ses):bipush OBJREF bipush -1 bipush 3 invokevirtual imul ireturn // return imul(-1,3)
C-funktionen idiv er blevet rette og inkluderet i et C-program med henblik på afprøvning. Den er blevet afprøvet med alle kombinationer af fortegn for de to argumenter til C-funktionen. Den rettede C-funktion ser således ud:[smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc 2 4 return value: 8 [smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc 5 -3 return value: -15 [smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc -9 2 return value: -18 [smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc -7 -11 return value: 77 [smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc 0 3 return value: 0 [smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc 0 -8 return value: 0 [smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc -7 0 return value: 0 [smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc 2 0 return value: 0 [smunk@humulus:...dArkOS/uge39]$ ijvm -s imul.bc 0 0 return value: 0
En tilsvarende metode idiv er blevet udformet i IJVM. Den kom til at se sådan ud:/* Integer division. */ #include int idiv(int x, int y) { int q; int sign; if ( y != 0 ){ q = 0; sign = 0; if ( x < 0 ) { x = -x; sign++; } if ( y < 0 ) { y = -y; sign++; } while ( x >= y ) { x = x - y; q = q + 1;; } if (sign == 1) { q = -q; } return q; } return 0; } int main(int argc, char *argv[]) { printf("idiv(%d,%d) = %d.\n",5,-3, idiv(5,-3)); }
Den er blevet afprøvet med de samme testdata som den rettede C-funktion.// Integer division. .method idiv .args 3 // ( int x, int y ) .define x = 1 .define y = 2 .locals 2 // int q, int sign; .define q = 3 .define sign = 4 iload y IFEQ end_if1 // ( y == 0 ) iload x iflt if2 // ( x < 0 ) goto ty if2: bipush 0 iload x isub istore x // x = -x bipush 1 iload sign iadd // sign++ istore sign ty: iload y iflt if3 // ( y < 0 ) goto pre_w if3: bipush 0 iload y isub istore y // y = -y bipush 1 iload sign iadd // sign++ istore sign pre_w: bipush 0 istore q // q = 0 while: // while ( x >= y ) { iload x iload y isub iflt end_while // ( x >= y ) iload x iload y isub istore x // x = x - y bipush 1 iload q iadd istore q // q++ goto while // } end_while: bipush 1 iload sign isub IFEQ if4 // ( sign == 0 ) goto end_if2 if4: bipush 0 iload q isub istore q // ( q = -q ) goto end_if2 end_if1: bipush 0 ireturn // return 0; end_if2: iload q ireturn // return q .method main .args 1 .define OBJREF = 44 bipush OBJREF bipush -12 bipush 2 invokevirtual idiv ireturn // return imul(2,3);
Udtrykket fra SCO, side 342 er blevet beregnet af følgende IJVM program:
Resultatet var i overensstemmelse med resultatet i bogen. [smunk@humulus:...dArkOS/uge39]$ ijvm -s figur523.bc return value: 6.method main .args 1 .define OBJREF = 44 bipush OBJREF bipush 8 bipush OBJREF bipush 2 bipush 5 invokevirtual imul iadd bipush 1 bipush OBJREF bipush 3 bipush 2 invokevirtual imul iadd bipush 4 isub invokevirtual idiv ireturn // return aritmetisk udtryk