装配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
会计算地址并推送它。
我正在尝试对在汇编中看起来类似于“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
会计算地址并推送它。