Assembly 程序集x86-64中的分段故障(堆芯转储)

Assembly 程序集x86-64中的分段故障(堆芯转储),assembly,segmentation-fault,Assembly,Segmentation Fault,我在汇编中编写了一个代码,但我遇到了一个分段错误。如果您能帮助查找错误,我们将不胜感激。除了函数调用的堆栈使用外,我的内存中只有一个变量(输入),所以我真的不明白为什么会出现分段错误。。。这是我的代码(它是一个计算器): 我建议使用调试器来找出哪条指令是有故障的指令。还有,什么是有故障的输入?在\u start中,您有正确的结尾吗?缺少的函数中有什么?请注意,movq(input),%rdi正在加载64位(8字节),而不是您可能需要的1位。类似地,所有cmp指令默认默认访问4字节,您可能需要cm

我在汇编中编写了一个代码,但我遇到了一个分段错误。如果您能帮助查找错误,我们将不胜感激。除了函数调用的堆栈使用外,我的内存中只有一个变量(输入),所以我真的不明白为什么会出现分段错误。。。这是我的代码(它是一个计算器):


我建议使用调试器来找出哪条指令是有故障的指令。还有,什么是有故障的输入?在
\u start
中,您有正确的结尾吗?缺少的函数中有什么?请注意,
movq(input),%rdi
正在加载64位(8字节),而不是您可能需要的1位。类似地,所有
cmp
指令默认默认访问4字节,您可能需要
cmpb
<代码>movq输入,%rsi缺少一个
$
,因为您想在那里传递地址。对于
要打印的内容
可能也一样。谢谢!这真的很有帮助!问题:我是否不需要从一开始就开始编写.global?我可以只写section.bss和section.text部分吗?因为您以
ret
结尾,所以肯定还有其他东西在调用您的函数。例如,一个C驱动程序。我建议使用一个调试器来找出哪个指令是错误的。还有,什么是错误的输入?在
\u start
中,您有正确的结尾吗?缺少的函数中有什么?请注意,
movq(input),%rdi
正在加载64位(8字节),而不是您可能需要的1位。类似地,所有
cmp
指令默认默认访问4字节,您可能需要
cmpb
<代码>movq输入,%rsi缺少一个
$
,因为您想在那里传递地址。对于
要打印的内容
可能也一样。谢谢!这真的很有帮助!问题:我是否不需要从一开始就开始编写.global?我可以只写section.bss和section.text部分吗?因为您以
ret
结尾,所以肯定还有其他东西在调用您的函数。例如,C驱动程序。
.global _start

.section .bss
.lcomm input, 1

.section .text
.global calc_expr

calc_expr:
xor %rcx, %rcx
pushq %rbp
movq %rsp, %rbp

readchar: #reading character one by one from stdin
movq $0, %rax
movq $0, %rdi
movq input, %rsi
movq $1, %rdx
syscall

#character = (
cmp $40, (input)
jne no_new_parenthesis
call calc_expr
jmp readchar

no_new_parenthesis:
#character = new line
cmp $10, (input)
je end      

#character = )
cmp $41, (input)
je epilogue

#character = +
cmp $43, (input)
je plus

#character = -
cmp $45, (input)
je minus

#character = *
cmp $42, (input)
je multiply

#character = /
cmp $47, (input)
je divide

#character = number
pushq %rcx
movq (input), %rdi
call string_convert #convert string to number, from rdi into rax
popq %rcx
imul $10, %rcx, %rcx
add %rax, %rcx
jmp readchar

plus:
pushq %rcx
call calc_expr
popq %r8
addq %r8, %rcx
jmp readchar

minus: 
pushq %rcx
call calc_expr
popq %r8
subq %rcx, %r8
mov %r8, %rcx
jmp readchar

multiply:
pushq %rcx
call calc_expr
popq %r8
imul %r8, %rcx
jmp readchar

divide:
pushq %rcx
call calc_expr
popq %rax
xor %rdx, %rdx
idiv %rcx
mov %rax, %rcx
jmp readchar

end:
#convert number to string, from rdi into what_to_print, rax = length of string
movq %rcx, %rdi
call result_as_string

#printing result
movq %rax, %rdx
movq $1, %rax
movq $1, %rdi
movq what_to_print, %rsi
syscall

epilogue:
leave
ret