簡體   English   中英

在引導加載程序中 JMPing 到 0x7C00 不會導致無限循環

[英]JMPing to 0x7C00 in bootloader does not cause infinite loop

我正在創建一個引導加載程序,並想通過跳轉到地址 0x7C00 來創建一個無限循環。

由於引導加載程序加載到 0000:7C00,我希望當我調用JMP 0x7C00時,代碼將 go 到程序的開頭。 除了它調用代碼一次,就是這樣。

這是我的代碼:

  1 BITS 16
  2 ORG 0x7C00
  3 
  4 MOV AX, 0
  5 MOV DS, AX
  6 MOV SI, 0x7C00
  7 
  8 LEA BX, [msg]
  9 
 10 printMsg:
 11   MOV AL, [BX]
 12   INC BX
 13   CMP AL, 0
 14   JZ return
 15   CALL printc
 16   JMP printMsg
 17 JMP 0x7C00
 18   
 19 printc:
 20   MOV AH, 0Eh
 21   int 10h
 22   RET
 23 
 24 return:
 25   RET
 26 
 27 
 28 msg: db "Hello",0
 29 
 30 times 510-($-$$) db 0x90
 31 dw 0xAA55

我還嘗試在第 3 行創建start label 並在第 17 行創建CALL startJMP start 。但這似乎都不起作用。

您不call printMsg ,因此返回時的RET return:將無處可至 go。 此外,您的jmp 0x7c00位於錯誤的位置,無法訪問。

此外,正如彼得所說,您不能保證擁有CS:IP = 0000:7C00它可能是07C0:0000 ,具體取決於 BIOS 實現。 盡管如此,使用ORG 0x7C00指令,NASM 會將jmp 0x7c00組裝成一個相對跳轉,就像您將 label 放在文件頂部一樣。 但實際上,您首先應該這樣做。

因此,固定版本可能如下所示:

BITS 16
ORG 0x7C00

start:

XOR AX, AX
MOV DS, AX

; you could also put the start label here
; no need to reload DS
LEA BX, [msg]
CALL printMsg
JMP start

printMsg:
  MOV AL, [BX]
  INC BX
  TEST AL, AL
  JZ return
  CALL printc
  JMP printMsg
return:
  RET

printc:
  MOV AH, 0Eh
  int 10h
  RET

msg: db "Hello",0

times 510-($-$$) db 0x90
dw 0xAA55

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM