【问题标题】:How to store in a register the address of an element of an array in asm?如何将asm中数组元素的地址存储在寄存器中?
【发布时间】:2021-07-25 09:27:02
【问题描述】:
#include <stdio.h> 
void main()

{
//Variables

char string[] = "This is a string";

_asm {
    XOR EAX, EAX
    XOR EBX, EBX
    XOR ECX, ECX

    MOV EAX, [string]

}   

我想要做的是将字符串的第一个元素的内存地址存储在 EAX 中,但我得到 "Operand size conflict" 。我猜解引用的语法是错误的,因为 eax 和内存地址都应该是 32 位,但是我在堆栈溢出时找不到任何关于它的信息

这是在 Visual Studio 上使用 C 中的 _asm 完成的

【问题讨论】:

  • 您应该说明您正在使用的编译器和汇编器,因为它们之间的内联汇编细节差异很大。这看起来像一个 Visual C++ 类型的编译器,下面可能有一个 MASM 汇编器,所以你可能想要MOV EAX, OFFSET string

标签: assembly x86 inline-assembly


【解决方案1】:

MOV EAX, [string] 不起作用,因为 char 是 8 位而 eax 是 32 位寄存器只需使用 LEA 加载有效地址:

LEA EAX, [string]

注意:LEA 所做的是将 var 转换为 offset,因此编译器会像这样看到它:LEA MOV, [offset point to address]

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2013-05-14
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多