2 回答
TA贡献1818条经验 获得超7个赞
几件事:
0)我想这是64b linux环境,但是您应该这样说(如果不是,我的一些观点将无效)
1)int 0x80是32b调用,但您使用的是64b寄存器,因此应使用syscall(和不同的参数)
2)int 0x80, eax=4要求ecx包含要存储内容的内存地址,同时给它提供ASCII字符ecx=非法内存访问(第一次调用应返回错误,即为eax负值)。或使用strace <your binary>应显示错误的参数+返回的错误。
3)为什么addq $4, %rsp?对我来说毫无意义,您正在破坏rsp,因此下一个pop rcx将弹出错误的值,最后您将“向上”运行到堆栈中。
...也许还有更多,我没有调试它,这个列表只是通过阅读源代码(所以我什至可能在某些方面是错的,尽管这种情况很少见)。
顺便说一句,您的代码正在工作。它只是没有达到您的预期。但是,正如CPU的设计和代码中的编写一样,它可以很好地工作。无论是实现了您想要的目标还是有意义的目标,这都是不同的话题,但是不要怪怪硬件或汇编程序。
...我可以快速猜测一下例程可能是如何修复的(只是部分hack-fix,仍然需要syscall在64b linux下重写):
next:
cmpq $0, %rsi
jz bye
movq %rsp,%rcx ; make ecx to point to stack memory (with stored char)
; this will work if you are lucky enough that rsp fits into 32b
; if it is beyond 4GiB logical address, then you have bad luck (syscall needed)
decq %rsi
movq $4, %rax
movq $1, %rbx
movq $1, %rdx
int $0x80
addq $8, %rsp ; now rsp += 8; is needed, because there's no POP
jmp next
再一次不要尝试自己,只是从头开始写,所以让我知道它是如何改变情况的。
- 2 回答
- 0 关注
- 740 浏览
添加回答
举报