我需要一些帮助,我是装配语言的新手。 到目前为止我做了什么。 汇编代码:
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)
答案 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
错误,您可能将ret
和int 0x80
混合在一起。你只想在这里ret
。
答案 1 :(得分:0)
您对puts()的字符串参数可能是错误的。检查其API并确保加载正确的参数。像puts()这样的字符串函数读取它们的输入,直到它们到达null终止符。如果他们没有找到一个并且读取内存超出范围,那么你将会出错。