【问题标题】:Assembly addressing mode and syntax汇编寻址模式和语法
【发布时间】:2017-01-25 11:19:50
【问题描述】:

我是汇编编程的新手,我在网上搜索教程和电子书。我发现了一些关于汇编语言语法的令人困惑的信息,例如in a tutorial我看了以下代码:

MOV EBX, [MY_TABLE]     ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110          ; MY_TABLE[0] = 110

在我读过的一本书中:

mov ax, [Data] ; normal direct memory addressing of a wor
mov ebx, Data ; ebx = & Data
3 mov ax, [ebx] ; ax = *ebx

所以当我们将MOV 一个包含在[] 中的变量写入EBX 这样的寄存器时,我们在寄存器中存储了什么值?该内存位置的地址或实际值?

【问题讨论】:

  • 语法取决于您忘记提及的汇编程序。但是[] 总是表示内存的内容,所以第一个例子是错误的。至少我不知道有任何汇编程序会以不同的方式工作。
  • @Jester 实际上在许多 AT&T 语法汇编器中,[] 表示表达式分组(例如 mov $foo*[bar+baz],%eax)而不是取消引用。
  • 你确定第一个例子是MOV,而不是LEA
  • 错误的教程是最糟糕的。避免这个;谁知道你还会发现什么其他令人困惑的错误。对于已经了解 NASM 的人来说,如果你真的尝试代码,这只是一个简单的错误/错误,但对于尝试学习 NASM 语法的人来说,有两个相互冲突的东西会非常令人困惑。 TutorialsPoint 以拥有大量不完全正确的信息而闻名。

标签: assembly x86 nasm


【解决方案1】:

来自the NASM manual

规则很简单,对内存位置的内容的任何访问都需要在地址周围加上方括号,而对变量的地址的任何访问都不需要.因此mov ax,foo 形式的指令将始终 引用编译时常量,无论是EQU 还是变量的地址;要访问变量bar内容,您必须编码mov ax,[bar]

所以

MOV EBX, [MY_TABLE]     ; Effective Address of MY_TABLE in EBX

错误:它没有将EBX 设置为地址,而是设置为MY_TABLE 地址中存储的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-16
    • 2014-01-03
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多