在 x86 asm 的 NASM 语法中,括号是什么意思?

根据以下守则:

L1     db    "word", 0


mov   al, [L1]
mov   eax, L1

[L1]中的括号代表什么?


这个问题是关于 NASM 的。Intel 语法汇编的另一个主要特点是 MASM 风格,当不涉及寄存器时,括号的工作方式是不同的:
请参见 MASM32中的混淆括号

60197 次浏览

[L1]表示地址 L1处的内存内容。在这里运行 mov al, [L1]之后,al寄存器将接收地址 L1(字母‘ w’)的字节。

括号表示取消引用某个地址

mov eax, [1234]

意思是,把地址1234的内容移到东亚交易所,因此:

1234 00001

EAX 将包含00001。

与许多汇编语言一样,这意味着间接。换句话说,第一个 mov加载 al时使用的是 L1内容(换句话说就是字节 'w') ,而不是地址。

第二个 mov实际上加载 eax地址 L1,稍后您可以取消引用它来获取或设置其内容。

在这两种情况下,从概念上讲,L1都被认为是地址。

它们意味着不是将寄存器值或数值 L1移动到寄存器 al中,而是将寄存器值或数值 L1作为指向内存的指针,获取该内存地址的内容,并将该内容移动到 al中。

在这个例子中,L1是一个内存位置,但是如果在括号中有一个寄存器名称,那么同样的逻辑也适用:

mov al, [ebx]

也叫负载。

它指示寄存器应该用作指向实际位置的指针,而不是作用于寄存器本身。

直接内存地址 -al将加载位于内存地址 L1的值。

简单地说,就是在标签 L1标记的地址处获取内存。

如果你喜欢 C,可以这样想: [L1]*L1是一样的

这种类型的操作数,如 [ebp],称为 内存操作数

这里的所有答案都是好的,但是我看到没有人告诉我们遵循这个严格规则的注意事项—— 如果括号,则取消引用除了 lea指令

lea是上述规则的一个例外

mov eax, [ebp - 4]

ebp的值减去4,括号表示结果值作为地址,位于该地址的值存储在 eax中。然而,在 lea的例子中,括号并不意味着:

lea eax, [ebp - 4]

ebp的值减去4,得到的值存储在 eax中。这条指令只计算地址并将计算出的值存储在目标寄存器中。详情请参阅 MOV 和 LEA 的区别是什么?

在 MASM 中,当与寄存器一起使用时,括号的工作方式与 NASM 类似,在这种情况下不是可选的。(不涉及寄存器的寻址模式有所不同,参见 MASM32中的混淆括号)

括号表示寄存器包含一个指针,并且机器代码需要该指针的值(指针是字节寻址的: 指针是内存的第 x 个字节; 一个字节是8个二进制数字; 一个十六进制数字是4个二进制数字; 因为一个字节是2个十六进制数字; 从那里开始) ; 如果它在指令的 src 部分。

  • 但是,如果 dst 有括号: 该地址的内存是指令的操作数。(前面提到的“字节寻址”指针中的内存。)< br > < br >

在二进制机器码中,(在 notepad.exe 中输入十六进制数字,然后将十六进制数字转换为十六进制结果 ~ python _ reference)以获得寄存器中指针的值,它可以定义在将要在 notepad.exe 中编写的指令的 ModR/M 字节中,我相信它是10个字符。(我将先完成我的 MASM 体验,然后我将通过阅读 windows 的内核/恶意软件分析来获取有关输入到 note pad.exe 中的内容的信息; 我将回到这篇文章并写一个例子)

1 .686
2 .model flat, c
3 option casemap :none
4
5 include C:\masm32\include\kernel32.inc
6 includelib C:\masm32\lib\kernel32.lib
7
8 .data
9     message db "Hello world!", 0
10 .code
11
12 main proc
13  call testfunc
14  COMMENT @
15  push 0FFFFh
16  push testfunc
17  pop ax
18  @
19  invoke ExitProcess, 404
20 main ENDP
21
22 testfunc proc
23  sub esp, 1
24  mov al, 0FFh
25  mov [esp], al
26  COMMENT @
27  push 0FFFFh
28  push 05EFFB880h
29  push 0773BFF5Ch
30  push 0FB038Fh
31  mov al, [esp+8]
32  @
33  invoke ExitProcess, [esp]
34 testfunc ENDP
35
36 END main

视窗:
如果您输入执行这个命令的结果,并比较:

C: masm32 bin ml/c/Zd/coff script _ name. asm
C: masm32 bin Link/SUBSystem: CONSOLE script _ name. obj
Script _ name. exe
回声% 错误级别% < br >

程序的退出状态(用 echo打印)是存储在堆栈内存中的数字,mov [esp], al作为参数指向 ExitProcess,以十六进制 FF 结尾。(%ERRORLEVEL%将该数字转换为一个十进制数字字符串,而不是十六进制,但它们是同一个数字。)

但是,如果 [esp]周围没有 []: 我们还必须将 AL 更改为 EAX (因为 x86 CPU 没有将8位寄存器移动到32位寄存器底部的指令)。并删除上次在代码行中使用字母“ esp”时的括号; 这将导致指向 esp 中堆栈区域的指针。

1 testfunc proc
2   mov eax, esp
3   mov bl, 0FFh
4   mov [eax], bl
5   COMMENT @
6   push 0FFFFh
7   push 05EFFB880h
8   push 0773BFF5Ch
9   push 0FB038Fh
10  mov al, [esp+8]
11  @
12  invoke ExitProcess, [esp]
13 testfunc ENDP

标记: 可选的括号

上面的代码证明了方括号 ALWAYS WORK (使用任何代码中的值作为指针并得到指针的值)在语言中以可读的方式解释机器代码,而不是字节,并且知道 Windows 内核将如何执行一个 exe 文件(反向工程窗口的内核从头开始在笔记本中创建自己的 exe 文件,这在笔记本中没有足够的支持; 然而,恶意软件分析确实有足够的支持)

(如果你想测试代码: 在最后一段代码中用 testfunc 替换行,并用相同的方式执行它) : 在这种情况下,eax 等于堆栈段内存中 esp 的指针(堆栈段很重要,因为它有自己的指令: 从/到一个即时、寄存器或内存操作数的 PUSH 和 POP 32位值)。所以当您执行它时,裸 esp操作数是 ESP 寄存器的值,一个指针值,而不是堆栈上的内存内容。


我会偶尔回来编辑这篇文章(如果我真的很擅长汇编的话)因此,这可以是一个终极指南,组装。我刚开始在汇编和作出一个最重要的位查找器在一个特定的范围脚本在汇编快速长度。

到目前为止帮助我编写这个脚本的资源:
5小时完整 C + + 教程: < br >

  • Https://www.youtube.com/watch?v=vlnpwxzdw4y&ab_channel=freecodecamp.org

    我建议在这之后做一个学习 HTML/CSS/JS 和制作一个计算器网站(将 HTML 文件拖放到 Microsoft Edge)的寻宝游戏,以及编写一个视频游戏如 Understory (将 HTML 文件拖放到 Microsoft Edge)的寻宝游戏,然后学习 Python 3只是为了开玩笑。

帮助我找出什么东西像 DWORD (无符号长)。
Https://www.bing.com

  • 请阅读英特尔软件开发人员手册,它告诉你一些东西,比如如果你改变内存中的一个位置,它被称为命令寄存器的高级可编程中断控制器将在另一个核心,即 CPU 中执行代码。你不需要记住,我只是建议你把所有内容都重写成文本,然后创建一个脚本,在你创建一个文本的每一个新的部分中搜索一个单词。我甚至没有从这本书中记住任何东西,我只是知道一些我脑海中常识的部分,我希望你会知道更多的东西给读者。

我读到第三卷的一半,然后浏览了剩下的部分
Https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html

  • 我看了一些 https://www.youtube.com/c/WhatsACreel的视频,因为我正在写一章,在阅读之间有30天的休息时间,所以我可以更好地理解。我也建议这样做,但我不知道如何告诉你什么时候停下来,质疑你看视频的想法; 我很抱歉。

Davy Wybrial 的汇编语言教程: Https://www.youtube.com/watch?v=wlxiwkuwpss&ab_channel=davywybiral
英特尔软件开发者手册中的“操作部分”:

  • 括号内的寄存器名称表示寄存器中包含其地址的位置的内容

如何在 Windows 上开始编码汇编(MASM)
Https://www.youtube.com/watch?v=lcjbwlelnfs&ab_channel=charlesclayton

再一次,我将回到这里(这篇文章,以及我未来的文章) ,并试图教育每个人,这样我的知识与每个人的阅读是平等的。