2

作为我第一次真正编写汇编,我正在尽最大努力学习本教程。从小处着手,对吧?;)

无论如何......这就是我所拥有的。

[patrick@manifold-arch Assembly]$ cat loader.s
.code16             # we're operating in 16bit real mode
.global begin       # make the begin tag globally accessible

begin:              # traditionally called _start, but who cares?
    jmp begin       # infinite loop!

.fill 510-(.-begin), 1, 0       # pad with zeroes till 510 bytes

凉爽的。

[patrick@manifold-arch Assembly]$ as -o loader.o loader.s
[patrick@manifold-arch Assembly]$ ld -o loader.bin loader.o --oformat binary -e begin --nmagic
[patrick@manifold-arch Assembly]$ ls -lh
total 12K
-rwxr-xr-x 1 patrick patrick  558 Mar 10 11:17 loader.bin
-rw-r--r-- 1 patrick patrick 1.3K Mar 10 11:16 loader.o
-rw-r--r-- 1 patrick patrick  288 Mar 10 10:49 loader.s

首先,我得到了 4k 文件,所以我四处寻找,直到发现--nmagic. 问题解决了。有点儿。我的 .o 文件始终较小,非常有趣。但是,当我将-n标志打到 上ld时,文件大小仍然增加了 48 个字节。

[patrick@manifold-arch Assembly]$ objdump -D -Matt,i386 -b binary -m i386 -ls loader.bin

loader.bin:     file format binary

Contents of section .data:
 0000 04000000 20000000 05000000 474e5500  .... .......GNU.
 0010 020001c0 04000000 00000000 00000000  ................
 0020 010001c0 04000000 01000000 00000000  ................
 0030 ebfe0000 00000000 00000000 00000000  ................
 0040 00000000 00000000 00000000 00000000  ................
 0050 00000000 00000000 00000000 00000000  ................
 0060 00000000 00000000 00000000 00000000  ................
 0070 00000000 00000000 00000000 00000000  ................
 0080 00000000 00000000 00000000 00000000  ................
 0090 00000000 00000000 00000000 00000000  ................
 00a0 00000000 00000000 00000000 00000000  ................
 00b0 00000000 00000000 00000000 00000000  ................
 00c0 00000000 00000000 00000000 00000000  ................
 00d0 00000000 00000000 00000000 00000000  ................
 00e0 00000000 00000000 00000000 00000000  ................
 00f0 00000000 00000000 00000000 00000000  ................
 0100 00000000 00000000 00000000 00000000  ................
 0110 00000000 00000000 00000000 00000000  ................
 0120 00000000 00000000 00000000 00000000  ................
 0130 00000000 00000000 00000000 00000000  ................
 0140 00000000 00000000 00000000 00000000  ................
 0150 00000000 00000000 00000000 00000000  ................
 0160 00000000 00000000 00000000 00000000  ................
 0170 00000000 00000000 00000000 00000000  ................
 0180 00000000 00000000 00000000 00000000  ................
 0190 00000000 00000000 00000000 00000000  ................
 01a0 00000000 00000000 00000000 00000000  ................
 01b0 00000000 00000000 00000000 00000000  ................
 01c0 00000000 00000000 00000000 00000000  ................
 01d0 00000000 00000000 00000000 00000000  ................
 01e0 00000000 00000000 00000000 00000000  ................
 01f0 00000000 00000000 00000000 00000000  ................
 0200 00000000 00000000 00000000 00000000  ................
 0210 00000000 00000000 00000000 00000000  ................
 0220 00000000 00000000 00000000 0000      ..............  

Disassembly of section .data:

00000000 <.data>:
   0:   04 00                   add    $0x0,%al
   2:   00 00                   add    %al,(%eax)
   4:   20 00                   and    %al,(%eax)
   6:   00 00                   add    %al,(%eax)
   8:   05 00 00 00 47          add    $0x47000000,%eax
   d:   4e                      dec    %esi
   e:   55                      push   %ebp
   f:   00 02                   add    %al,(%edx)
  11:   00 01                   add    %al,(%ecx)
  13:   c0 04 00 00             rolb   $0x0,(%eax,%eax,1)
    ...
  1f:   00 01                   add    %al,(%ecx)
  21:   00 01                   add    %al,(%ecx)
  23:   c0 04 00 00             rolb   $0x0,(%eax,%eax,1)
  27:   00 01                   add    %al,(%ecx)
  29:   00 00                   add    %al,(%eax)
  2b:   00 00                   add    %al,(%eax)
  2d:   00 00                   add    %al,(%eax)
  2f:   00 eb                   add    %ch,%bl
  31:   fe 00                   incb   (%eax)
    ...

我看到从 13 到 1f 的零,但那只占 12 个字节,是吗?看起来那个块根本不应该存在,但它仍然不能解释我得到的一切。

当我删除填充时,而不是像作者那样以 4 字节二进制结束,我以 50 字节二进制结束。

我显然做错了什么,它可能只是一面旗帜或什么的。所以我有两个问题:一,我做错了什么?第二:为什么作者得到与我不同的结果(特别是关于页面对齐)?这篇文章来自 2018 年,那么这些命令肯定不是在 32 位机器上运行的吗?我不知道。我只知道我需要一只手。=)

在此先感谢,一如既往。

4

0 回答 0