汇编指令 'jmpi' 在我的代码中不起作用

Assembly instruction 'jmpi' is not work in my code

目前,我正在阅读Linux v0.01 内核源代码。我正在尝试模仿代码并使其工作。但是卡在引导区的最开始。 在bootsect.s中,程序首先加载到0x7c00并将自身移动到0x90000,然后跳转到0x90000,但不知何故'jmpi'指令不起作用。

SETUPLEN = 4                 ! len of setup-sectors, 4 sectors
BOOTSEG  = 0x07c0            ! original address of boot sector
INITSEG  = 0x9000            ! move bootsect here
SETUPSEG = 0x9020            ! setup starts here
SYSSEG   = 0x1000            ! system loaded at 0x10000 (65536)
ENDSEG   = SYSSEG + SYSSIZE  ! where to stop loading

entry start
start:
    mov ax, #BOOTSEG
    mov ds, ax
    mov ax, #INITSEG
    mov es, ax
    mov cx, #256
    sub si, si
    sub di, di
    rep
    movw                       ! move bootsect itself to address 0x90000  (256 * 2 Bytes)
    jmpi go, INITSEG           ! jump to address 0x90000 and execute
    !j go

go:
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, #0xFF00            ! Top of the stack - ss:sp address is 0x9FF00
    
    ! print something
    mov ah, #0x03             ! read cursor pos
    xor bh, bh
    int 0x10
    
    mov cx, #7
    mov bx, #0x0007           ! page 0, attribute 7 (normal)
    mov bp, #msg
    mov ax, #0x1300           ! write string, move cursor
    int 0x10
 msg:
    .byte 13,10
    .ascii "!"
    .byte 13,10,13,10

还有一件事我想提一下,如果我用 'j go' 替换 'jmpi go, INITSEG',它肯定会工作并跳转到标签 'go',但有些奇怪的是屏幕上打印的字符不是我预期的 '!',而是显示 "≡S"

我不确定 'jmpi' 是否完全不起作用,或者只是因为 print(0x10) 函数有问题,所以我在屏幕上看不到任何东西。

我是汇编语言的初学者,我不知道代码中有什么问题,甚至代码几乎都是从Linux内核中复制的。

问题已解决!

我正在使用 as86 和 ld86 进行编译 link。为了使其可启动,我尝试将 510 和 511 字节设置为 0xAA 和 0x55。我预计二进制文件只有 512 个字节,重写 510 和 511 个字节就可以了。

但实际上,二进制文件前面有32字节的MINIXheader,使得二进制文件的总大小为544字节。重写 510&511 上的字节会使整个二进制文件变得一团糟。