c代码中asm块的奇怪行为

时间:2014-09-29 12:48:04

标签: c pointers assembly inline-assembly

我正在尝试创建一个'如何在C代码中使用asm块'的小例子。 在我的例子中,我试图增加我在C代码中创建的变量值。

这是我的代码:

int main()
{
    unsigned int i = 0;
    unsigned int *ptr1;

    // Get the address of the variable i.
    ptr1 = &i;

    // Show ECHO message.
    printf_s("Value before '_asm' block:");
    printf_s("\ni = %d (Address = ptr1: %d)\n\n", i, ptr1);

    _asm {

        // Copy the value of i from the memory.
        mov bx, word ptr [ptr1]

        // Increment the value of i.
        inc bx

        // Update the new value of i in memory.
       mov word ptr [ptr1], bx
    }

    // Show ECHO message.
    printf_s("Value after '_asm' block:");
    printf_s("\ni = %d (Address = ptr1: %d)\n\n", i, ptr1);

    // Force the console to stay open.
    getchar();

    return 0;
}

这是控制台中代码的结果:

  

'_asm'块之前的值:    i = 0(地址= ptr1:1441144)

     

'_asm'块之后的值:    i = 0(地址= ptr1:1441145)

这非常奇怪。我只想更新'i'变量的值,但它不起作用。 另外,指针'ptr1'现在指向下一个存储块...

为什么会这样?我该如何解决这个问题?

编辑:

感谢下面的评论,我解决了这个问题。 主要变化是这一行:

// Increment the value of i.
inc bx

由于我们想要增加变量'i'的VALUE,我们应该使用括号。 此外,bx寄存器现在应更改为'ebx',即32位寄存器。 由于使用'ebx'寄存器,表达'word ptr'应该替换为'dword ptr'。

编辑后的asm块的代码:

_asm {

    // Copy the value of i from the memory.
    mov ebx, dword ptr [ptr1]

    // Increment the value of i.
    inc [ebx]

    // Update the new value of i in memory.
    mov dword ptr [ptr1], ebx
}

0 个答案:

没有答案