代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

一些内联汇编程序问题

  •  1
  • B.Gen.Jack.O.Neill  · 技术社区  · 14 年前

    我在这里已经问过类似的问题,但是我仍然有一些错误,所以我希望你能告诉我我做错了什么。只要知道我知道汇编程序,我在8051汇编程序中做过几个项目,即使不一样,也接近x86 asm。

    我在VC++ 2010 Express中尝试过的代码块(我正试图从CPUID指令中获取信息):

    int main()
    {
    char a[17]; //containing array for the CPUID string
    a[16] = '\0'; //null termination for the std::cout
    void *b=&a[0]; 
    int c=0; //predefined value which need to be loaded into eax before cpuid
    
    _asm
    {
        mov eax,c;
        cpuid;
        mov [b],eax;
        mov [b+4],ebx;
        mov [b+8],ecx;
        mov [b+12],edx;
    }
    std::cout<<a;
    }`
    

    请帮忙。谢谢。这只是为了学习,我知道CPUID有一些函数。。。。

    mov src,#number 但在VC++中,ASM mov dest,number 没有标志。那么如何告诉编译器你想直接访问内存单元地址x呢?

    2 回复  |  直到 11 年前
        1
  •  6
  •   Jim Mischel    14 年前

    堆栈损坏的原因是您正在存储 eax 在里面 b ebx 在内存位置 b+4 [b+4] 相当于C++表达式 &(b+4)

    如果你看的话可以看到这个 一步到位。一旦你执行 mov [b],eax

    解决问题的一种方法是加载 进入索引寄存器并使用索引寻址:

    mov edi,[b]
    mov [edi],eax
    mov [edi+4],ebx
    mov [edi+8],ecx
    mov [edi+12],edx
    

    一点也不,拿着一个指针 a lea (加载有效地址)指令:

    lea edi,a
    mov [edi],eax
    ... etc ...
    

    您还可以直接寻址内存:

    mov dword ptr a,eax
    mov dword ptr a+4,ebx
    ... etc ...
    

    我认为以上,与 利亚 (加载有效地址)指示和直接地址我显示回答您的最后一个问题。

        2
  •  0
  •   David Galloway    13 年前

    在调试器中打开寄存器窗口的建议,注意在VC++2010 Express中,事情如何改变是行不通的。

    你可能会和我一样惊讶地发现VC++ 2010 Express缺少注册窗口。这尤其令人惊讶,因为单步执行反汇编是可行的。

    我知道的唯一解决办法是打开一个监视窗口并在名称字段中键入寄存器名。如果需要,请键入EAX EBX ECX EDX ESI EDI EIP ESP EBP EFL和CS DS ES SS FS GS

    ST1 ST2 ST3 ST4 ST5 ST6 ST7也可以在监视窗口中工作。

    您可能还希望通过在“监视”窗口中单击鼠标右键并选中“十六进制显示”将该值设置为十六进制。