Assembly 计算作为字符串nasm给出的表达式
我正在用NASM做一个计算器,它应该读取一个输入,即2+3并打印结果。 我要做的是将所有内容都推到堆栈中,弹出第二个数字(3),弹出操作符(+),比较看它是哪个操作符并跳转到相应的标签,然后弹出第一个操作符并执行操作 我的总和标签定义如下Assembly 计算作为字符串nasm给出的表达式,assembly,sum,nasm,Assembly,Sum,Nasm,我正在用NASM做一个计算器,它应该读取一个输入,即2+3并打印结果。 我要做的是将所有内容都推到堆栈中,弹出第二个数字(3),弹出操作符(+),比较看它是哪个操作符并跳转到相应的标签,然后弹出第一个操作符并执行操作 我的总和标签定义如下 sum: pop ebx add al, bl push eax jmp print 我的打印标签是: print: pop eax add ax, '0' mov [res], ax mov eax,4 mov ebx,1 mo
sum:
pop ebx
add al, bl
push eax
jmp print
我的打印标签是:
print:
pop eax
add ax, '0'
mov [res], ax
mov eax,4
mov ebx,1
mov ecx, res
mov edx, 2
int 80h
jmp final
但不是打印结果,而是打印一些奇怪的东西,比如“1O”
我所尝试的:
在我尝试使用总和标签之前:
pop eax
cmp byte[eax], '3'
je print2
pop edx
pop ebx
cmp byte[ebx], '2'
je print2
其中,edx是运算符“+”
eax应该是第3位,ebx应该是第2位,跳跃效果很好
我试过使用:
mov eax, 2
mov ebx, 3
mov edx, '+' ;edx is the operator
push eax
push ebx
和推杆
sub al,'0'
sub bl,'0'
在总结标签,看看我的问题是在另一部分的代码,但这是很好的工作
你知道哪里出了问题吗?术语:你想“计算”一个表达式,比如
2+3
。“Solve”是不合适的,除非它是像2+x=-3
这样的方程<如果eax的高字节已经为零,或者如果您只关心所推内容的低字节,则code>pop ebx/add al,bl
/push eax
可能是正确的。如果您已经处理了ASCII->整数转换。在执行单个步骤时,使用调试器查看寄存器中的值。我认为使用机器堆栈SS:ESP存储计算表达式的元素不是一个好主意。保留一个单独的表,编写宏,这些宏将“推送”和“弹出”元素,选择具有最高优先级的运算符元素,并计算基本的二进制和一元运算。这将更容易理解和调试。