程序集x86 - 调用C函数

时间:2015-11-11 12:04:44

标签: c assembly

我想知道是否可以在不声明数据段中的格式数组的情况下调用printf。这个问题与x86有关。

#include <stdio.h>

int main()
{
    __asm
    {
        push 1 ; number to print
        push 3710092110 ; format in ascii for %d\n
        call printf
        add esp, 8
    }

    return 0;
}

好的,所以我们需要推送格式的地址而不是格式本身,所以这样的东西应该足够接近吗?

#include <stdio.h>

int main()
{
    __asm
    {
        push 3710092110 ; 3710092110 = format in ascii for %d\n
        push 1; argument to print
        lea edx, dword ptr[esp + 4]; get address of the format on stack
        push edx ; push the address of the format
        call printf
        add esp, 12
    }

    return 0;
}

你们碰巧有时间展示一个有效的例子吗?在互联网上找不到任何关于它的东西。

2 个答案:

答案 0 :(得分:3)

通过在堆栈上按地址来传递格式字符串。所以你可以将字符串放在任何你喜欢的地方,但仍然需要传递它的地址。

答案 1 :(得分:3)

您的第二个代码段已接近但仍需要为格式字符串%d \ n 的内容使用不同的值。

所涉及的字符转换为 = 37, d = 100, \ n = 10十进制。
但使用十六进制更容易: = 25h, d = 64h, \ n = 0Ah 由于很少的努力,我们必须将第一个字符放在dword的最低字节中以推动堆栈。我们将最高字节为零,以便进行必要的空终止。

print 123 == '123' # false
print 123 is '123' # false
print str(123) == '123' # true
print '123' == '123' # true
print '123' is '123' # false

您的代码:

%d\n  -->  000A6425h