【问题标题】:Accessing dynamic char array in inline assembly (VS2012)在内联汇编中访问动态字符数组(VS2012)
【发布时间】:2013-07-17 21:01:04
【问题描述】:

我在 Visual Studio 2012 Professional 中工作,我有这个代码:

 char* array = (char*) malloc(100);
 array[0] = 'H'; array[1] = 'e'; array[2] = 'l'; array[3] = 'l';array[4] = 'o';

 __asm {
    // Missing code here
    }

例如,如何使用内联汇编访问数组中的字符? 我试过了,但它只适用于数组中的第一个字符:

 mov eax, array[0]
 mov al, [eax] // Now al contains the 'H'

Buf 如果我将代码更改为“mov eax,array[1]”,它将不再起作用(访问冲突)。 我如何循环遍历数组?

编辑,已解决(我在 8 小时内无法回答自己的问题): 我发现代码有什么问题:

mov eax, array[0]
mov al, [eax]

实际上有效,但是 eax 值发生了变化,因为我修改了作为 eax 寄存器一部分的 al 寄存器,所以当我将它放入循环时,eax 值不再有效。 例如,将 eax 更改为 ebx 可以使其正常工作。

【问题讨论】:

  • 需要加载有效地址。 lea eax, array 然后在需要时将 eax 作为指针递增。然后作为 mov al,[eax] 访问,但这可能只对 32 位系统有效。
  • @huseyin 不幸的是,这不起作用,al 寄存器中的最终值不是我放入数组中的任何字符。

标签: c++ visual-studio visual-c++ assembly inline-assembly


【解决方案1】:

我发现代码有什么问题:

mov eax, array[0]
mov al, [eax]

实际上有效,但是 eax 值发生了变化,因为我修改了作为 eax 寄存器一部分的 al 寄存器,所以当我将它放入循环时,eax 值不再有效。例如,将 eax 更改为 ebx 可以使其正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多