gpt4 book ai didi

pointers - 如何获取变量的地址并在 nasm x86 程序集中取消引用它?

转载 作者:行者123 更新时间:2023-12-03 20:30:54 25 4
gpt4 key购买 nike

在 C 语言中,我们使用 & 获取变量的地址,使用 * 取消引用变量。


int variable=10;
int *pointer;
pointer = &variable;
如何在 nasm x86 汇编语言中做到这一点。
我阅读了 nasm 手册,发现 [ variable_address ] 的工作方式类似于取消引用。(我可能错了)。
section .data
variable db 'A'
section .text
global _start
_start:
mov eax , 4
mov ebx , 1
mov ecx , [variable]
mov edx , 8
int 0x80
mov eax ,1
int 0x80

我执行了这段代码,它什么也没打印。我不明白我的代码有什么问题。
需要您的帮助来理解 nasm x86 中的指针和取消引用。

最佳答案

汇编中没有变量。 (*)

variable db 'A'

做几件事。它定义了汇编时符号 variable ,就像书签到内存中一样,包含编译时*here*的地址。这与在空行上做标签是一样的,比如:
variable:
db 'A'指令是“定义字节”,你给它单字节值来定义,所以它会将单字节生成为结果机器码,值为 0x4165十进制。这就是 ASCII 编码中大字母 A 的值。

然后:
mov ecx , [variable]

是否从地址 variable 处的内存单元加载 4 个字节, 表示低 8 位 ecx将包含值 65 ,并且高 24 位将包含一些垃圾,这些垃圾恰好位于 'A' 之后的以下 3 个字节中。 ..(如果您使用 db 'ABCD' ,那么 ecx 将等于值 0x44434241 ( 'D' 'C' 'B' 'A' 字母,由于 dword 值在 x86 上的小端编码,以位“反转”)。

但是 sys_write期待 ecx保存存储内容字节的内存地址,因此您需要:
mov ecx, variable

那将在 NASM 中将数据的地址加载到 ecx .

(在 MASM/TASM 中,这将改为组装为 mov ecx,[variable] 并且要获取地址,您必须使用 mov ecx, OFFSET variable ,以防您碰巧找到一些 MASM/TASM 示例,请注意语法差异)。

*) 有关“无变量”的更多信息。请记住,在组装时您处于机器级别。在机器级别有计算机内存,它可以按字节寻址(在 x86 平台上!有一些平台,内存可以按不同大小寻址,它们并不常见,但在微 Controller 世界中你可能会发现一些)。因此,通过使用一些内存地址,您可以访问物理内存芯片中的某些特定字节(内存芯片中的哪个特定物理位置被寻址取决于您的平台,现代操作系统通常会给用户应用程序虚拟寻址空间,转换为CPU 动态地、透明地获取物理地址,无需打扰用户代码关于该转换)。

所有高级逻辑概念,如“变量”、“数组”、“字符串”等……都只是内存中的一堆字节值,所有这些逻辑含义都由正在执行的指令赋予内存数据。当您在没有指令上下文的情况下查看这些数据时,它们只是内存中的一些字节值,仅此而已。

因此,如果您对代码不精确,并且通过指令获取访问单字节“变量” dword ,就像您在 mov ecx,[variable] 中所做的那样例如,从机器的角度来看,这并没有错,它会很高兴地将 4 个字节的内存提取到 ecx 中。注册,NASM 也懒得报告您,您可能越界访问超出原始范围的内存 variable定义。如果您从“变量”和其他高级编程语言概念等方面考虑,这是一种愚蠢的行为。但是汇编并不是为了这样的工作,实际上对机器的完全控制是汇编的主要目的,如果你想获取4个字节,你可以,这完全取决于程序员。它只需要极高的精度和对细节的关注,注意您的内存结构布局,并使用具有所需内存操作数大小的正确指令,例如 movzx ecx,byte [variable]从内存中仅加载单个字节,并将该值零扩展为目标中的完整 32b 值 ecx登记。

关于pointers - 如何获取变量的地址并在 nasm x86 程序集中取消引用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47534020/

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