Assembly 计算作为字符串nasm给出的表达式

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

我正在用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  
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存储计算表达式的元素不是一个好主意。保留一个单独的表,编写宏,这些宏将“推送”和“弹出”元素,选择具有最高优先级的运算符元素,并计算基本的二进制和一元运算。这将更容易理解和调试。