我正在学习汇编程序并且到了我实际上不知道[variable]和之间的区别的地步variable.正如教程所说,两者都是指针,那么这有什么意义呢?为什么我有一个使用type Identifier前[]?我的汇编:nasm x86_64 running on Linux--> Ubuntu
在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)
一个使用寄存器和指针的小例子:
mov eax, 10意味着:将值 10 移入寄存器 EAX。在这种情况下,EAX 仅用于存储某些内容。EAX 包含什么对程序员来说根本无关紧要,因为无论如何它都会被擦除。
mov [eax], 10意思是:将值 10移入存储在 EAX 寄存器中的地址。在这种情况下,存储在 EAX 中的值对我们很重要,因为它是一个指针,这意味着我们必须去 EAX 寄存器查看包含什么,然后我们使用这个值作为访问地址。
使用指针时需要两个步骤:
转到 EAX,看看它包含什么值(例如 EAX = 0xBABA);
转到EAX指向的地址(在我们的示例中为 0xBABA)并在其中写入 10。
当然,指针不一定与寄存器一起使用,这个小例子只是解释它是如何工作的。
| 归档时间: |
|
| 查看次数: |
4424 次 |
| 最近记录: |