我编写了一个程序,要求用户输入姓名并在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
类似于第一个代码。
有人可以告诉我我的代码有什么问题吗?
答案 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可执行文件格式的本质。