压栈方式调用函数

gdb操作技巧

开启汇编调试

set disassemble-next-line on

2.汇编单步调试命令
(gdb) si
(gdb) ni

退出layout:ctrl+x 再a键

代码

基于64位,用pushl会编译报错,查看了C编的程序都用pushq 压栈8字节

.section .data
base:
    .int 100
plus_no:
    .int 8

.section .text
.globl _start
_start:
    nop
    pushq base            #将函数所需参数压入堆栈顶部
    pushq plus_no
    call cal_func

    movl $1, %eax
    int $0x80

cal_func:
    pushq   %rbp
    movq    %rsp, %rbp

    movl $0, %eax
    addl 16(%rbp), %eax     # pushq 有值的时,rsp会+8,push两次所以偏移16
    addl 24(%rbp), %eax
    movl %eax, %ebx

    popq    %rbp
    ret

汇编指令了解

 汇编代码

#func.s
.section .data
base:
    .int 100
.section .bss
    .lcomm result, 4

.section .text
.globl _start
_start:
    nop
    movl $8, %eax
    call cal_func

    movl $1, %eax
    movl result, %ebx
    int $0x80

cal_func:
    addl $10, %eax
    addl base, %eax
    movl %eax, result
    ret

dump二进制

0000000 457f 464c 0101 0001 0000 0000 0000 0000
0000010 0002 0003 0001 0000 8074 0804 0034 0000
0000020 01f4 0000 0000 0000 0034 0020 0002 0028
0000030 0007 0006 0001 0000 0000 0000 8000 0804
0000040 8000 0804 009b 0000 009b 0000 0005 0000
0000050 1000 0000 0001 0000 009b 0000 909b 0804
0000060 909b 0804 0004 0000 0009 0000 0006 0000
0000070 1000 0000 b890 0008 0000 0de8 0000 b800
0000080 0001 0000 1d8b 90a0 0804 80cd c083 030a
0000090 9b05 0490 a308 90a0 0804 64c3 0000 0000
00000a0 0000 0000 0000 0000 0000 0000 0000 0000
00000b0 0000 0000 8074 0804 0000 0000 0003 0001
00000c0 0000 0000 909b 0804 0000 0000 0003 0002
00000d0 0000 0000 90a0 0804 0000 0000 0003 0003
00000e0 0001 0000 0000 0000 0000 0000 0004 fff1
00000f0 0005 0000 909b 0804 0000 0000 0000 0002
0000100 000a 0000 90a0 0804 0004 0000 0001 0003
0000110 0011 0000 808c 0804 0000 0000 0000 0001
0000120 0000 0000 0000 0000 0000 0000 0004 fff1
0000130 001a 0000 909c 0804 0000 0000 0001 0002
0000140 0035 0000 8074 0804 0000 0000 0010 0001
0000150 0030 0000 909f 0804 0000 0000 0010 0003
0000160 003c 0000 909f 0804 0000 0000 0010 0002
0000170 0043 0000 90a4 0804 0000 0000 0010 0003
0000180 3400 6f2e 6200 7361 0065 6572 7573 746c
0000190 6300 6c61 665f 6e75 0063 475f 4f4c 4142
00001a0 5f4c 464f 5346 5445 545f 4241 454c 005f
00001b0 5f5f 7362 5f73 7473 7261 0074 655f 6164
00001c0 6174 5f00 6e65 0064 2e00 7973 746d 6261
00001d0 2e00 7473 7472 6261 2e00 6873 7473 7472
00001e0 6261 2e00 6574 7478 2e00 6164 6174 2e00
00001f0 7362 0073 0000 0000 0000 0000 0000 0000
0000200 0000 0000 0000 0000 0000 0000 0000 0000
0000210 0000 0000 0000 0000 0000 0000 001b 0000
0000220 0001 0000 0006 0000 8074 0804 0074 0000
0000230 0027 0000 0000 0000 0000 0000 0001 0000
0000240 0000 0000 0021 0000 0001 0000 0003 0000
0000250 909b 0804 009b 0000 0004 0000 0000 0000
0000260 0000 0000 0001 0000 0000 0000 0027 0000
0000270 0008 0000 0003 0000 90a0 0804 009f 0000
0000280 0004 0000 0000 0000 0000 0000 0004 0000
0000290 0000 0000 0001 0000 0002 0000 0000 0000
00002a0 0000 0000 00a0 0000 00e0 0000 0005 0000
00002b0 000a 0000 0004 0000 0010 0000 0009 0000
00002c0 0003 0000 0000 0000 0000 0000 0180 0000
00002d0 0048 0000 0000 0000 0000 0000 0001 0000
00002e0 0000 0000 0011 0000 0003 0000 0000 0000
00002f0 0000 0000 01c8 0000 002c 0000 0000 0000
0000300 0000 0000 0001 0000 0000 0000
000030c

 objdump -d 4

4:     file format elf32-i386


Disassembly of section .text:

08048074 <_start>:
 8048074:       90                      nop
 8048075:       b8 08 00 00 00          mov    $0x8,%eax
 804807a:       e8 0d 00 00 00          call   804808c <cal_func>
 804807f:       b8 01 00 00 00          mov    $0x1,%eax
 8048084:       8b 1d a0 90 04 08       mov    0x80490a0,%ebx
 804808a:       cd 80                   int    $0x80

0804808c <cal_func>:
 804808c:       83 c0 0a                add    $0xa,%eax
 804808f:       03 05 9b 90 04 08       add    0x804909b,%eax
 8048095:       a3 a0 90 04 08          mov    %eax,0x80490a0
 804809a:       c3                      ret

 从指令找到

b890 0008 0000 0de8 0000 b800

小段序对应90(nop)开始

90b8 0800 0000 e80d 0000 00b8

参考

linux平台学x86汇编(十四):函数的使用_汇编.type %function-CSDN博客

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenxuezhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值