+ -
当前位置:首页 → 问答吧 → 用汇编调用printf遇到的问题

用汇编调用printf遇到的问题

时间:2011-05-09

来源:互联网

C/C++ code

    char str[100] = {'w','x','q',0,'h','h',0};
    char* szstr = str;
    char format[] = "%s,%s\n";
    char* pstr[] = {format,szstr,szstr += strlen(szstr)+1};
    for (int i = 1;i>=0;i--)
    {
        __asm
        {
            lea  eax,DWORD PTR pstr[i]
            push eax
        }
        if (i==0)
        {
            __asm
            {
                lea  eax,DWORD PTR format
                push eax
                call DWORD PTR printf
            }
        }
    }



我遇到个问题就是要把str按照format打印,str是一个字符串的流不一定有多少个字符串format是和str对应的,我想不到怎么做,好不容易想到用内联汇编好像可以解决,不知道上面的代码为什么不行呢?for循环里面没有esp的操作啊

作者: wxq1987525   发布时间: 2011-05-09

cdecl函数需要调用者清理堆栈

作者: Areslee   发布时间: 2011-05-09

恩即使清理了还是不对啊,不知道为什么。会有访问异常

作者: wxq1987525   发布时间: 2011-05-09

C/C++ code
#include <stdio.h>

int main(int argc,char *argv[])
{
    int i;
    char str[100] = {'w','x','q',0,'h','h',0};
    char* szstr = str;
    char format[] = "%s,%s\n";
    char* pstr[] = {
        format,
        szstr,
        szstr+(strlen(szstr)+1)
    };
    for (i=2; i>0; i--) {
        __asm {
            mov  ecx,i
            lea  eax,pstr
            mov  eax,[eax+ecx*4]
            push eax
        }
        if (i==1) {
            __asm {
                lea  eax,format
                push eax
                call printf
                add esp,0x0c
            }
        }
    }
    return 0;
}

作者: va_zaixuexi   发布时间: 2011-05-09

楼主你干嘛不用va_start来解决?

作者: Areslee   发布时间: 2011-05-09