gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:45:18 30 4
gpt4 key购买 nike

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

最佳答案

在 x86 Intel 语法中 [expression]表示地址 expression 处的内存内容.
(除了在 MASM 中, expression 是数字文字或 equ 没有寄存器的常量, then it's still an immediate )

<小时/>

expression不带括号取决于您使用的汇编器。

NASM 风格(NASM、YASM):

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

MASM 风格(还有 TASM 甚至 GCC/GAS .intel_syntax noprefix):

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

GAS(AT&T 语法):这不是 Intel 语法,请参阅 the AT&T tag wiki 。 GAS 还使用不同的指令(例如 .byte 而不是 db ),即使在 .intel_syntax 中也是如此。模式。

<小时/>

在所有情况下 variable是标记内存中出现标签的特定位置的符号的别名。所以:

variable1  db  41
variable2 dw 41
label1:

在符号表中生成三个符号,variable1 , variable2label1 .

当您在代码中使用其中任何一个时,例如 mov eax,<symbol> ,它没有信息是否由 db 定义。或dw或作为标签,因此当您这样做时它不会给您任何警告 mov [variable1],ebx (覆盖超出定义的第一个字节的 3 个字节)。

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

(除了在 MASM 中,数据部分中标签后面的 db 或 dd 确实将大小与其“变量名称”相关联。)

<小时/>

当无法从指令操作数本身推导出类型时,大多数汇编器需要类型标识符。

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

关于[var] 和 var 之间的汇编差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39474332/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com