linux不打印非打印字符串,使用AT&T语法将整数打印为字符串,使用Linux系统调用而不是printf...

我写了一个汇编程序来显示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

再次没有尝试自己,只是从头上写下来,所以让我知道它是如何改变的情况.

标签:x86,linux,assembly,x86-64,att

来源: https://codeday.me/bug/20190916/1807481.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值