linux汇编之——(5)反汇编运算样例

本文通过实例详细解析Linux环境下C语言中的赋值、自加、减法和乘法在汇编层面的实现。通过反汇编代码,展示了如何将值存储在内存或寄存器中,并执行基本算术操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 添加赋值语句赋值

int main(void)

{

    int a=1;

    //a =1;

    return0;

}

反汇编如下:

(gdb) disas main

Dump of assembler code for function main:

  0x080483b4 <+0>:       push   %ebp

  0x080483b5 <+1>:       mov    %esp,%ebp

  0x080483b7 <+3>:       sub    $0x10,%esp

  0x080483ba <+6>:       movl   $0x1,-0x4(%ebp)

  0x080483c1 <+13>:      mov    $0x0,%eax

  0x080483c6 <+18>:      leave 

  0x080483c7 <+19>:      ret   

End of assembler dump.

其中赋值语句是:movl$0x1, -0x4(%ebp)。即把值1赋值给地址 %ebp-0x4。

使用register修饰变量

int main(void)

{

   register int a = 1;

 

    returna;

}

反编译objdump后

080483b4 <main>:

 80483b4:    55                        push   %ebp

 80483b5:    89 e5                     mov    %esp,%ebp

 80483b7:    53                        push   %ebx

 80483b8:    bb 01 00 00 00             mov    $0x1,%ebx

 80483bd:    89 d8                     mov    %ebx,%eax

 80483bf:     5b                        pop    %ebx

 80483c0:     5d                        pop    %ebp

 80483c1:     c3                        ret   

可以看到变量a保存在寄存器ebx中

使用static修饰变量

int main(void)

{

    static   int a = 1;

 

    returna;

}

反编译:

080483b4 <main>:

 80483b4:    55                        push   %ebp

 80483b5:    89 e5                     mov    %esp,%ebp

 80483b7:    a1 10 a0 04 08             mov    0x804a010,%eax

 80483bc:     5d                        pop    %ebp

 80483bd:    c3                        ret   

 可见static修饰的静态全局变量,在编译时已经存储在堆空间地址0x804a010处。

2自加运算

int main(void)

{

    inta=1;

    a++;

    return0;

}

反汇编代码如下

(gdb) disas main

Dump of assembler code for function main:

  0x080483b4 <+0>:       push   %ebp

  0x080483b5 <+1>:       mov    %esp,%ebp

  0x080483b7 <+3>:       sub    $0x10,%esp

  0x080483ba <+6>:       movl   $0x1,-0x4(%ebp)

  0x080483c1 <+13>:      addl   $0x1,-0x4(%ebp)

  0x080483c5 <+17>:      mov    $0x0,%eax

  0x080483ca <+22>:      leave 

  0x080483cb <+23>:      ret   

End of assembler dump.

3 减法

int main(void)

{

   unsigned short a=1;

    a =a-1;

    return0;

}

反汇编如下

080483b4 <main>:

 80483b4:    55                        push   %ebp

 80483b5:    89 e5                     mov    %esp,%ebp

 80483b7:    83 ec 10                   sub    $0x10,%esp

 80483ba:    66 c7 45 fe 01 00           movw   $0x1,-0x2(%ebp)

 80483c0:     66 83 6d fe 01              subw   $0x1,-0x2(%ebp)

 80483c5:     b8 00 00 00 00             mov    $0x0,%eax

 80483ca:     c9                        leave

4 乘法

int main(void)

{

    inta=1;

    a =a*3;

    return0;

}

反汇编如下

080483b4 <main>:

 80483b4:    55                        push   %ebp

 80483b5:    89 e5                     mov    %esp,%ebp

 80483b7:    83 ec 10                   sub    $0x10,%esp

 80483ba:    c7 45 fc 01 00 00 00 movl   $0x1,-0x4(%ebp)

 80483c1:     8b 55 fc                    mov    -0x4(%ebp),%edx

 80483c4:     89 d0                     mov    %edx,%eax

 80483c6:     01 c0                     add    %eax,%eax

 80483c8:     01 d0                     add    %edx,%eax

 80483ca:     89 45 fc                    mov    %eax,-0x4(%ebp)

 80483cd:     b8 00 00 00 00             mov    $0x0,%eax

 80483d2:    c9                        leave 

 80483d3:    c3                        ret   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值