FASM-使用堆栈时程序不起作用

时间:2018-12-11 18:44:39

标签: stack strlen fasm

我想知道为什么在尝试使用堆栈时我的代码无法正常工作。 程序必须打印自己的名称。

这是不使用堆栈的代码,可以正常工作:

format elf executable
entry _start

segment readable executable
strlen:
    mov ebx,0
    strlen_loop:
        cmp byte [eax+ebx],0
        je strlen_end
        inc ebx
        jmp strlen_loop
    strlen_end:
        inc ebx
        ret
_start:
    mov eax,[esp+4]
    call strlen

    mov eax,4
    mov ecx,[esp+4]
    mov edx,ebx
    mov ebx,0
    int 80h

    mov eax,1
    mov ebx,0
    int 80h

以下是使用堆栈的代码(程序仅退出/不执行任何操作):

format elf executable
entry _start

segment readable executable
strlen:
    mov ebx,0
    strlen_loop:
        cmp byte [eax+ebx],0
        je strlen_end
        inc ebx
        jmp strlen_loop
    strlen_end:
        inc ebx
        ret
_start:
    mov eax,[esp+4]
    call strlen
    push ebx

    mov eax,4
    mov ebx,0
    mov ecx,[esp+4]
    pop edx
    int 80h

    mov eax,1
    mov ebx,0
    int 80h

1 个答案:

答案 0 :(得分:0)

我是Linux开发的新手,但是如果我了解您的问题,那么您在此程序段中有一个错误:

mov eax,4
mov ebx,0
mov ecx,[esp+4] ; you wrote 'push' instruction above so value of 4 is incorrect now
pop edx
int 80h

您只需交换这两行即可解决此问题:

pop edx
mov ecx,[esp+4]