使用AT&T语法将整数打印为字符串,使用Linux系统调用而不是printf
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用AT&T语法将整数打印为字符串,使用Linux系统调用而不是printf,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2014字,纯文字阅读大概需要3分钟。
内容图文
我写了一个汇编程序来显示AT&之后的数字的阶乘. t syntax.But它不工作.我的代码
.text
.globl _start
_start:
movq $5,%rcx
movq $5,%rax
Repeat: #function to calculate factorial
decq %rcx
cmp $0,%rcx
je print
imul %rcx,%rax
cmp $1,%rcx
jne Repeat
# Now result of factorial stored in rax
print:
xorq %rsi, %rsi
# function to print integer result digit by digit by pushing in
#stack
loop:
movq $0, %rdx
movq $10, %rbx
divq %rbx
addq $48, %rdx
pushq %rdx
incq %rsi
cmpq $0, %rax
jz next
jmp loop
next:
cmpq $0, %rsi
jz bye
popq %rcx
decq %rsi
movq $4, %rax
movq $1, %rbx
movq $1, %rdx
int $0x80
addq $4, %rsp
jmp next
bye:
movq $1,%rax
movq $0, %rbx
int $0x80
.data
num : .byte 5
这个程序什么都不打印,我也用gdb来直观地显示它工作直到循环功能,但是当它接下来一些随机值开始进入各种寄存器时.帮我调试以便它可以打印阶乘.
解决方法:
几件事:
0)我猜这是64b linux环境,但你应该这样说(如果不是,我的一些点将无效)
1)int 0x80是32b调用,但你使用64b寄存器,所以你应该使用syscall(和不同的参数)
2)int 0x80,eax = 4要求ecx包含存储内容的内存地址,而在ecx =非法内存访问时给它ASCII字符(第一次调用应返回错误,即eax为负值) .或者使用strace< your binary>应该揭示返回错误的参数错误.
3)为什么addq $4,%rsp?对我来说没有任何意义,你正在破坏rsp,所以下一个pop rcx会弹出错误的值,最后你会跑到堆栈中“向上”.
…也许更多,我没有调试它,这个列表只是通过阅读源(所以我可能甚至错了什么,虽然这是罕见的).
BTW您的代码正在运行.它只是没有做你期望的.但工作正常,正如CPU的设计和您在代码中所写的那样.无论是实现了你想要的,还是有意义的,那都是不同的主题,但不要责怪硬件或汇编程序.
…我可以快速猜测如何修复例程(只是部分修复,仍然需要在64b linux下重写syscall):
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
再次没有尝试自己,只是从头上写下来,所以让我知道它是如何改变的情况.
内容总结
以上是互联网集市为您收集整理的使用AT&T语法将整数打印为字符串,使用Linux系统调用而不是printf全部内容,希望文章能够帮你解决使用AT&T语法将整数打印为字符串,使用Linux系统调用而不是printf所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。