【问题标题】:Assembly sscanf装配 sscanf
【发布时间】:2020-05-14 10:28:32
【问题描述】:

我试图在汇编中看起来像“2.3 + 5.89”的字符串上调用 sscanf。我想将值存储在名为“values”的数组中,并将字符串中的运算符存储在名为“op”的数组中。获得第一个值后,我遍历字符串以查找下一个空格并找到运算符的位置。我的问题是:如何使用 sscanf 获取数组“op”中的运算符?我会给字符串'exp'的offest +运算符的位置?或者有更简单的方法吗?

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】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多