内核加载到内存但不工作,汇编格式可能是问题所在吗?

Kernel loaded to memory but not working, may assembly format be the issue?

我正在开发一个用于教育目的的简单操作系统。我写了一个简单的内核,作用是直接在显存(0xb8000)中写入,在屏幕上显示一个字符。我正在使用 Qemu 来测试整个过程。内核如下:

void main(){
       char* video_memory=(char*)0xb8000;
       *video_memory='X';
     }

我首先使用以下方法生成目标文件:

gcc -m32 -ffreestanding -c kernel.c -o kernel.o

然后我生成二进制文件使用:

ld -o -m elf_i386 kernel.bin -Ttext 0x1000 kernel.o --oformat binary

当我输入以下命令时:

objdump -d kernel.o

我看到这个输出:

00000000 <main>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    [=14=]x10,%esp
   6:   c7 45 fc 00 80 0b 00    movl   [=14=]xb8000,-0x4(%ebp)
   d:   8b 45 fc                mov    -0x4(%ebp),%eax
  10:   c6 00 58                movb   [=14=]x58,(%eax)
  13:   c9                      leave  
  14:   c3                      ret 

这与 NASM 有点不相似。

但是当我输入以下命令时:

ndisasm -b 32 kernel.bin

我看到这个输出:

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  83EC10            sub esp,byte +0x10
00000006  C745FC00800B00    mov dword [ebp-0x4],0xb8000
0000000D  8B45FC            mov eax,[ebp-0x4]
00000010  C60058            mov byte [eax],0x58
00000013  C9                leave
00000014  C3                ret

这正是我希望生成的内核程序集的样子。

问题是我认为加载的内核是第一个内核程序集的二进制文件。

我尝试使用第二个命令生成的代码在汇编中编写自己的这段内核并且成功了。

如何为第二个程序集而不是第一个程序集生成二进制文件?

提前致谢。

编辑:

我忘了说,当使用 ndisasm 命令时,它显示我生成的程序集有更多无用的程序集命令:

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  83EC10            sub esp,byte +0x10
00000006  C745FC00800B00    mov dword [ebp-0x4],0xb8000
0000000D  8B45FC            mov eax,[ebp-0x4]
00000010  C60058            mov byte [eax],0x58
00000013  C9                leave
00000014  C3                ret
00000015  0000              add [eax],al
00000017  001400            add [eax+eax],dl
0000001A  0000              add [eax],al
0000001C  0000              add [eax],al
0000001E  0000              add [eax],al
00000020  017A52            add [edx+0x52],edi
00000023  0001              add [ecx],al
00000025  7C08              jl 0x2f
00000027  011B              add [ebx],ebx 
00000029  0C04              or al,0x4
0000002B  0488              add al,0x88
0000002D  0100              add [eax],eax
0000002F  001C00            add [eax+eax],bl
00000032  0000              add [eax],al
00000034  1C00              sbb al,0x0
00000036  0000              add [eax],al
00000038  C8FFFFFF          enter 0xffff,0xff
0000003C  1500000000        adc eax,0x0
00000041  41                inc ecx
00000042  0E                push cs
00000043  088502420D05      or [ebp+0x50d4202],al
00000049  51                push ecx
0000004A  C50C04            lds ecx,[esp+eax]
0000004D  0400              add al,0x0
0000004F  00                db 0x00

此外,当使用十六进制编辑器打开 bin 文件时,我得到了不同的内容,第一行应该是相同的,但事实并非如此

"first assembly"和"second assembly"实际上显示的是同一件事。

它们只是同一机器代码的两种不同表示。

查看它们中的第二列数字。这些数字是您的计算机将 运行 的实际机器代码。如果这些数字相同,则代码相同。其他一切都只是一种奇特的展示方式,让人们更容易理解。

所以不,这里的问题不是反汇编的格式。

问题已解决,我的引导加载程序中缺少一些 [bits ##] 指令