gpt4 book ai didi

assembly - NASM 为 dd 生成的程序集说明

转载 作者:行者123 更新时间:2023-12-02 22:17:49 28 4
gpt4 key购买 nike

我一直在使用 NASM 在 Linux 中试验汇编,以便我能够理解 loader.s script on OSDev .

我发现有趣的一件事是当使用 dd 声明变量时生成的程序集。我进行了一些测试,并将输出放在下面。本质上,我只是分配不同的数字并查看目标文件(而不是可执行文件)中生成的程序集。

$ cat test1.s
global _start

section .text
dd 0x0

_start:
mov eax, 1
mov ebx, 0
int 80h

$ nasm -f elf test1.s ; objdump -d test1.o

test1.o: file format elf32-i386


Disassembly of section .text:

00000000 <_start-0x4>:
0: 00 00 add %al,(%eax)
...

00000004 <_start>:
4: b8 01 00 00 00 mov $0x1,%eax
9: bb 00 00 00 00 mov $0x0,%ebx
e: cd 80 int $0x80

.

$ cat test2.s
global _start

section .text
dd 0x0
dd 0x5

_start:
mov eax, 1
mov ebx, 0
int 80h

$ nasm -f elf test2.s ; objdump -d test2.o

test2.o: file format elf32-i386


Disassembly of section .text:

00000000 <_start-0x8>:
0: 00 00 add %al,(%eax)
2: 00 00 add %al,(%eax)
4: 05 00 00 00 b8 add $0xb8000000,%eax

00000008 <_start>:
8: b8 01 00 00 00 mov $0x1,%eax
d: bb 00 00 00 00 mov $0x0,%ebx
12: cd 80 int $0x80

.

$ cat test3.s
global _start

section .text
dd 0x0
dd 0x5
dd 0xf

_start:
mov eax, 1
mov ebx, 0
int 80h

$ nasm -f elf test3.s ; objdump -d test3.o

test3.o: file format elf32-i386


Disassembly of section .text:

00000000 <_start-0xc>:
0: 00 00 add %al,(%eax)
2: 00 00 add %al,(%eax)
4: 05 00 00 00 0f add $0xf000000,%eax
9: 00 00 add %al,(%eax)
...

0000000c <_start>:
c: b8 01 00 00 00 mov $0x1,%eax
11: bb 00 00 00 00 mov $0x0,%ebx
16: cd 80 int $0x80

.

$ cat test4.s
global _start

section .text
dd 0x0
dd 0x5
dd 0xf
dd 0x16

_start:
mov eax, 1
mov ebx, 0
int 80h

$ nasm -f elf test4.s ; objdump -d test4.o

test4.o: file format elf32-i386


Disassembly of section .text:

00000000 <_start-0x10>:
0: 00 00 add %al,(%eax)
2: 00 00 add %al,(%eax)
4: 05 00 00 00 0f add $0xf000000,%eax
9: 00 00 add %al,(%eax)
b: 00 16 add %dl,(%esi)
d: 00 00 add %al,(%eax)
...

00000010 <_start>:
10: b8 01 00 00 00 mov $0x1,%eax
15: bb 00 00 00 00 mov $0x0,%ebx
1a: cd 80 int $0x80

我的问题是,为什么我们最初要向 eax 寄存器添加内容,然后随着数据的增长修改其他寄存器,如 edx 和 esi?分配数据不应该使用寄存器,尤其不应该添加它们。为什么我永远看不到正确的变量被放入寄存器(第一个问题的答案可能会回答这个问题)?例如,我在分配 0x5 时看到指令 add $0xb8000000,%eax,但该指令中没有 0x5。

最佳答案

当您使用 dd 0 声明一个 DWORD 时,实际上只是在此时将 4 个字节的零放入输出二进制文件中。当您反汇编二进制文件时,它会将其解释为代码(当您打算将其作为数据时)。 add %al,(%eax) 的操作码恰好是 00 00

关于assembly - NASM 为 dd 生成的程序集说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187390/

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