linux 下汇编问题,高人指教,初学,在线等!!!!!!
cat ifthen.s
.file "ifthen.c "
.section .rodata
.LC0:
.string "The higher value is %d\n "
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp-------
andl $-16, %esp-------为什么要这样减24在加负16呢,这是干什么?
movl $0, %eax
subl %eax, %esp-----为什么给eax赋0,再和esp减,这是在做什么?为什么,不直接减?
movl $100, -4(%ebp)
movl $25, -8(%ebp)-------为什么要一会用ebp一会用esp呢用esp是不那个数往高地址方向存还是往低地址方向存呢?
movl -4(%ebp), %eax
cmpl -8(%ebp), %eax
jle .L2
movl -4(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
jmp .L3
.L2:
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
.L3:
movl $0, (%esp)
call exit
以上是按照professional assembly language 书上
#include <stdio.h>
int main()
{
int a = 100;
int b = 25;
if (a > b)
{
printf( "The higher value is %d\n ", a);
} else
printf( "The higher value is %d\n ", b);
return 0;
}这个例子反汇编的代码,有几点不明之处,请高手指教。
本人初学,高人指点,请尽量详细些。本人水平比较差,谢谢。
=================================
还有就是以上是书上提供的反汇编代码,我自己的,为什么是这样:
hoop@hoop-laptop:~$ cat ifthen.s
.file "ifthen.c "
.section .rodata
.LC0:
.string "The higher value is %d\n "
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
movl $100, -12(%ebp)
movl $25, -8(%ebp)
movl -12(%ebp), %eax
cmpl -8(%ebp), %eax
jle .L2
movl -12(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
jmp .L4
.L2:
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
.L4:
movl $0, %eax
addl $36, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4) "
.section .note.GNU-stack, " ",@progbits
是编译器的区别还是操作系统的区别呢,我用的是ubutun书上是debian不知是哪的不同?
[解决办法]
subl $24, %esp-------
andl $-16, %esp-------为什么要这样减24在加负16呢,这是干什么?
=============================================================
不是add,是and。这是做地址的16字节对齐,esp低4位清0。
movl $0, %eax
subl %eax, %esp-----为什么给eax赋0,再和esp减,这是在做什么?为什么,
=============================================================
不清楚。也许是调试版本。
movl $100, -4(%ebp)
movl $25, -8(%ebp)-------为什么要一会用ebp一会用esp呢用esp是不那个数往高地址方向存还是往低地址方向存呢?
=============================================================
使用[ebp-xx]这种方式通常是访问函数的局部变量。显然是低地址方向。
至于你反汇编的代码和书上的有所不同,应该是编译器的不同(或者编译选项不同)造成的。
[解决办法]
给esp减去24是给局部变量保留空间。
一般来说高级语言生成的代码用ebp作为基准来访问局部变量和参数,[ebp-xx]是局部变量,[ebp+xx]是参数。
“为什么给eax赋0,再和esp减”这个不清楚,估计是调试版本的代码。