我正在尝试在汇编中看起来像“ 2.3 + 5.89”的字符串上调用sscanf。我想将值存储在名为“值”的数组中,并将运算符存储在名为“ op”的数组中。获得第一个值后,我遍历字符串以查找下一个空格并找到运算符的位置。我的问题是:如何使用sscanf获取数组“ op”中的运算符?我该给字符串'exp'+操作符的位置带来什么?还是有一个更简单的方法呢?
lea edi, dword ptr values
push dword ptr edi
push offset format
push offset exp
call sscanf
add esp, 12
mov esi,0
for_i:
inc i
mov bl,i
inc esi
cmp exp[esi],' '
jne for_i
inc i
lea esi, dword ptr op
push dword ptr esi
push offset format_op
push offset exp + i **--- here is my bug**
call sscanf
add esp, 12
我认为您想将数组元素的地址传递给sscanf
。这意味着您需要执行exp + runtime_variable
,而不是将两个符号地址添加到汇编时间常量中。请记住,汇编的每一行都必须是机器可以在一条指令中完成的工作。
首先,将循环计数器保存在ebx
之类的寄存器中;根本不要使用称为i
的静态变量。 (EBX,ESI,EDI,EBP不会被函数调用破坏,因此您可以像使用C中的局部变量那样在asm中使用它们中的任何一个。但是,您自己的调用者当然希望它们的这些值是保留,请在您的函数周围执行此操作。)
然后lea esi, [exp + esi*4]
/ push esi
将计算地址并将其推送。