FASM-如何在没有堆栈的情况下做到这一点?

时间:2018-11-08 18:59:10

标签: fasm

我编写了一个程序,要求用户输入姓名并在FASM中将其显示在屏幕上。我使用堆栈,但是我想知道如果没有堆栈该如何做。 这是有效的代码:

format elf executable
entry _start

segment readable
    msg db 'What is your name: '
    msg.length = $-msg
    msg2 db 'Your name is: '
    msg2.length = $-msg2

segment readable writeable
    name db ?

segment readable executable
_start:
    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,msg.length
    int 80h

    mov eax,3
    mov ebx,1
    mov ecx,name
    mov edx,20
    int 80h

    push eax

    mov eax,4
    mov ebx,1
    mov ecx,msg2
    mov edx,msg2.length
    int 80h

    mov eax,4
    mov ebx,1
    mov ecx,name
    pop edx
    int 80h

    mov eax,1
    mov ebx,0
    int 80h

我试图做这样的事情:

format elf executable
entry _start

segment readable
    msg db 'What is your name: '
    msg.length = $-msg
    msg2 db 'Your name is: '
    msg2.length = $-msg2

segment readable writeable
    name db ?
    name.length db ?

segment readable executable
_start:
    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,msg.length
    int 80h

    mov eax,3
    mov ebx,1
    mov ecx,name
    mov edx,20
    int 80h

    mov dword [name.length],eax

    mov eax,4
    mov ebx,1
    mov ecx,msg2
    mov edx,msg2.length
    int 80h

    mov eax,4
    mov ebx,1
    mov ecx,name
    mov edx,dword [name.length]
    int 80h

    mov eax,1
    mov ebx,0
    int 80h

代码正在编译,没有错误,但是当我运行它并输入名称(例如“ debos”)时,我得到: Your name is: d和一些奇怪的字符 代替: Your name is debos类似于第一个代码。 有人可以告诉我我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:0)

msg.length是一个常量,因此您不能覆盖它。如果需要,应该将其存储在变量中。

答案 1 :(得分:0)

名称应该声明为字节数组,而不是单个字节(db)。

segment readable writeable
name db 100 dup(?)        ;or simply name rb 100
name.length dd ?

name.length 应该是双字,而不是字节。在FASM可执行格式中,代码段紧接在数据段的最后一个字节之后,因此它解释了为什么打印出乱码,因为它重叠了。这只是ELF可执行文件格式的本质。