x86 - 已编译引导加载程序的大小错误

标签 x86 nasm bootloader yasm

我正在制作一个引导加载程序,但它生成一个 513 字节的输出文件,而它应该是 512 位。这是 boot.asm

[ORG 7C00]
[BITS 16]
mov eax,cr0
or eax,1
mov cr0,eax
[BITS 32]
mov ax,10h
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
INT 0x10
jmp 0x8000
TIMES 510 - ($ - $$) DB 0
DW 0xAA55

如何获得 512 字节的输出?

最佳答案

您遗漏了 0x来自 7C00您的 ORG 中的十六进制常量指令。 NASM 将此视为错误。

你可能用 YASM 组装了它,它不会拒绝你的源代码,而是生成一个 513 字节的文件 .修复源代码会使 YASM 和 NASM 生成一个 512 字节的文件。 这可能是 YASM 中的一个错误 .不幸的是 YASM 最近没有得到很好的维护,所以即使它有更好的长期 NOP 来自 align指令(不是用多行单字节 NOP 进行膨胀反汇编),您可能应该切换到 NASM。

$ yasm boot-buggy.asm && ll boot-buggy
-rw-r--r-- 1 peter peter 513 Mar 13 06:03 boot-buggy
$ nasm boot-buggy.asm && ll boot-buggy
boot-buggy.asm:1: error: expression syntax error
boot-buggy.asm:1: error: No or invalid offset specified in ORG directive.
$ nasm boot-fixed.asm && ll boot-fixed
-rw-r--r-- 1 peter peter 512 Mar 13 06:04 boot-fixed
$ yasm boot-fixed.asm && ll boot-fixed
-rw-r--r-- 1 peter peter 512 Mar 13 06:04 boot-fixed

cmp -l boot-fixed boot-buggy显示错误版本有一个额外的 0 byte 作为文件的第一个字节,那么其余的都是一样的。

关于x86 - 已编译引导加载程序的大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55125687/

相关文章:

linux - 汇编程序中的插入排序不起作用

linux - 从 RaspberryPi3 上的 U-boot 获取 SD 卡序列号/oemid

c - C 中高效的大端字节数组到 native 整数转换

assembly - 实模式中断处理例程未按预期工作

assembly - 不能在 NASM 中包含文件

linux - Nasm 代码在 windows 上运行但在 linux 上不运行

Cortex M0+ 跳转到用户应用程序失败

assembly - 这些特定的汇编指令(使用 db 和 dw)如何导致计算机重新启动?

c++ - 硬件事务内存 : _xbegin() return 0

assembly - 我怎样才能将两个数字相加,每个数字有 12 个字节?