首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

linux 下汇编有关问题,高人指教,初学,

2012-03-19 
linux 下汇编问题,高人指教,初学,在线等!!!!!!catifthen.s.fileifthen.c .section.rodata.LC0:.stringT

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减”这个不清楚,估计是调试版本的代码。

热点排行