汇编指令 '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 上的字节会使整个二进制文件变得一团糟。
目前,我正在阅读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 上的字节会使整个二进制文件变得一团糟。