nasm 忽略 .text 部分中的 vstart=0x7C00

问题描述 投票:0回答:1

我使用的是 NASM 2.16.01,Arch Linux。

我尝试使用

vstart=0x7C00
属性编写引导扇区(8086,IBM PC),以便以下地址计算应该与此相关。

但是,它不起作用,因为所有地址仍然是相对于

0
计算的。这是为什么(我当时不明白NASM文档)?我希望第 33 行中的
jmp 0:$+5
评估为
EA xx7C 0000

我的代码:

     1                                  bits 16
     2                                  ; this is the boot sector which is located on every floppy
     3                                  ; it gets loaded to CS:IP = 07C00h
     4                                          section .text start=0 vstart=0x7C00
     5                                  
     6 00000000 EB3C                            jmp loader
     7 00000002 90                              nop
     8 00000003 52444F5320302E31                oem_name db "RDOS 0.1"
     9 0000000B 0002                            bytes_pro_sector dw 512
    10 0000000D 01                              sectors_per_cluster db 1
    11 0000000E 0100                            reserved_sectors dw 1
    12 00000010 02                              num_fats db 2
    13 00000011 E000                            root_entries_max dw 224
    14 00000013 400B                            num_sectors dw 2880
    15 00000015 F0                              media_desc db 0xF0
    16 00000016 0900                            sectors_per_fat dw 9
    17 00000018 1200                            secs_per_track dw 18
    18 0000001A 0200                            num_heads dw 2
    19 0000001C 000000000000000000-             reserved db 10 dup 0
    19 00000025 00                 
    20 00000026 29                              extended_bpb db 0x29
    21                                  
    22 00000027 FA0E340C                        volid dd 0x0C340EFA
    23 0000002B 4E4F204E414D452020-             volname db "NO NAME    "
    23 00000034 2020               
    24 00000036 4641543132202020                fatid db "FAT12   "
    25                                          
    26                                  loader:
    27 0000003E FA                              cli
    28 0000003F 31C0                            xor ax, ax
    29 00000041 8ED8                            mov ds, ax
    30 00000043 8EC0                            mov es, ax
    31 00000045 8ED0                            mov ss, ax      
    32 00000047 BCFF7E                          mov sp, 7EFFh    ; 256 bytes stack after this code
    33 0000004A EA[4F00]0000                    jmp 0:$+5        ; fix for BIOS that uses 7C0:0 instead of 0:7C00
    
assembly x86 nasm bootloader
1个回答
0
投票

正如 @MichaelPetch 指出的(谢谢!)

nasm
在其代码列表中用
[]
显示可重定位地址,所以

33 0000004A EA[4F00]0000                    jmp 0:$+5

确实在生成的二进制文件中进行了编码

EA 4F 7C 00 00
。 (用
hexdump -C
检查)

但是使用

yasm -p nasm
生成的列表 不显示方括号,直接显示也存储在二进制文件中的正确二进制数据。 (正如人们所期望的那样)。

因此,

nasm
显示的可重定位二进制数据具有误导性,因为二进制文件没有重定位表。

© www.soinside.com 2019 - 2024. All rights reserved.