2014-04-11 1 views
0

그래서 기본적으로 y86을 배웁니다. 나는이 C 코드를 가지고 있고 y86 어셈블리로 변환하려고 시도하고있다. 이 오류가 계속 :Y86, ADR 받기. 왜 이해가 안되는가

PC = 0x2058a090, Invalid instruciton address 
Stopped in 2 steps at PC = 0x2058a090. Exception 'ADR', CC Z=1, S=0, O=0 
Changes to registers: 
%esp: 0x00000000 0x00000004 

changes to memory: 

을 그리고 기본적으로이 C 코드 변환하려고 메신저 : 오류가 오는 곳

main: 
pushl %ebp 
rrmovl %esp, %ebp 
mrmovl 2(%ebp), %esi    #esi = 1 
mrmovl 4(%ebp), %ecx    #ecx = i 
mrmovl 8(%ebp), %edx    #edx = j 
mrmovl 12(%ebp), %ebx    #ebx = 5 
irmovl $1, %esi 
irmovl $0, %ecx     # i = 0 (ecx) 
irmovl $0, %edx     # j = 0 (edx 
irmovl $5, %ebx      
subl %edx, %ecx 
irmovl $0, %ecx 
jg L4 

L2:  #else statement 
irmovl $0, %ecx     #i = 0 
addl %esi, %edx 
rmmovl %edx, 8(%ebp)    #new value of j to j memory 
rmmovl %ecx, 4(%ebp)    #new value of i to i memory 
je End 


L4:  #if statement 
addl %ebx, %ecx     #add 5(ebx) to i(ecx) 
rmmovl %ecx, 4(%ebp)    #assign new value of i 
je End 

End: 
rrmovl %ebp, %esp 
popl %ebp 
ret 

사람이 말해 줄 수 :

int main(){ 
int i, j; 
i = 0; 
j = 0; 

if(i>j){ 
    i=i+5; 
} 
else{ 
    i = 0; 
    j++; 
} 
} 

Y86 코드를 에서? ADR은 프로그램이 잘못된 메모리 주소를 쓰거나 읽으려고한다는 것을 의미합니다. 감사합니다.

답변

0

스택이 제대로 설정되지 않은 것 같습니다. 따라서 ESP을 먼저 초기화하고 기능 완료 후 ret이 점프하여 프로그램을 종료 할 수 있는지 확인해야합니다.

오류에서 esp = 0을 볼 수 있습니다.

+0

정확하게 초기화 할 수있는 방법은 무엇입니까? 'rrmovl % esp, % ebp' 문을 작성했을 때 초기화되지 않습니다 – TheLaz

+0

그리고 ebp는 어디서 오는가? 'mov esp, ebp'는 스택 프레임을 만드는 것입니다. 아무것도 초기화하지 않습니다. 그리고 물론, 당신의 첫 진술은 이미 존재하지 않는 스택을 이미 사용하고있는'push'입니다. – Devolus

+0

책에서 내가 처음부터 코드 예제를 사용하기 때문에 처음 두 문장을 그대로 둡니다. 나는 y86 코드를 어떻게 시작하는지 정확하게 알지 못했기 때문에 함께 갔다. – TheLaz

관련 문제