使用EBP从堆栈获取参数

时间:2014-11-18 23:05:55

标签: c++ c assembly

我需要一些帮助,我是装配语言的新手。 到目前为止我做了什么。 汇编代码:

extern puts
section .data
    test: db 'test',0

section .text
    global main
main:
    push ebp
    mov ebp, esp

    mov ecx, [ebp+12]
    push ecx
    call puts

    pop ecx

    mov eax,0
    leave
    ret 0x80

SO:Ubuntu 14.04.1 LTS,gcc版本4.8.2 使用nasm进行汇编:nasm -f elf32 2lab.asm并使用gcc gcc -lc -m32 2lab.o -o 2lab

进行编译

主要部分objdump -dS -M intel-mnemonic 2lab

的对象转储
080484a0 <main>:
 80484a0:       55                      push   ebp
 80484a1:       89 e5                   mov    ebp,esp
 80484a3:       8b 4d 08                mov    ecx,DWORD PTR [ebp+0xc]
 80484a6:       51                      push   ecx
 80484a7:       e8 44 fe ff ff          call   80482f0 <puts@plt>
 80484ac:       59                      pop    ecx
 80484ad:       b8 00 00 00 00          mov    eax,0x0
 80484b2:       c9                      leave  
 80484b3:       c2 80 00                ret    0x80

运行./2lab firstArg,输出为��������,如果我将mov ecx, [ebp+12]替换为mov ecx, [ebp+8],结果为Segmentation fault (core dumped)

哪里出错了?如果你以详细的方式回答,我将不胜感激。 由于是herehere,我不知道自己错过了什么。 谢谢!

2 个答案:

答案 0 :(得分:2)

请记住,main的原型是int main(int argc, char** argv)。请注意argv的类型为char**。您想要puts(argv[1]),但您实际上正在puts(argv)。知道argv[1]按定义意味着*(argv + 1)并且C指针算术按项目大小缩放,您需要将push ecx替换为push dword [ecx + 4]

PS:ret 0x80错误,您可能将retint 0x80混合在一起。你只想在这里ret

答案 1 :(得分:0)

您对puts()的字符串参数可能是错误的。检查其API并确保加载正确的参数。像puts()这样的字符串函数读取它们的输入,直到它们到达null终止符。如果他们没有找到一个并且读取内存超出范围,那么你将会出错。