【问题标题】:Direct memory addressing in Assembly and []汇编中的直接内存寻址和 []
【发布时间】:2017-02-12 10:57:32
【问题描述】:

我正在读这个https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture#General-purpose_registers_.2864-bit_naming_conventions.29

直接内存寻址它说:

.data
  my_var dw 0abcdh ; my_var = 0xabcd

.code
  mov ax, [my_var] ; copy my_var content into ax (ax=0xabcd)

我想知道,如果它的值不是 0xabcd,它会在没有 [] 的情况下复制到 ax 什么?

为什么首先是内容?不应该把 0xabcd 当作内存地址,然后去查看地址 0xabcd 处存储的内容吗?

【问题讨论】:

    标签: assembly x86 nasm addressing-mode


    【解决方案1】:

    my_var 是一个符号,指代某个内存地址。指令

    my_var dw 0abcdh
    

    使汇编器分配两个字节的存储空间,将值0abcdh 写入其中,然后让my_var 指向该存储空间的开头。

    评论my_var = 0xabcd想说明my_var指向的变量有这个值。要理解这一点,请注意在 C 等高级语言中,当您声明全局变量时,变量名总是被隐式取消引用:

    int foo = 1;
    // compiles to
    foo dw 1
    

    我想知道,如果它的值不是 0xabcd,它会在没有 [] 的情况下复制到 ax 什么?

    如果不使用内存引用,则会复制符号 my_var 的值,即该变量的地址。例如,

        mov ax, my_var
    

    就像你写的一样

        ax = &my_var;
    

    在 C 中。

    为什么首先是内容?是不是应该把 0xabcd 当作内存地址,去看看 0xabcd 这个地址到底存了什么?

    没有。为此,您需要两次内存访问,因为您首先需要获取my_var 的内容以获取0xabcd,然后从0xabcd 获取以获取其中的内容:

    mov bx,[myvar]
    mov ax,[bx]
    

    【讨论】:

    • If you do not use a memory reference, the value of the symbol my_var, i.e. the address of that variable, is copied. -- 这是否意味着在汇编中,不像在 HLL 中,变量默认是指针?
    • 另外,mov bx,[myvar] 获取 my_var 的内容,对吗?但这违背了这个答案stackoverflow.com/questions/42050480/… --- ....不会将 esp 的内容移动到 eax 中。
    • @Kotaa 一个(静态)变量是一块内存。符号指的是地址,因此变量的符号总是指该变量的地址。您不能在运行时更改符号的值,因为符号是在程序启动之前解析的。到您的链接:请注意,esp 是一个寄存器,而不是一个符号。寄存器可以包含值并且这些值可以改变。解释完全正确。
    • @Kotaa 您的困惑可能来自“包含”一词的两种不同用法。变量包含一个存储在其中的值。要访问该值,您可以使用变量的符号来获取变量的地址,然后从中加载。寄存器包含一个值。要访问此值,您可以使用mov 将其从寄存器复制到其他位置。由于值已经在寄存器中,因此不需要从内存加载(因此不需要括号)。
    • If you do not use a memory reference, the value of the symbol my_var, i.e. the address of that variable, is copied。 -- 这是否意味着在汇编中,不像在 HLL 中,变量默认是指针?
    【解决方案2】:

    科塔

    基本上:

    mov  ax, my_var   ; Moves the location of my_var into ax
    mov  ax, [my_var] ; Moves the content found at the address of my_var
    

    关于你的第二个问题。如果确实,my_var 应该持有指向另一个数据块的指针,那么:

    mov  eax, [my_var]  ; Get pointer stored at my_var
    mov  ebx, [eax]      ; Get data from pointer whose address is in eax
    

    【讨论】:

    • 请注意mov bx,[ax] 不是有效的寻址模式。
    • stackoverflow.com/questions/42050480/… 怎么样 --- mov eax,[esp] ===> 不会将 esp 的内容移动到 eax 中。
    • @Kotaa - 一开始有点令人困惑,但这取决于设计师选择的约定。 mov eax,esp 不能表示“获取 esp 的地址”,因为 esp 没有地址。所以它的意思是“从 esp 中获取价值”。就是这样。
    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多