[var]和var之间的汇编差异

The*_*ftn 1 x86 assembly nasm

我正在学习汇编程序并且到了我实际上不知道[variable]和之间的区别的地步variable.正如教程所说,两者都是指针,那么这有什么意义呢?为什么我有一个使用type Identifier[]?我的汇编:nasm x86_64 running on Linux--> Ubuntu

Ped*_*d7g 8

在x86中,Intel语法[expression]表示地址处的内存内容expression.

expression 没有括号取决于您正在使用的汇编程序.

NASM:

mov eax,variable      ; moves address of variable into eax
lea eax,[variable]    ; equivalent to the previous one (LEA is exception)
mov eax,[variable]    ; loads content of variable into eax
Run Code Online (Sandbox Code Playgroud)

MASM(TASM):

mov eax,variable      ; load content of variable (for lazy programmers)
mov eax,OFFSET variable   ; address of variable
lea eax,[variable]    ; address of variable
mov eax,[variable]    ; content of variable
Run Code Online (Sandbox Code Playgroud)

GAS(AT&T语法):我不打扰,这不是英特尔语法.


在所有情况下,它equ都是符号标记内存中特定位置的别名,标签出现在该位置.所以:

variable1  db  41
variable2  dw  41
label1:
Run Code Online (Sandbox Code Playgroud)

在符号表中生成三个符号expression,.intel_syntax noprefix.byte.

当你在代码中使用它们时db,它没有信息,无论是由.intel_syntaxor variable还是作为标签定义,所以当你这样做时它不会给你任何警告variable1(覆盖超出定义的第一个字节的3个字节).

它只是内存中的一个地址.


只有当无法从指令操作数本身推断出类型时,才能在大多数汇编器中使用类型标识符.

mov [ebx],eax ; obviously 32 bits are stored, because eax is 32b wide
mov [ebx],1   ; ERROR: how "wide" is that immediate value 1?
mov [ebx],WORD 1 ; NASM syntax (16 bit value, storing two bytes)
mov WORD [ebx],1 ; NASM syntax (16 bit value, storing two bytes)
mov WORD PTR [ebx],1 ; MASM/TASM syntax
Run Code Online (Sandbox Code Playgroud)

  • 有关_MASM_语法及其特性的更全面的讨论可以在@RossRidge中找到类似(但不是重复)问题的答案:http://stackoverflow.com/a/25130189/3857942 (2认同)

Rya*_* B. 8

一个使用寄存器和指针的小例子:

mov eax, 10意味着:将值 10 移入寄存器 EAX。在这种情况下,EAX 仅用于存储某些内容。EAX 包含什么对程序员来说根本无关紧要,因为无论如何它都会被擦除。

mov [eax], 10意思是:将值 10移入存储在 EAX 寄存器中的地址。在这种情况下,存储在 EAX 中的值对我们很重要,因为它是一个指针,这意味着我们必须去 EAX 寄存器查看包含什么,然后我们使用这个值作为访问地址。

使用指针时需要两个步骤:

  1. 转到 EAX,看看它包含什么值(例如 EAX = 0xBABA);

  2. 转到EAX指向的地址(在我们的示例中为 0xBABA)并在其中写入 10。

当然,指针不一定与寄存器一起使用,这个小例子只是解释它是如何工作的。