Implementing a Recursive Procedure with IA32 and Y86 Assembly Code
int rSum(int *start, int count)
{
if (count <= 0)
return 0;
return *start + rSum(start+1, count-1);
}
IA32 and Y86 assembly code is written to implement it. The two fragments of code are presented below. #IA32 assembly code to implement rSum #Y86 assembly code to implement rSum
rSum: rSum:
pushl %ebp pushl %ebp
movl %esp, %ebp rrmovl %esp, %ebp
subl $8, %esp pushl %ebx
movl 8(%ebp), %ecx mrmovl 8(%ebp), %ebx
movl 12(%ebp), %edx mrmovl 12(%ebp), %eax
xorl %eax, %eax
cmpl $0, %edx andl %eax, %eax
jle Done jle L1
leal -1(%edx), %eax irmovl $-1, %edx
movl %eax, 4(%esp) addl %edx, %eax
pushl %eax
leal 4(%ecx), %eax irmovl $4, %edx
movl %eax, (%esp) rrmovl %ebx, %eax
addl %edx, %eax
pushl %eax
call rSum call rSum
addl (%ecx), %eax mrmovl (%ebx), %edx
addl %edx, %eax
jmp Done
L1:
xorl %eax, %eax
Done: Done:
addl $8, %esp mrmovl -4(%ebp), %ebx
rrmovl %ebp, %esp
popl %ebp popl %ebp
ret ret
According to the comparison of IA32 and Y86 assembly programs, four distinctions are found and it is concluded:
1. Besides explicitly decreasing and increasing the stack pointer, pushl and popl can be utilized to both modify the stack pointer and to save and store the register state.
2. %eax, %ecx and %edx are caller-saved; %ebx, %edi and %esi are callee-saved.
3. Y86 integer operation instructions operate only on register data, whereas IA32 also allows operations on memory data.
4. In the case of using pushl to both modify the stack pointer and save the register data and, popl is unnecessary to restore the state.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Delicious 정식 교환 운영...며칠 전 에 정식으로 에서 에 교환하여 운영하고 베타 단계인' 에 들어갔다. 이번에 베타로 넘어가는 것은 US-West(최대 US-East가 아닌):www.delicious.com. 300 IN CNAME web-p...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.