我正在尝试创建一个'如何在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
}