gpt4 book ai didi

c++ - 使用 EBP 从堆栈中获取参数

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:10 25 4
gpt4 key购买 nike

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

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 ,我不知道我错过了什么。谢谢!

最佳答案

请记住,main 的原型(prototype)是 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

关于c++ - 使用 EBP 从堆栈中获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27005853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com