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은 프로그램이 잘못된 메모리 주소를 쓰거나 읽으려고한다는 것을 의미합니다. 감사합니다.
정확하게 초기화 할 수있는 방법은 무엇입니까? 'rrmovl % esp, % ebp' 문을 작성했을 때 초기화되지 않습니다 – TheLaz
그리고 ebp는 어디서 오는가? 'mov esp, ebp'는 스택 프레임을 만드는 것입니다. 아무것도 초기화하지 않습니다. 그리고 물론, 당신의 첫 진술은 이미 존재하지 않는 스택을 이미 사용하고있는'push'입니다. – Devolus
책에서 내가 처음부터 코드 예제를 사용하기 때문에 처음 두 문장을 그대로 둡니다. 나는 y86 코드를 어떻게 시작하는지 정확하게 알지 못했기 때문에 함께 갔다. – TheLaz