Assembly 为什么我的ARM汇编计算器程序中出现Seg故障?

Assembly 为什么我的ARM汇编计算器程序中出现Seg故障?,assembly,raspberry-pi3,Assembly,Raspberry Pi3,我正在用Raspian OS上的ARM编写计算器程序;它是一个简单的计算器,使用反向波兰符号,只使用整数,只有4个运算(加法+,次-,乘法*,最大M)。代码还应作为连续循环运行 这是到目前为止我的代码,我可以输入值,但之后我得到一个seg故障 .global main .func main main: BL _scanf MOV R1, R0 BL _getchar MOV R3, R0 BL _scanf MOV R2, R0

我正在用Raspian OS上的ARM编写计算器程序;它是一个简单的计算器,使用反向波兰符号,只使用整数,只有4个运算(加法+,次-,乘法*,最大M)。代码还应作为连续循环运行

这是到目前为止我的代码,我可以输入值,但之后我得到一个seg故障

.global main
.func main

main:
    BL _scanf
    MOV R1, R0  

    BL _getchar
    MOV R3, R0

    BL _scanf
    MOV R2, R0

    BL _compare
    B   main

_getchar:
    MOV R7, #3      
    MOV R0, #0              
    MOV R2, #1            
    LDR R1, =read_char      
    SWI 0                
    LDR R0, [R1]           
    AND R0, #0xFF        
    MOV PC, LR            

_scanf:
    PUSH {LR}
    SUB SP, SP, #4          
    LDR R0, =format_str     
    MOV R1, SP             
    BL scanf                
    LDR R0, [SP]            
    ADD SP, SP, #4          
    POP {PC}                 

_compare:
   CMP R3, #'+'            
   BEQ _add     

   CMP R3, #'-'
   BEQ _sub

   CMP R3, #'*'
   BEQ _mul

   CMP R3, #'M'
   BEQ _max

_add:
   MOV R4, LR
   ADD R0, R1, R2
   MOV R0, R0
   BL printf
   MOV PC, R4

_sub:
   MOV R4, LR
   SUB R0, R1, R2
   MOV R0, R0
   BL printf
   MOV PC, R4

_mul:
   MOV R4, LR
   MUL R0, R1, R2
   MOV R0, R0
   BL printf
   MOV PC, R4

_max:
   MOV R4, LR
   CMP R1, R2
   BL printf
   MOV PC, R4


_exit:  
    MOV R7, #1        
    SWI 0  

  .data
  read_char:    .ascii  " "
  format_str:   .asciz  "%d"
我为糟糕的格式提前道歉,但这是我第一次。
谢谢。

这里有一些非常粗糙的代码供参考

  • 没有用于捕获错误用户输入的控件,因此可以添加代码 为此
  • 假设数字小于2^31-1,因此您可以处理更大的问题 价值观
  • 您只有3个操作员,因此需要添加其他操作员 代码
  • 您还需要确保没有堆栈碰撞
.data prompt0:.asciz“请输入数字1:\n操作员:(添加: +,sub:-或multiply::\n第2个数字:\n“get0:”asciz“%d”get1:。asciz“%s”prompt1:。asciz“%d%c%d=%d\n”。对齐 4.text.global main.extern scanf、printf、exit main:nop

输出,例如:

pi@raspberrypi:~/asm $ ./calculator_001
Please enter number1: <enter>
operator: (add: +, sub: -, or multiply: *) <enter>
then number2: <enter>
1234
*
6789
1234 * 6789 = 8377626
pi@raspberrypi:~/asm$/计算器\u 001
请输入数字1:
运算符:(加法:+,分式:-,或乘法:)
然后第二个:
1234
*
6789
1234 * 6789 = 8377626

1)在_getchar中,您将重击R1,它将容纳第一个运算符。2) .data中的字符串不应该是
.align 4
-ed吗?您能够使用调试器吗?
pi@raspberrypi:~/asm $ ./calculator_001
Please enter number1: <enter>
operator: (add: +, sub: -, or multiply: *) <enter>
then number2: <enter>
1234
*
6789
1234 * 6789 = 8377626