【问题标题】:Explanation of assembly generated by NASM for ddNASM 为 dd 生成的程序集说明
【发布时间】:2012-12-20 16:14:57
【问题描述】:

我一直在用 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。

【问题讨论】:

    标签: assembly nasm cpu-registers


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您在 .text 部分中声明了这些变量,这就是发生这些添加的原因,要摆脱它,只需声明 .data 部分,这些额外的添加将不会发生。

      【讨论】:

        猜你喜欢
        • 2012-03-16
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        • 2021-08-09
        • 2020-07-26
        相关资源
        最近更新 更多