【问题标题】:Why does this given a seg fault?为什么这会出现段错误?
【发布时间】:2013-01-29 17:56:46
【问题描述】:

我想从另一个例程而不是从启动例程(这是入口点)打印argv[1](在 C 终端学中)。但它给出了一个段错误:

format ELF executable 3
entry start
segment readable executable

start:
    pop ebx ;argc
    pop ebp ;argv[0]
    call printarg

    ;; exit
    xor ebx,ebx
    mov eax,1
    int 80h

printarg:
    pop ebp ;argv[1]
    call puts
    ret
puts:
    pusha
    mov eax,ebp
    xor edx,edx
    ;; get string length
.loop1:
    cmp byte [eax],0
    je .loop2
    inc eax
    inc edx
    jmp .loop1
    ;; print it
.loop2:
    mov eax,4
    mov ebx,1
    mov ecx,ebp
    int 80h
    ;print a new line
    mov eax,4
    mov ebx,1
    mov ecx,NL
    mov edx,1
    int 80h 
    popa
    ret

segment readable writeable
NL db 0xA

谁能解释一下?

【问题讨论】:

  • 没有。 :( 真的好像?

标签: assembly segmentation-fault fasm


【解决方案1】:

你做不到

call something

然后

something:
  pop ebp

并期望它能够工作 - 在例程中,您弹出的内容是调用刚刚推送的返回地址。

【讨论】:

  • 谢谢。那么,可以在something 例程中访问程序的参数吗?
  • 当然 - 因为他们将刚刚超过返回地址,即[esp],一旦在例行程序中mov ebp, [esp+4] 代替你的pop ebp 应该给你argv[1]在ebp.
  • 真的。我只是忘记了。我今天有点沮丧。大声笑不知道为什么。无论如何,再次感谢您。
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 2015-04-17
  • 2011-05-18
  • 2020-07-26
  • 2019-04-17
  • 2011-12-27
相关资源
最近更新 更多