gpt4 book ai didi

assembly - 从程序集调用 C 函数——应用程序在 "call printf"处卡住,我不知道为什么

转载 作者:行者123 更新时间:2023-12-04 14:52:58 25 4
gpt4 key购买 nike

我将从事一个大型的汇编项目,但现在才刚刚开始学习这种新语言。我正在尝试制作一些简单的示例,就像您在高中时可能会为 c++ 找到的示例(两个数字之和,是一个数素数等)。

现在我必须显示直到 n 的所有质数。问题是应用程序在“调用 printf”时卡住,我不知道为什么。

你能帮我解决这个问题吗?

.section    .data
prime_number_str:
.asciz "%d "

.section .text

.global _start
_start:
pushl $20
call .first_prime_numbers
addl $4, %esp
pushl $0
call exit


.first_prime_numbers: #argument first n numbers
movl 4(%esp), %ecx #get the first argument
do_test:
pushl %ecx #push function arguments
call .prime
addl $4, %esp #restore the stack

#if not prime jump to the next number
cmpl $0, %eax
je no_not_prime

#print the number
pushl %eax #save eax
pushl %ecx #first argument
pushl $prime_number_str #text to print
call printf
addl $4, %esp
popl %eax #restore eax

no_not_prime:
loop do_test
ret


.prime: #argument: number to check
movl 4(%esp), %eax #get the first argument

#divide the argument by 2
xorl %edx, %edx
movl $2, %ecx
pushl %eax #save the value of eax
divl %ecx
movl %eax, %ecx #init the counter register
popl %eax #restore the value of eax

movl $1, %ebx #assume the argument is prime
test_prime:
# if ecx == 1 then return exit the function
cmpl $1, %ecx
jle return_value

pushl %eax #save the old value of eax

#divide the value by the value of counter
xorl %edx, %edx
divl %ecx

#if the reminder is 0 then the number is not prime
cmpl $0, %edx
popl %eax #restore the value of eax
je not_prime


subl $1, %ecx #decrease counter
jmp test_prime #try next division

not_prime:
movl $0, %ebx
return_value:
movl %ebx, %eax
ret

最佳答案

可能是因为你的寄存器在调用printf后都乱了。 ,你需要保存printf之后你倾向于使用的寄存器然后在通话后恢复它们。

这是您应该始终做的事情 syscall或其他可能篡改您的寄存器的调用。

你也应该看看 gdb ( gnu 调试器 ) 看起来您正在编写 GAS,因此如果您使用的是 gnu/linux 系统,请尝试:

gdb youprogram

然后运行它以查看它失败的地方。

关于assembly - 从程序集调用 C 函数——应用程序在 "call printf"处卡住,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1550758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com