Assembly 为什么我的ARM汇编计算器程序中出现Seg故障?
我正在用Raspian OS上的ARM编写计算器程序;它是一个简单的计算器,使用反向波兰符号,只使用整数,只有4个运算(加法+,次-,乘法*,最大M)。代码还应作为连续循环运行 这是到目前为止我的代码,我可以输入值,但之后我得到一个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
.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个操作员,因此需要添加其他操作员 代码
- 您还需要确保没有堆栈碰撞
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