C++ 内联程序集printf将整数解释为地址

C++ 内联程序集printf将整数解释为地址,c++,inline-assembly,C++,Inline Assembly,我正在尝试通过内联程序集进行阵列打印。Printf函数将堆栈上的值解释为它需要打印的地址,并导致错误屏幕截图:。如果我将地址传递给printf,它就会打印出如下垃圾值:屏幕截图:。 另外,如果有人知道-如何在具有内联ASM的字符串中放置“\n”?谢谢: int main() { int mas[5] = { 1,2,3,4,5 }; int32_t diff = sizeof(int); __asm { mov esi, 0x0

我正在尝试通过内联程序集进行阵列打印。Printf函数将堆栈上的值解释为它需要打印的地址,并导致错误屏幕截图:。如果我将地址传递给printf,它就会打印出如下垃圾值:屏幕截图:。 另外,如果有人知道-如何在具有内联ASM的字符串中放置“\n”?谢谢:

int main()
{
    int mas[5] = { 1,2,3,4,5 };
    int32_t diff = sizeof(int);
    __asm
    {
        mov esi, 0x0

        lea ecx, [mas]
        mov eax, [ecx]
        push ecx
        call printf; Here it tries to read value '1' as an address
        pop eax

        loop_t:

        xor ebx, ebx; Clear the registers
        xor ecx, ecx;

            lea ecx, [mas]; ECX = &mas
            mov ebx, diff;
        add ebx, ecx; &mas + diff
        mov eax, [ebx]; Transfer the value
        push eax; Push it on stack
        call printf; Same thing here, interprets it as an address
            pop eax;
            add diff, 0x4;
            inc esi; Cleanup process and looping back on
            cmp esi, 0x5;
            jne loop_t;
    }
}

printf函数的第一个参数是格式字符串,即指向以null结尾的字符数组的第一个字符的指针。因此,第一个参数将始终被视为地址


如果最后将值1推到堆栈上,将其作为第一个参数传递给printf,那么它将尝试从地址1读取格式字符串,这将失败。

这很奇怪。因为在一些简单的情况下,比如在堆栈上按下const char值,它会读取并打印它correctly@Raicha:通过在堆栈上按const char值,您的意思是实际上在堆栈上按单个ASCII码值,而不是按char?const char*的地址address@Raicha:但在您的第一条评论中,您写了const char value,不是常量字符*?这是一个错误吗?@Raicha:如果您将一个简单的字符串地址作为printf的第一个参数传递给以null结尾的字符数组的第一个元素,那么这可能会起作用,因为它被视为格式字符串。这就像写printf,这是一个字符串;这不是printf%s,而是一个字符串;如果字符串包含格式化字符,如“%”,则此操作无效。在这种情况下,必须用两个“%”转义这些格式字符。