Assembly sscanf

问题描述 投票:0回答:1

我正在尝试在汇编中看起来像“ 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 
arrays assembly indexing scanf masm
1个回答
0
投票

我认为您想将数组元素的地址传递给sscanf。这意味着您需要执行exp + runtime_variable,而不是将两个符号地址添加到汇编时间常量中。请记住,汇编的每一行都必须是机器可以在一条指令中完成的工作。

首先,将循环计数器保存在ebx之类的寄存器中;根本不要使用称为i的静态变量。 (EBX,ESI,EDI,EBP不会被函数调用破坏,因此您可以像使用C中的局部变量那样在asm中使用它们中的任何一个。但是,您自己的调用者当然希望它们的这些值是保留,请在您的函数周围执行此操作。)

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

© www.soinside.com 2019 - 2024. All rights reserved.