2014-05-15 9 views
0

나는 현재 다음과 같은 문제에 붙어있다가 포함되어 있습니다. 나는 단지 1 개의 스택 블록 정수로 작업하기 때문에 잘못된 레지스터가 그 레지스터에 얼마나 많은 영향을 미치는지 궁금합니다. 아래는 내 jasmin-java-bytecode이며, 잘 컴파일되지만 실행시 오류가 발생합니다.자바 바이트 코드 (1) 등록은 잘못된 유형을

을 .class 공공하여 HelloWorld .super 자바/랭/객체

.method public static fakultaet(I)I 
.limit locals 100 
.limit stack 100 

ldc 4 

istore 0 


ldc 1 

istore 2 
START: 
iload 0 

iload 2 

isub 
ifne ENDE 
iload 0 

ldc 1 

imul 
istore 1 

iload 2 

ldc 1 

iadd 
istore 2 

goto START 
ENDE: 
getstatic java/lang/System/out Ljava/io/PrintStream; 
iload 1 

invokevirtual java/io/PrintStream/println(I)V 

iload 1 
ireturn 


.end method 
.method public static main([Ljava/lang/String;)V 
.limit stack 100 
.limit locals 100 



ldc 1 

istore 0 


ldc 2.0 

fstore 1 


ldc 3 

istore 2 

ldc 3 

ldc 2 

iadd 
istore 0 

ldc 3 

invokestatic HelloWorld/fakultaet(I)I 

return 

.end method 

그리고이 오류가 생성 :

Exception in thread "main" java.lang.VerifyError: (class: HelloWorld, method: fakultaet signature: (I)I) Register 1 contains wrong type 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2451) 
    at java.lang.Class.getMethod0(Class.java:2694) 
    at java.lang.Class.getMethod(Class.java:1622) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 

답변

0

I 어 (재스민 너무 익숙하지 난 ... 소프트웨어)하지만 여기에 몇 가지 문제가있는 것처럼 보입니다. 초기화되지 않았을지라도 레지스터 1에 저장 중입니다. 당신의 START 라벨의 앞에

ldc 1 
istore 1 

를 추가하면 적어도 클래스를 컴파일하고로드 할 수 있습니다.

그러나 여전히 원하는 결과가 아닌 1 만 인쇄됩니다. 카운터 인수 사이 차이가 제로 (그래서 없는 상태에서 루프 를 실행하려는 때문에 최대한 멀리 볼 수있는, 조건

ifne ENDE 

실제로

ifeq ENDE 

을해야한다 카운터와 인수가 같을 때, 즉 그들의 차이가 일 때이 0 일 때 끝까지 가야합니다.

: 또한

다음 부분 (실제 루프)

... 
ifeq ENDE 
iload 0 
ldc 1 
imul 
istore 1 
iload 2 
ldc 1 
iadd 
istore 2 
goto START 

는 1. 수/대신 카운터를 증가시키고, 각 패스에서이 카운터 결과를 승산한다과 파라미터의 승산에 유지

... 
ifeq ENDE 
iload 2 
ldc 1 
iadd 
istore 2 
iload 1 
iload 2 
imul 
istore 1 
goto START 

은 BTW :이 파고 동안, 나는 jd-gui 도움을 얻었다 : 당신은 드래그 - 앤 - 드롭 디 컴파일러 창에 .class 파일을, 그리고 코드가 어떤 의미가 있는지 확인할 수 있습니다.