装配sscanf

Assembly sscanf

我正在尝试对在汇编中看起来类似于“2.3 + 5.89”的字符串调用 sscanf。我想将值存储在名为 'values' 的数组中,将字符串中的运算符存储在名为 'op' 的数组中。获得第一个值后,我遍历字符串以找到下一个 space 并找到运算符的位置。我的问题是:如何使用 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,而不是将两个符号地址添加到 assemble 时间常数中。请记住,每一行 asm 都必须是机器可以在一条指令中完成的事情。

首先,将循环计数器保存在像ebx这样的寄存器中;根本不要使用名为 i 的静态变量。 (EBX、ESI、EDI、EBP 不会被函数调用破坏,因此您可以在 asm 中使用它们中的任何一个,就像在 C 中使用局部变量一样。当然,您自己的调用者希望这些 regs 的值是保留所以围绕你的功能做。)

然后lea esi, [exp + esi*4] / push esi会计算地址并推送它。